2015-09-25 137 views
3

我在合并两个由IText生成的PDF时遇到问题。 PDF创建的使用Itext合并PDF

代码段:

文献配置如下:

iText_xls_2_pdf = new Document(PageSize.A4.rotate(),10,0,30,0); 

使用这种配置被创建2页的PDF。

创建这些PDF后,需要将它们合并为一个pdf。

下面的代码被用于合并的PDF文件:

Document document = new Document(PageSize.A4.rotate(),10,0,30,0); 
try { 
    List<InputStream> pdfs = streamOfPDFFiles; 
    List<PdfReader> readers = new ArrayList<PdfReader>(); 
    int totalPages = 0; 
    Iterator<InputStream> iteratorPDFs = pdfs.iterator(); 
    // Create Readers for the pdfs. 
    while (iteratorPDFs.hasNext()) { 
     InputStream pdf = iteratorPDFs.next(); 
     PdfReader pdfReader = new PdfReader(pdf); 
     readers.add(pdfReader); 
     totalPages += pdfReader.getNumberOfPages(); 
    } 
    // Create a writer for the outputstream 
    PdfWriter writer = PdfWriter.getInstance(document, outputStream); 
    document.open(); 
    BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, 
      BaseFont.CP1252, BaseFont.NOT_EMBEDDED); 
    PdfContentByte cb = writer.getDirectContent(); // Holds the PDF 
    // data 
    PdfImportedPage page; 
    int currentPageNumber = 0; 
    int pageOfCurrentReaderPDF = 0; 
    Iterator<PdfReader> iteratorPDFReader = readers.iterator(); 
    // Loop through the PDF files and add to the output. 
    while (iteratorPDFReader.hasNext()) { 
     PdfReader pdfReader = iteratorPDFReader.next(); 
     // Create a new page in the target for each source page. 
     while (pageOfCurrentReaderPDF < pdfReader.getNumberOfPages()) { 
      document.newPage(); 
      pageOfCurrentReaderPDF++; 
      currentPageNumber++; 
      page = writer.getImportedPage(pdfReader, 
        pageOfCurrentReaderPDF); 
      cb.addTemplate(page, 0, 0); 
      // Code for pagination. 
      if (paginate) { 
       cb.beginText(); 
       cb.setFontAndSize(bf, 9); 
       cb.showTextAligned(PdfContentByte.ALIGN_CENTER, "" 
         + currentPageNumber + " of " + totalPages, 520, 
         5, 0); 
       cb.endText(); 
      } 
     } 
     pageOfCurrentReaderPDF = 0; 
    } 
    outputStream.flush(); 
    document.close(); 
    outputStream.close(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} finally { 
    if (document.isOpen()) 
     document.close(); 
    try { 
     if (outputStream != null) 
      outputStream.close(); 
    } catch (IOException ioe) { 
     ioe.printStackTrace(); 
    } 
} 

这将创建合并的PDF。但由于我在文档配置中使用了.rotate,因此Merged pdf采用横向格式。我怎么能避免这一点。

+1

你做的一切都是错误的,因为你要么没看过的文档,或者,如果你这样做,你走错了人民的意见。不要使用'PdfWriter'来合并文档!使用'PdfCopy'或'PdfSmartCopy'! –

回答

0

请看chapter 6 of my book的表6.1,你会发现使用PdfWriter合并文件是没有完成。如果要合并文档,则需要使用PdfCopy

举一个例子,例如参见以下问题:

(正如你所看到的,这个问题有在......之前已被回答了很多次)

一个例子:

PdfReader reader1 = new PdfReader(file1); 
PdfReader reader2 = new PdfReader(file2); 
Document document = new Document(); 
FileOutputStream fos = new FileOutputStream(); 
PdfCopy copy = new PdfCopy(document, fs); 
document.open(); 
PdfImportedPage page; 
PdfCopy.PageStamp stamp; 
Phrase phrase; 
BaseFont bf = BaseFont.createFont(); 
Font font = new Font(bf, 9); 
int n = reader1.getNumberOfPages(); 
for (int i = 1; i <= reader1.getNumberOfPages(); i++) { 
    page = copy.getImportedPage(reader1, i); 
    stamp = copy.createPageStamp(page); 
    phrase = new Phrase("page " + i, font); 
    ColumnText.showTextAligned(stamp.getOverContent(), Element.ALIGN_CENTER, phrase, 520, 5, 0); 
    stamp.alterContents(); 
    copy.addPage(page); 
} 
for (int i = 1; i <= reader2.getNumberOfPages(); i++) { 
    page = copy.getImportedPage(reader2, i); 
    stamp = copy.createPageStamp(page); 
    phrase = new Phrase("page " + (n + i), font); 
    ColumnText.showTextAligned(stamp.getOverContent(), Element.ALIGN_CENTER, phrase, 520, 5, 0); 
    stamp.alterContents(); 
    copy.addPage(page); 
} 
document.close(); 
reader1.close(); 
reader2.close(); 
+0

谢谢先生,这解决了我的问题。 – roshancs10

+0

我不确定您是否可以接受已关闭问题的答案。你可以试试吗? –

+0

是的,我尝试过。截至目前,我没有足够的积分投票。一旦我获得足够积分,就会upvote – roshancs10