2014-09-01 12 views
5

Ho problemi durante l'unione di documenti di larghezza diversa usando iText.Unisci documenti pdf di larghezza diversa usando iText

Di seguito è riportato il codice che sto utilizzando per unire.

 public static void doMerge(List<InputStream> list, OutputStream outputStream) throws Exception { 

      Rectangle pagesize = new Rectangle(1700f, 20f); 


      com.itextpdf.text.Document document = new com.itextpdf.text.Document(pagesize); 

      PdfWriter writer = PdfWriter.getInstance(document, outputStream); 
      document.open(); 
      document.setPageSize(pagesize); 
      com.itextpdf.text.pdf.PdfContentByte cb = writer.getDirectContent(); 

      for (InputStream in : list){ 
       PdfReader reader = new PdfReader(in); 
       for (int i = 1; i <= reader.getNumberOfPages(); i++){ 
        document.newPage(); 
        //import the page from source pdf 
        com.itextpdf.text.pdf.PdfImportedPage page = writer.getImportedPage(reader, i); 

        //calculate the y for merging it from top 
        float y = document.getPageSize().getHeight() - page.getHeight(); 
        //add the page to the destination pdf 

        cb.addTemplate(page, 0, y); 

       } 
       reader.close(); 
       in.close(); 
      } 

      outputStream.flush(); 
      document.close(); 
      outputStream.close(); 
     } 

La prima pagina del pdf sarà di 14 pollici di larghezza e 13 pollici di altezza. Tutte le altre pagine sul documento saranno sempre più piccole di quelle.

Voglio unire tutti i documenti del tutto in un unico documento.

Non so come impostare larghezza e altezza di un singolo documento unito.

Penso che Rectangle pagesize = new Rectangle(1700f, 20f); dovrebbe farlo ma non funziona significa che se lo si modifica in Rectangle pagesize = new Rectangle(1700f, 200f);, il documento non ha alcun effetto.

Per favore guidami ulteriormente.

+0

Vuoi mantenere le dimensioni dei file PDF originali? In questo caso dovresti usare 'PdfCopy'. – mkl

risposta

18

Uso della classe PdfWriter per unire documenti va contro tutte le raccomandazioni fornite nella documentazione ufficiale , anche se ci sono non ufficiali esempi che possono vi hanno attirato in scrittura di codice cattivo. Spero che tu capisca che trovo questi cattivi esempi ancora più fastidiosi di te.

Si prega di dare un'occhiata alla Tabella 6.1 in chapter 6 of my book. Ti dà una panoramica che mostra quando usare quale classe. In questo caso, è necessario utilizzare PdfCopy:

String[] files = { MovieLinks1.RESULT, MovieHistory.RESULT }; 
// step 1 
Document document = new Document(); 
// step 2 
PdfCopy copy = new PdfCopy(document, new FileOutputStream(RESULT)); 
// step 3 
document.open(); 
// step 4 
PdfReader reader; 
int n; 
// loop over the documents you want to concatenate 
for (int i = 0; i < files.length; i++) { 
    reader = new PdfReader(files[i]); 
    // loop over the pages in that document 
    n = reader.getNumberOfPages(); 
    for (int page = 0; page < n;) { 
     copy.addPage(copy.getImportedPage(reader, ++page)); 
    } 
    copy.freeReader(reader); 
    reader.close(); 
} 
// step 5 
document.close(); 

Se si utilizza una versione recente di iText, si può anche utilizzare il metodo addDocument() nel qual caso non c'è bisogno di un ciclo su tutte le pagine. È inoltre necessario prestare particolare attenzione se sono coinvolti moduli. Esistono diversi esempi che dimostrano la nuova funzionalità (che risale a dopo la scrittura del libro) nello Sandbox.

3

con la versione 5.5 itext possiamo Merge PDF più facilmente utilizzando il metodo PdfCopy.addDocument:

  package tn.com.sf.za.rd.controller; 

      import java.io.FileOutputStream; 
      import java.io.IOException; 

      import com.itextpdf.text.Document; 
      import com.itextpdf.text.DocumentException; 
      import com.itextpdf.text.pdf.PdfCopy; 
      import com.itextpdf.text.pdf.PdfReader; 

      public class ReportMerging { 

       public static void main(String[] args) throws DocumentException, IOException { 

        String DOC_ONE_PATH = "D:/s.zaghdoudi/tmp/one.pdf"; 
        String DOC_TWO_PATH = "D:/s.zaghdoudi/tmp/two.pdf"; 
        String DOC_THREE_PATH = "D:/s.zaghdoudi/tmp/three.pdf"; 
        Document document = new Document(); 
        PdfCopy copy = new PdfCopy(document, new FileOutputStream(DOC_THREE_PATH)); 
        document.open(); 
        PdfReader readerOne = new PdfReader(DOC_ONE_PATH); 
        PdfReader readerTwo = new PdfReader(DOC_TWO_PATH); 
        copy.addDocument(readerOne); 
        copy.addDocument(readerTwo); 
        document.close(); 
       } 

      } 
+0

Questo è corretto. Le versioni più recenti di iText ti consentono di aggiungere il documento completo in una sola volta. –

Problemi correlati