以下代码是接收目标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异常。我们认为此处存在内存泄漏,但我们无法找到它。
我们缺少什么?