2017-06-22 5 views
0

Ich erstelle Bericht mit iText 5.1.2. Ich habe zwei PDF-Dokumente. Zuerst habe ich eine Tabelle, in die ich den ganzen Inhalt des zweiten PDF-Dokuments einfügen möchte. Jede Seite ist eine separate Zelle in der Tabelle.Hinzufügen eines PDF-Dokuments zur Tabelle

Meine aktuelle Lösung funktioniert nicht immer wie erwartet. Problem ist, dass für einige PDFs, wenn ich sie zur Tabelle hinzufüge, ihre Seiten um 90 Grad gedreht sind.

Das ist, was ich habe jetzt:

//First document with table 
ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 
Document pdfDocument = new Document(PageSize.A4, 60, 30, 120, 120); 
PdfWriter pdfWriter = PdfWriter.getInstance(pdfDocument, buffer); 
Rectangle pdfRectangle = pdfDocument.getPageSize(); 
pdfDocument.open(); 


PdfPTable table = new PdfPTable(1); 
table.setTotalWidth(pdfRectangle.getWidth() - pdfDocument.leftMargin() - pdfDocument.rightMargin()); 
table.setWidthPercentage(100); 
table.setSplitLate(false); 

pdfDocument.add(table); 

//other PDF document 
InputStream otherPdfStream = ... 
PdfReader pdfReader = new PdfReader(otherPdfStream); 

int numberOfPages = pdfReader.getNumberOfPages(); 
for (int pageNumber = 1; pageNumber <= numberOfPages; pageNumber++) { 
    PdfImportedPage pdfImportedPage = pdfWriter.getImportedPage(pdfReader, pageNumber); 
    Image image = Image.getInstance(pdfImportedPage); 
    table.addCell(image); 
} 

... 

pdfDocument.close(); 
pdfWriter.close(); 

Ich versuchte PdfCopy aber ich nur beschädigte Datei bekommen jetzt zu verwenden.

ByteArrayOutputStream atiStream = new ByteArrayOutputStream(); 
PdfDocument atiDocument = new PdfDocument(); 
PdfCopy copy = new PdfCopy(atiDocument, atiStream); 

... 

for (int pageNumber = 1; pageNumber <= numberOfPages; pageNumber++) { 
    PdfImportedPage pdfImportedPage = copy.getImportedPage(pdfReader, pageNumber); 
    Image image = Image.getInstance(pdfImportedPage); 
    table.addCell(image); 
} 
+0

Die Version von iText, die Sie verwenden, stammt vom 15. August 2011. Warum sollten Sie nicht auf eine neuere Version upgraden? Ihr 'PdfCopy'-Code ist unvollständig und verwirrend. Warum würden Sie eine 'Tabelle' im Kontext von' PdfCopy' erstellen? 'PdfCopy' dient zum Zusammenführen von Dokumenten, nicht zum Erstellen von Dokumenten mit Tabellen. Seiten haben eine Dimension (ausgedrückt als "Rectangle" und eine Rotation (ausgedrückt als ein Wert, der ein Vielfaches von 90 ist). Ich sehe nicht, dass Sie diese Rotation irgendwo berücksichtigen. Außerdem: Ihr Problem ist in der Dokumentation beschrieben; Hast du es gelesen? –

+0

Die Umstellung auf die neue Version ist jetzt leider keine Option Tabelle wurde im ersten Dokument hinzugefügt, sorry, das habe ich im Code-Snippet verpasst. Ich habe gerade _pdfDocument.add (table); _ hinzugefügt. Ich habe Beispiele gesehen Ich versuche, den Inhalt eines PDF-Dokuments in die Tabelle einzufügen, die zu einem anderen PDF-Dokument hinzugefügt wurde –

+0

Ich glaube nicht, dass wir viele Kunden haben, die immer noch iText 5.1.2 verwenden Sie sind ein Kunde? Wenn nicht, sind Sie sicher, dass der Kontext Ihres Projekts die kostenlose Nutzung von iText erlaubt? –

Antwort

0

Das Problem, das Sie beschreiben in chapter 6 des zweiten "iText in Action" Buch diskutiert wird.

Siehe Abschnitt 6.2.1, und werfen Sie einen Blick auf Abbildung 6.1, wo man zwei verschiedene Dokumente sehen, die jeweils eine Tabelle mit importierten Seiten enthält.

enter image description here

In einem der PDF-Dateien sind die importierten Seiten in der Landschaft; in der anderen sind sie im Porträt.

Was ist der Unterschied?

Nun wurde ein PDF mit dem Code erstellt, die mehr oder weniger wie das Ihre aussieht: ImportingPages1. In diesem Code berücksichtigen Sie die Rotation nicht.

Die andere PDF wird ImportingPages2 erstellt mit:

PdfReader reader = new PdfReader(MovieTemplates.RESULT); 
int n = reader.getNumberOfPages(); 
PdfImportedPage page; 
PdfPTable table = new PdfPTable(2); 
for (int i = 1; i <= n; i++) { 
    page = writer.getImportedPage(reader, i); 
    table.getDefaultCell().setRotation(-page.getRotation()); 
    table.addCell(Image.getInstance(page)); 
} 
document.add(table); 

In diesem Beispiel haben wir die Rotation der Zelle verändern, genauer gesagt, wir zurückdrehen, so wie wir eine Uhr zurückdrehen würde.

Update: als Alternative für page.getRotation(), können Sie reader.getPageRotation(i) verwenden.

+0

Ich wollte das verwenden, leider habe ich _getRotation() _ method auf PdfImportedPage.Gibt es eine Möglichkeit, dies mit iText-Version zu tun, die ich benutze oder nur Option ist, auf die neueste Version zu aktualisieren? –

+0

Ich werde meine Antwort aktualisieren, so dass Sie es akzeptieren können. –

+0

Vielen Dank! Es hilft bei der Rotation. –

Verwandte Themen