2012-12-21 12 views
7

Sto usando iText (in particolare iTextSharp 4.1.6) e voglio creare un PDF combinando pagine da PDF esistenti ma anche inserendo nuove pagine create da un'immagine.iText - come aggiungere pagine a un documento creato con PdfCopy

Ho queste due parti che funzionano separatamente rispettivamente con PdfCopy e PdfWriter. Il codice per creare una pagina da un'immagine simile a questa:

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

Ora, dal momento PdfCopy eredita da PDFWriter, ho pensato di essere in grado di aggiungere queste "pagine di immagini" a mio oggetto PdfCopy utilizzando la stessa tecnica, ma non funziona (se istanziate un PdfCopy invece di un PdfWriter nell'esempio precedente, non appare nulla sulla pagina).

Da una rapida occhiata al codice sorgente, noto che quando il contstructor di PdfCopy chiama il costruttore della superclasse, lo fa con un nuovo oggetto Document, non con quello passato, quindi credo che questo sia il motivo.

C'è un modo migliore per andare su questo? Al momento la mia ipotesi migliore è quella di creare un Pdf a singola pagina dall'immagine usando PdfWriter e quindi aggiungerlo al documento usando PdfCopy, ma sembra un po 'una soluzione.

+1

Quello che hai descritto come un lavoro intorno a me sembra una soluzione adeguata. PdfCopy è progettato per combinare più PDF e lo si applica ai file PDF già esistenti e al nuovo file creato. se l'immagine non è troppo grande, puoi creare quel PDF in memoria (byte []) e leggerlo da lì; quindi, non c'è nemmeno bisogno di ulteriori file temporanei. – mkl

+0

Grazie - Non ho molta familiarità con iText e sembra così completo che non ero sicuro se ci fosse un altro modo per farlo. L'ho implementato creando il PDF temporaneo in memoria e tutto funziona benissimo :-) – Andy

risposta

7

Recentemente ho avuto questo problema, e le risposte qui non sono realmente utili. Il mio caso d'uso era fondamentalmente "Prendi un mucchio di PDF e immagini (.jpg, .png ecc.) E combinali tutti in 1 PDF". Ho dovuto usare PdfCopy perché conserva cose come campi di moduli ed etichette, dove PdfWriter non lo fa.

Fondamentalmente, poiché PdfCopy non consente di creare nuove pagine con addPage(), è necessario creare un nuovo PDF in memoria con l'immagine sulla pagina, quindi utilizzare PdfCopy per copiare la pagina da quel PDF.

Ad esempio:

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

    } 
Problemi correlati