2014-04-14 7 views
5

Sto utilizzando il seguente codice di unire file PDF insieme usando iText:funzione che può usare iText per concatenare/unire file PDF insieme - causando alcuni problemi

public static void concatenatePdfs(List<File> listOfPdfFiles, File outputFile) throws DocumentException, IOException { 
     Document document = new Document(); 
     FileOutputStream outputStream = new FileOutputStream(outputFile); 
     PdfWriter writer = PdfWriter.getInstance(document, outputStream); 
     document.open(); 
     PdfContentByte cb = writer.getDirectContent(); 
     for (File inFile : listOfPdfFiles) { 
      PdfReader reader = new PdfReader(inFile.getAbsolutePath()); 
      for (int i = 1; i <= reader.getNumberOfPages(); i++) { 
       document.newPage(); 
       PdfImportedPage page = writer.getImportedPage(reader, i); 
       cb.addTemplate(page, 0, 0); 
      } 
     } 
     outputStream.flush(); 
     document.close(); 
     outputStream.close(); 
    } 

Questo di solito funziona alla grande! Ma una volta tanto, sta ruotando alcune pagine di 90 gradi? Qualcuno ha mai avuto questo?

Sto esaminando i PDF stessi per vedere cosa è speciale su quelli che vengono capovolti.

risposta

10

Ci sono errori una volta ogni tanto perché si utilizza il metodo sbagliato per concatenare i documenti. Si prega di leggere chapter 6 of my book e si noterà che l'utilizzo di PdfWriter per concatenare (o unire) i documenti PDF è sbagliato:

  • Si ignora completamente la dimensione della pagina delle pagine del documento originale (si assume che sono tutte di formato A4),
  • si ignorano i limiti di pagina, come la casella di ritaglio (se presente),
  • si ignora il valore di rotazione memorizzato nel dizionario pagina
  • buttare via tutto l'interattività che è presente nel documento originale , e così via.

PDF Concatenazione avviene tramite PdfCopy, si veda ad esempio la FillFlattenMerge2 esempio:

Document document = new Document(); 
PdfCopy copy = new PdfSmartCopy(document, new FileOutputStream(dest)); 
document.open(); 
PdfReader reader; 
String line = br.readLine(); 
// loop over readers 
    // add the PDF to PdfCopy 
    reader = new PdfReader(baos.toByteArray()); 
    copy.addDocument(reader); 
    reader.close(); 
// end loop 
document.close(); 

Ci sono altri esempi in the book.

+0

riconosco il tuo nome dai namespace di itext. Sei un fondatore della libreria di itext? –

+1

Sì, sono Lowagie ;-) –

+0

Domanda - copy.addDocument non esiste nella mia versione di itext. sono troppo vecchio? 5.0.6 –

9

Nel caso qualcuno è alla ricerca di essa, utilizzando risposta corretta di Bruno Lowagie sopra, ecco la versione della funzione che non sembrano avere il problema di pagina che lancia ho descritto sopra:

public static void concatenatePdfs(List<File> listOfPdfFiles, File outputFile) throws DocumentException, IOException { 
     Document document = new Document(); 
     FileOutputStream outputStream = new FileOutputStream(outputFile); 
     PdfCopy copy = new PdfSmartCopy(document, outputStream); 
     document.open(); 
     for (File inFile : listOfPdfFiles) { 
      PdfReader reader = new PdfReader(inFile.getAbsolutePath()); 
      copy.addDocument(reader); 
      reader.close(); 
     } 
     document.close(); 
}