2015-09-25 134 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