2016-04-08 1 views
0

PDF with PdfPTable and PdfPCellWie PdfPTable sagen, dass PdfPCells, um dieses PDF-Dokument dynamisch zeigte wird nach freier Speicherplatz auf PdfPTable

Ich habe, dass ich mit IText in Java gemacht. Das PDF-Dokument enthält Daten, die über PDFPTable-Objekte hinzugefügt werden.

Das 'Problem' ist, dass, wenn ich mehr Daten habe dann passt auf eine PDF-Seite, die Daten auf der nächsten Seite gerendert werden, so dass ich mit leerem Platz auf der ersten Seite. (Siehe das Bild 'Problem' Seite).

Ich möchte diese leeren Räume mit 'PDFPCell'-Objekt gefüllt haben, siehe' Lösung '(diese PdfPCell-Objekte enthalten eine weitere PdfPTable, die Daten in dieser PdfPTable dürfen nicht auf der nächsten Seite der PDF' fortgesetzt 'werden es passt nicht).

Dies ist ein kleines Beispiel in Code:

PdfPTable outerTable = new PdfPTable(1); 
outerTable.setHorizontalAlignment(Element.ALIGN_LEFT); 
outerTable.setWidthPercentage(100); 

int i = 0; 
while (i < 5) 
{ 
    i++; 
    PdfPTable innerTable = new PdfPTable(new float[] {0.25f, 0.25f, 0.25f, 0.25f}); 
    innerTable .setHorizontalAlignment(Element.ALIGN_LEFT); 
    innerTable .setWidthPercentage(100); 

    PdfPCell cell = new PdfPCell(innerTable); 
    cell.setPadding(0); 

    innerTable.addCell(new Phrase("test Data")); 
    innerTable.addCell(new Phrase("test Data")); 
    innerTable.addCell(new Phrase("test Data")); 
    innerTable.addCell(new Phrase("test Data")); 

    outerTable.addCell(cell); 
} 

document.add(outertable); 
document.close(); 
+0

Ihr Beispiel reproduziert das Problem nicht und Ihre Frage zeigt, dass Sie die Dokumentation nicht gelesen haben. –

+0

@BrunoLowagie Wenn es in der Doku ist, können Sie den Artikel verlinken? – Igoranze

+0

OK, ich habe übersehen, dass Sie einen Teil des Inhalts löschen wollen. Das ist sehr ungewöhnlich. Ich weiß nicht, ob dies möglich ist, wenn Sie verschachtelte Tabellen und 'document.add()' verwenden. Es ist eher etwas, was Sie mit separaten Tabellen und 'ColumnText' machen würden. –

Antwort

1

Bitte nehmen Sie sich einen Blick auf das DropTablePart Beispiel. In diesem Beispiel füge ich einem Objekt ColumnText 4 Tabellen mit 19 Zeilen hinzu. Sobald eine Tabelle nicht auf die Seite passt, lösche ich den restlichen Inhalt des Objekts ColumnText (wodurch der Rest der Tabelle automatisch gelöscht wird) und ich beginne eine neue Seite, auf der eine neue Tabelle gestartet wird.

Entweder:

ct = new ColumnText(writer.getDirectContent()); 

Oder:

ct.setText(null); 

Das Ergebnis sieht wie folgt aus:

den Inhalt des ColumnText Objekt Dropping kann auf zwei verschiedene Arten erfolgen

enter image description here

Wie Sie sehen können, Zeilen 10 bis 18 werden von der inneren Tabelle gelöscht 3.

Dies ist der vollständige Code:

public void createPdf(String dest) throws IOException, DocumentException { 
    Document document = new Document(); 
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest)); 
    document.open(); 
    Rectangle column = new Rectangle(36, 36, 559, 806); 
    ColumnText ct = new ColumnText(writer.getDirectContent()); 
    ct.setSimpleColumn(column); 
    for (int i = 0; i < 4;) { 
     PdfPTable table = new PdfPTable(new float[]{0.25f, 0.25f, 0.25f, 0.25f}); 
     table.setHorizontalAlignment(Element.ALIGN_LEFT); 
     table.setWidthPercentage(100); 
     PdfPCell cell = new PdfPCell(new Phrase("inner table " + (++i))); 
     cell.setColspan(4); 
     table.addCell(cell); 
     for (int j = 0; j < 18; j++) { 
      table.addCell(new Phrase("test Data " + (j + 1) + ".1")); 
      table.addCell(new Phrase("test Data " + (j + 1) + ".1")); 
      table.addCell(new Phrase("test Data " + (j + 1) + ".1")); 
      table.addCell(new Phrase("test Data " + (j + 1) + ".1")); 
     } 
     ct.addElement(table); 
     if (ColumnText.hasMoreText(ct.go())) { 
      document.newPage(); 
      ct = new ColumnText(writer.getDirectContent()); 
      ct.setSimpleColumn(column); 
     } 
    } 
    document.close(); 
} 

ich nicht verschachtelte Tabellen verwendet haben, weil es in der Regel eine schlechte ist Idee, geschachtelte Tabellen zu verwenden. Dies wirkt sich negativ auf die Leistung Ihrer Anwendung aus und führt in der Regel zu schwer zu pflegenden Code (die Programmierer, die unsere Anwendung erben, werden Ihnen danken, dass sie keine verschachtelten Tabellen verwenden).

+0

Danke, aber es ist nicht das, was ich brauche. Jedenfalls habe ich es mit {dataTable.setHeaderRows (1); dataTable.setSkipFirstHeader (true);} Auf der nächsten Seite wird meine erste Kopfzeile "Continue" angezeigt. Das ist gut genug. +1 für deine Zeit – Igoranze

Verwandte Themen