2014-09-01 72 views
5

我在使用iText合并不同宽度的文档时出现问题。使用iText合并不同宽度的pdf文档

下面是我用来合并的代码。

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

PDF的第一页将是宽度的14英寸和高度的13英寸。文件上的所有其他页面将始终小于它。

我想要将所有文档完全合并到一个文档中。

我不知道如何设置单个合并文档的宽度和高度。

我认为Rectangle pagesize = new Rectangle(1700f, 20f);应该这样做,但它不工作意味着如果将其更改为Rectangle pagesize = new Rectangle(1700f, 200f);,文档没有任何影响。

请继续引导我。

+0

你想保持原有的PDF文件的尺寸是多少?在这种情况下,你应该使用'PdfCopy'来代替。 – mkl 2014-09-01 12:09:09

回答

18

使用PdfWriter类合并文档违背官方文档中提供的所有建议,但也有非官方例子可能已经引诱你进入编写恶意代码。我希望你明白,我发现这些不好的例子比你更讨厌。

请看chapter 6 of my book的表6.1。它为您提供了一个显示何时使用哪个类的概述。在这种情况下,你应该使用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(); 

如果您使用的是最新的iText的版本中,你甚至可以使用addDocument()方法在这种情况下,你并不需要遍历所有页面。如果涉及表格,您还需要特别小心。在Sandbox中有几个例子展示了新功能(可以追溯到书写后)。

3

与iText的5.5版,我们可以使用方法PdfCopy.addDocument更伊斯利合并PDF:

  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

这是正确的。更新版本的iText允许您一次添加完整的文档。 – 2015-11-25 09:22:52