2016-11-25 8 views
-1

Я использую IText и создать динамическую таблицу, которая имеет повторяющиеся заголовок в методе createTabularHeader:Использование другой таблицы заголовка на первой странице

PdfPTable table = new PdfPTable(6); 
// fill it with some basic information 
table.setHeaderRows(1); 

Еще на первой странице я хотел бы, чтобы отобразить различную информацию. (но структура таблицы/размер остается неизменной)

Из-за динамического содержимого, которое получается другим способом, я не могу сказать, когда начинается новая страница.

Я пробовал с самым примитивным вариантом - просто добавив белый текст над текстом и вставив другой текст. Как только на первой странице все, что мне нужно сделать, это создать этот прямоугольник между обоими методами. Но белый прямоугольник не имеет прозрачности и может «покрыть все».

Тем не менее, пытаясь найти метод writer.getDirectContent().setColorStroke(BaseColor.WHITE);, который устанавливает текст в белый цвет. Позже я просто установил BaseColor моих ячеек вручную на черный. Но даже при том, что новый текст применяется после вызова моего метода createTabularHeader, его слой находится под слоем исходного текста, а буквы частично покрывают новый текст.

Использование ответа на вопрос How to insert invisible text into a PDF? привело меня к идее использования myPdfContentByte.setTextRenderMode(PdfContentByte.TEXT_RENDER_MODE_INVISIBLE); не было так полезно, поскольку оно сбрасывается только на 2-й странице независимо от того, что я делаю, и обычный текст на первой странице остается невидимым.

Я не могу найти правильное решение ... Как изменить заголовок таблицы только на первой странице?

ответ

0

Решение не очень приятно, но работает ... и в качестве своего рода бонуса я хочу добавить, как вы можете изменить отступы на первой странице.

public void createPdf() { 
    document = new Document(); 
    try { 
     PdfWriter writer = PDFHead.getWriter(document); 
     //If it's a letter we have a different indention on the top 
     if (letterPDF) { 
      document.setMargins(36, 36, 100, 36); 
     } else { 
      document.setMargins(36, 36, 36, 36); 
     } 
     document.open(); 
     document.add(createTabularContent()); 
     document.close(); 

    } catch (DocumentException | FileNotFoundException ex) { 
     try { 
      document = new Document(); 
      PdfWriter.getInstance(document, new FileOutputStream(FILENAME)); 
      document.open(); 
      document.add(new Phrase(ex.getLocalizedMessage())); 
      document.close(); 
      Logger.getLogger(Etikette.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (FileNotFoundException | DocumentException ex1) { 
      Logger.getLogger(Etikette.class.getName()).log(Level.SEVERE, null, ex1); 
     } 
    } 
} 

PDFHead используется для создания обычного заголовка (тот, который появляется на каждой странице, а не только на страницах с таблицей):

public static PdfWriter getWriter(Document document) throws FileNotFoundException, DocumentException { 
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename)); 
    HeaderFooter event = new HeaderFooter("Ing. Mario J. Schwaiger", type + " " + DDMMYYYY.format(new java.util.Date()), 835, isLetterPDF(), customerNumber); 
    writer.setBoxSize("art", new Rectangle(36, 54, 559, 788)); 
    writer.setPageEvent(event); 
    return writer; 
} 

И в этом HeaderFooter-Event Я использую факт, вызванный функцией после создания PDF-файла (например, для номера страницы):

@Override 
    public void onEndPage(PdfWriter writer, Document document) { 
     if (isLetter) { 
      //That's only for the first page, apparently 1 is too late 
      //I'm open for improvements but that works fine for me 
      if (writer.getPageNumber() == 0) { 

      //If it's a letter we use the different margins 
      document.setMargins(36, 36, 100, 36); 
      } 
      if (writer.getPageNumber() == 1) { 
      PdfContentByte canvas = writer.getDirectContent(); 

      float llx = 460; 
      float lly = 742; 

      float urx = 36; 
      float ury = 607; 

      //As I add the rectangle in the event here it's 
      //drawn over the table-header. Seems the tableheader 
      //is rendered afterwards 
      Rectangle rect1 = new Rectangle(llx, lly, urx, ury); 
      rect1.setBackgroundColor(BaseColor.WHITE); 
      rect1.setBorder(Rectangle.NO_BORDER); 
      rect1.setBorderWidth(1); 
      canvas.rectangle(rect1); 

      ColumnText ct = new ColumnText(canvas); 
      ct.setSimpleColumn(rect1); 
      PdfPTable minitable = new PdfPTable(1); 
      PdfPCell cell = PDFKopf.getKundenCol(PDFHeader.getCustomer(customerNumber)); 
      cell.setBorder(Rectangle.NO_BORDER); 
      minitable.addCell(cell); 

      //A single cell is not accepted as an "Element" 
      //But a table including only a single cell is 
      ct.addElement(minitable); 
      try { 
       ct.go(); 
      } catch (DocumentException ex) { 
       Logger.getLogger(HeaderFooter.class.getName()).log(Level.SEVERE, null, ex); 
      } 

     //In any other case we reset the margins back to normal 
     //This could be solved in a more intelligent way, feel free 
     } else { 
      document.setMargins(36, 36, 36, 36); 
     } 
    } 

    //The regular header of any page... 
    PdfPTable table = new PdfPTable(4); 

    try { 
     table.setWidths(new int[]{16, 16, 16, 2}); 
     table.setWidthPercentage(100); 

     table.setTotalWidth(527); 
     table.setLockedWidth(true); 

     table.getDefaultCell().setFixedHeight(20); 
     table.getDefaultCell().setBorder(Rectangle.BOTTOM); 
     table.addCell(header); 
     PdfPCell cell; 

     cell = new PdfPCell(new Phrase(mittelteil)); 
     cell.setHorizontalAlignment(Element.ALIGN_CENTER); 
     cell.setBorder(Rectangle.BOTTOM); 
     table.addCell(cell); 

     table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); 
     table.addCell(String.format("Page %d of ", writer.getPageNumber())); 
     cell = new PdfPCell(Image.getInstance(total)); 
     cell.setBorder(Rectangle.BOTTOM); 
     table.addCell(cell); 
     table.writeSelectedRows(0, -1, 34, y, writer.getDirectContent()); 
    } catch (DocumentException de) { 
     throw new ExceptionConverter(de); 
    } 
}