使用 Itext 合并 PDF

Merging PDF using Itext

我在合并两个由 IText 生成的 PDF 时遇到问题。

创建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,合并后的 pdf 以横向格式出现。我怎样才能避免这种情况。

请看一下table 6.1 in chapter 6 of my book,你会发现使用PdfWriter合并文档还没有完成.如果要合并文档,需要使用PdfCopy.

例如,请参阅以下问题:

  • How to do pdf writing and copying at once?
  • put page number when create PDF with iTextSharp
  • Edit DirectContent of iTextSharp PdfSmartCopy class
  • ...

(如你所见,这个问题之前已经回答过很多次了...)

一个例子:

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