2012-12-21 5 views
7

Ich benutze iText (insbesondere iTextSharp 4.1.6) und ich möchte ein PDF erstellen, indem ich Seiten aus vorhandenen PDFs kombiniere, aber auch neue Seiten aus einem Bild einfüge.iText - wie man Seiten zu einem mit PdfCopy erstellten Dokument hinzufügt

Ich habe diese beiden Teile separat arbeiten mit PdfCopy und PdfWriter jeweils. Der Code, der eine Seite aus einem Bild zu erstellen wie folgt aussieht:

PdfWriter pw = PdfWriter.GetInstance(doc, outputStream); 
Image img = Image.GetInstance(inputStream); 
doc.Add(img); 
doc.NewPage(); 

Da nun PdfCopy von PDFWriter erbt, ich dachte, dass ich solche „Bild Seiten“ zu meinem PdfCopy Objekt hinzuzufügen wäre in die Lage mit der gleichen Technik, aber es funktioniert nicht (wenn Sie im obigen Beispiel eine PdfCopy anstelle eines PdfWriter instanziieren, kommt auf der Seite nichts heraus).

Aus einem kurzen Blick auf den Quellcode stelle ich fest, dass, wenn der Konstruktor für PdfCopy den Superklassenkonstruktor aufruft, dies mit einem neuen Document-Objekt tut, nicht dem übergebenen, also ist das der Grund.

Gibt es einen besseren Weg, dies zu tun? Im Moment rate ich am besten, ein einzelnes Pdf-Bild aus dem Bild mit PdfWriter zu erstellen und es dann mit PdfCopy zu dem Dokument hinzuzufügen, aber das scheint eine Art Workaround zu sein.

+1

Was Sie als Arbeits um scheint eine richtige Lösung zu mir beschrieben. PdfCopy wurde entwickelt, um mehrere PDFs zu kombinieren und Sie können sie auf Ihre bereits vorhandenen PDFs anwenden und neu erstellen. Wenn das Bild nicht zu groß ist, können Sie das PDF im Speicher (byte []) erstellen und von dort lesen; Daher sind zusätzliche temporäre Dateien nicht erforderlich. – mkl

+0

Danke - Ich bin nicht vertraut mit iText und es scheint so voll ausgestattet, dass ich nur nicht sicher war, ob es eine ganz andere Möglichkeit, dies zu tun war. Ich habe es implementiert, die temporäre PDF-In-Memory erstellen und alles funktioniert sehr gut :-) – Andy

Antwort

7

Ich hatte vor kurzem dieses Problem, und die Antworten hier sind eigentlich nicht so hilfreich. Mein Anwendungsfall war im Grunde "Nimm eine Menge PDFs und Bilder (.jpg, .png usw.) und kombiniere sie alle zu 1 PDF". Ich musste PdfCopy verwenden, weil es Dinge wie Formularfelder und Beschriftungen bewahrt, wo PdfWriter nicht funktioniert.

Da PdfCopy es Ihnen nicht erlaubt, neue Seiten mit addPage() zu erstellen, müssen Sie eine neue PDF im Speicher mit dem Bild auf der Seite erstellen und dann PdfCopy verwenden, um die Seite aus dieser PDF zu kopieren.

Zum Beispiel:

Document pdfDocument = new Document(); 
    ByteArrayOutputStream pdfOutputStream = new ByteArrayOutputStream(); 
    PdfCopy copy = new PdfCopy(pdfDocument, pdfOutputStream); 

    pdfDocument.open(); 

    for (File file : allFiles) { 
     if (/* file is PDF */) { 
      /* Copy all the pages in the PDF file into the new PDF */ 
      PdfReader reader = new PdfReader(file.getAllBytes()); 
      for (int i = 1; i <= reader.getNumberOfPages(); i++) { 
       copy.addPage(copy.getImportedPage(reader, i); 
      } 
     } else { 
      /* File is image. Create a new PDF in memory, write the image to its first page, and then use PdfCopy to copy that first page back into the main PDF */ 
      Document imageDocument = new Document(); 
      ByteArrayOutputStream imageDocumentOutputStream = new ByteArrayOutputStream(); 
      PdfWriter imageDocumentWriter = PdfWriter.getInstance(imageDocument, imageDocumentOutputStream); 

      imageDocument.open(); 

      if (imageDocument.newPage()) { 

       image = Image.getInstance(file.getAllBytes()); 

       if (!imageDocument.add(image)) { 
        throw new Exception("Unable to add image to page!"); 
       } 

       imageDocument.close(); 
       imageDocumentWriter.close(); 

       PdfReader imageDocumentReader = new PdfReader(imageDocumentOutputStream.toByteArray()); 

       copy.addPage(copy.getImportedPage(imageDocumentReader, 1)); 

       imageDocumentReader.close(); 
     } 

    } 
Verwandte Themen