如何使用iTextPDF 7将页面从一个PDF文档正确复制到另一个PDF文档?

时间:2018-01-04 15:10:39

标签: java pdf itext7

以下代码是接收目标pdf文档和源pdf文档并将页面从源复制到目标的方法的简化版本。页面副本必须比原始页面小一点(95%),因为目标文档中的页面将收到一些额外的文本作为页眉和页脚。

try {
    for(int pageIndex = 1; pageIndex<=pdfSource.getNumberOfPages(); ++pageIndex) {
        PdfPage sourcePage = pdfSource.getPage(pageIndex);
        Rectangle sourceRect = sourcePage.getPageSizeWithRotation();

        PdfPage page = pdfDest.addNewPage(PageSize.A4);

        // Transformation matrix
        PdfCanvas canvas = new PdfCanvas(page);
        AffineTransform transformationMatrix = AffineTransform.getScaleInstance(
                    (page.getPageSize().getWidth() / sourcePage.getWidth()) * 0.95,
                    (page.getPageSize().getHeight() / sourcePage.getHeight()) * 0.95);
        canvas.concatMatrix(transformationMatrix);
        try {
            PdfFormXObject pageCopy = sourcePage.copyAsFormXObject(pdfDestino);
            float x = (float)(page.getPageSize().getWidth()*0.05);
            float y = (float)(page.getPageSize().getHeight()*0.05);
            canvas.addXObject(pageCopy, x, y);
            pageCopy.flush();
        } catch(Exception e) {
           // bla bla bla
        }

        // Reset tansformations
        transformationMatrix = AffineTransform.getScaleInstance(
            sourceRect.getWidth() / page.getPageSize().getWidth(),
            sourceRect.getHeight() / page.getPageSize().getHeight()
        );
        canvas.concatMatrix(transformationMatrix);
        canvas.setFillColorRgb(0.0f, 0.0f, 0.65f)
                  .setFontAndSize(PdfFontFactory.createFont(FontConstants.COURIER), 11);

        // Adding some extra text
        // blah blah blah
    }
} finally {
    pdfSource.close();
}

作为一般规则,此方法将被多次调用,因为许多文档将被附加到目标PDF文档。

一切正常,除非我们有大量的源文档。在这种情况下,大于100。

因此,当我们有一个例如30个源文档的列表时,所有这些文档都被正确处理,目标文档将包含所有30个文档的页面。

当此列表超过100个文档时,我们有一个OutOfMemory异常。我们认为此处存在内存泄漏,但我们无法找到它。

我们缺少什么?

0 个答案:

没有答案