2016-04-14 6 views
0

Ich verwende iText 4.2.1, um meine PDF-Berichte zu generieren. Also im Grunde habe ich eine PDF-Vorlage, die ein Deckblatt, eine Endseite und eine Inhaltsseite enthält (die nur einen Bildkopf enthält).iText - Persistenz von Seitenstempel in PdfCopy

Ich verwende PdfCopy & PdfImportedPage meine Vorlage und PageStamp meine Inhalte zu kopieren dynamisch hinzuzufügen.

Notwendigkeit: Ich muss die Inhaltsseite oft verwenden: so viel wie Inhaltsseiten in meinem Bericht.

Problem: Wenn ich pdfCopy.createPageStamp (importedPage) und ColumnText.showTextAligned etwas Text addieren die Stempel in den nächsten Content-Seiten bestehen. So enthält meine Inhaltsseite Nr. 2 den Text des ersten (hinzugefügt von PageStamp) und seinen eigenen Text (hinzugefügt durch einen anderen PageStamp). Hier

ist ein Beispiel für den Code ein:

 

    // Init 
    Document doc = new Document(); 
    PdfCopy pdfCopy = new PdfCopy(doc, new FileOutputStream(new File("Result.pdf"))); 
    doc.open(); 
    PdfReader pdfReader = new PdfReader("pdf-template.pdf"); 

    // Page 1 
    PdfImportedPage importedPage1= pdfCopy.getImportedPage(pdfReader, 2); 
    String text1= "Text of the first page - 1"; 
    PageStamp stamp1 = pdfCopy.createPageStamp(importedPage1); 
    ColumnText.showTextAligned(stamp.getOverContent(), Element.ALIGN_CENTER, 
           new Phrase(text1), 400, 500, 0); 
    stamp.alterContents(); 
    pdfCopy.addPage(importedPage1); 

    // Page 2 
    PdfImportedPage importedPage2= pdfCopy.getImportedPage(pdfReader, 2); 
    String text2 = "Text of the second page - 2"; 
    PageStamp stamp2 = pdfCopy.createPageStamp(importedPage2); 
    ColumnText.showTextAligned(stamp2.getOverContent(), Element.ALIGN_CENTER, 
           new Phrase(text2), 200, 700, 0); 
    stamp2.alterContents(); 
    pdfCopy.addPage(importedPage2); 

    // Closing 
    doc.close(); 

-> In der zweiten Seite werde ich meine text1 und mein text2

Ich sehe versucht, das gleiche PdfImportedPage mit: gleiches Ergebnis.

Ich habe versucht, die gleiche PageStamp: das gleiche Ergebnis.

Ich versuchte mit einem anderen PdfReader: es funktioniert, aber ist das wirklich die Lösung?

Danke für Ihre Hilfe.

+0

Es gibt keine iText 4.2.1. Lesen Sie über [diese Rogue-Version] (http://itextpdf.com/maven-update-problem-with-itext-4.2.2) und Sie werden verstehen, dass niemand wirklich weiß, was in iText 4.2.1 ist. Es ist eine inoffizielle Version, die von niemandem unterstützt wird. Ich denke nicht, dass jemand Ihnen helfen wird, solange Sie eine ältere Version als iText 5 verwenden. –

+0

Sie sollten Unterstützung von der Firma erhalten, die diese Gabel erstellt hat. Problem ist, dass diese Firma nicht mehr existiert. Oder fragen Sie den Entwickler, der gegabelt hat, ymasory. Das Problem ist, dass sie wahrscheinlich nicht interessiert sind. –

+0

@GuillaumeB Beantwortet meine Antwort Ihre Frage? – mkl

Antwort

0

@Bruno und @Amedee haben bereits eine Version 4.2.1 kommentiert, daher muss ich nicht darüber sprechen. Die Frage, die Sie stellen, gilt jedoch immer noch für die aktuelle iText-Version. Also:

Problem: Wenn ich pdfCopy.createPageStamp (importedPage) und ColumnText.showTextAligned auf einen Text hinzufügen den Stempel in den nächsten Content-Seiten bestehen. So enthält meine Inhaltsseite Nr. 2 den Text des ersten (hinzugefügt von PageStamp) und seinen eigenen Text (hinzugefügt durch einen anderen PageStamp).

Dies ist zu erwarten, da es das dokumentierte Verhalten ist. Werfen Sie einen Blick auf die PdfCopy.createPageStamp JavaDocs:

/** 
* Create a page stamp. New content and annotations, including new fields, are allowed. 
* The fields added cannot have parents in another pages. This method modifies the PdfReader instance.<p> 
* The general usage to stamp something in a page is: 
* <p> 
* <pre> 
* PdfImportedPage page = copy.getImportedPage(reader, 1); 
* PdfCopy.PageStamp ps = copy.createPageStamp(page); 
* ps.addAnnotation(PdfAnnotation.createText(copy, new Rectangle(50, 180, 70, 200), "Hello", "No Thanks", true, "Comment")); 
* PdfContentByte under = ps.getUnderContent(); 
* under.addImage(img); 
* PdfContentByte over = ps.getOverContent(); 
* over.beginText(); 
* over.setFontAndSize(bf, 18); 
* over.setTextMatrix(30, 30); 
* over.showText("total page " + totalPage); 
* over.endText(); 
* ps.alterContents(); 
* copy.addPage(page); 
* </pre> 
* @param iPage an imported page 
* @return the <CODE>PageStamp</CODE> 
*/ 
public PageStamp createPageStamp(PdfImportedPage iPage) 

(PdfCopy.java)

Wie es in der zweiten Zeile sagt: Diese Methode dient der PdfReader Instanz modifiziert.

So

Ich habe versucht, einen anderen PdfReader mit: es funktioniert, aber das ist wirklich die Lösung ??

Dies ist eine Lösung, aber abhängig von der Quelle PDF ziemlich ressourcenintensiv. Eine weitere Möglichkeit besteht darin, PdfCopy ohne PageStamps zu verwenden und Ihre Änderungen in einem separaten PdfStamper anzuwenden. Je nach Anwendungsfall gibt es andere, die ...

PageStamps eine sehr leichte Art und Weise darstellen, während zu stempeln Kopieren weil sie einfach die PdfReader manipulieren und müssen nicht ihre eigenen Vermittler Strukturen aufzubauen. Bei inkompatiblen Anwendungsfällen gibt es

+0

Hallo mkl. Danke für deine Antwort. Tatsächlich werden die meisten meiner Inhalte dynamisch hinzugefügt (da ich Diagramme, Grafiken, Texte, ... zu meinem Bericht hinzufüge), so scheint PageStamp nutzlos zu sein. Ich versuche es mit PdfStamper herauszufinden ... –

+0

@GuillaumeB In diesem Fall akzeptiere entweder meine Antwort (klicke auf das Häkchen oben links) oder schreibe eine eigene auf und akzeptiere das. Fragen offen lassen, während sie tatsächlich bereits gelöst sind, ist auf einer Q & A-Site wie stackoverflow ungeeignet. – mkl

+0

Für jetzt habe ich noch keine klare Lösung. Für mich ist diese Frage noch offen ... Ich arbeite mit PdfStamper, um seine Möglichkeiten zu ermitteln. –