2016-11-25 8 views
-1

Ich verwende iText und eine dynamische Tabelle erstellen, die createTabularHeader einen einen reoccurring-Header in der Methode hat:Verwenden Sie verschiedene Tabellenkopf auf der ersten Seite

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

Doch auf der ersten Seite würde ich verschiedene Informationen angezeigt werden möchten. (aber die Tabellenstruktur/Größe bleibt gleich)

Aufgrund des dynamischen Inhalts, der in einer anderen Methode erhalten wird, kann ich nicht sagen, wann eine neue Seite beginnt.

Ich versuchte mit der primitivsten Variante - nur ein weißes Rechteck über den Text hinzufügen und den anderen Text einfügen. Da es nur auf der ersten Seite ist, muss ich nur das Rechteck zwischen beiden Methoden erstellen. Aber das weiße Rechteck hat keine Deckkraft und kann alles abdecken.

Doch durch Herumprobieren fand ich die Methode writer.getDirectContent().setColorStroke(BaseColor.WHITE);, die den Text auf weiß gesetzt. Später habe ich einfach die BaseColor meiner Zellen manuell auf schwarz gesetzt. Aber obwohl der neue Text nach dem Aufruf meiner createTabularHeader -Methode angewendet wird, befindet sich seine Ebene unter der Ebene des Originaltextes und die Buchstaben decken den neuen Text teilweise ab.

Verwendung der Antwort auf How to insert invisible text into a PDF? brachte mich auf die Idee der Verwendung myPdfContentByte.setTextRenderMode(PdfContentByte.TEXT_RENDER_MODE_INVISIBLE); war nicht so hilfreich, wie es nur auf der zweiten Seite zurückgesetzt, egal was ich tue und der reguläre Text auf der ersten Seite bleibt unsichtbar.

Ich kann keine richtige Lösung finden ... Wie kann der Tabellenheader nur auf der ersten Seite geändert werden?

Antwort

0

Die Lösung ist nicht wirklich nett, aber funktioniert ... und als eine Art Bonus möchte ich hinzufügen, wie Sie die Einrückungen auf der ersten Seite ändern können.

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); 
     } 
    } 
} 

Die PDFHead wird verwendet, um einen regulären Header (die, die auf jeder Seite angezeigt wird, nicht nur auf Seiten der Tabelle) zu erstellen:

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; 
} 

Und in diesem Header-Ereignis verwende ich die Tatsache, dass die Funktion aufgerufen wird, nachdem das PDF im Wesentlichen erstellt wurde (z. B. für die Seitennummer):

@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); 
    } 
} 
Verwandte Themen