首页 > 解决方案 > Itext 7.1.6 合并文档时出现内存不足错误

问题描述

当从多个文档创建整理时,java.lang.OutOfMemoryError: Java heap space error 在服务器中出现并且应用程序出现故障。

下面是一个示例代码片段,

PdfReader objReader = new PdfReader(new ByteArrayInputStream(content));
PdfDocument srcPdfDocument = new PdfDocument(objReader);
Document srcDocument = new Document(srcPdfDocument);

WriterProperties wp = new WriterProperties();
wp.setPdfVersion(PdfVersion.PDF_1_7);
PdfDocument destPdfDoc = new PdfDocument(new PdfWriter(baos,wp));
Document destDocument = new Document(destPdfDoc);

PdfMerger merger = new PdfMerger(destPdfDoc, true,true);
merger.merge(srcPdfDocument, 1, srcPdfDocument.getNumberOfPages());

//finally block
finally{
 if(srcPdfDocument != null && !srcPdfDocument.isClosed()) {
 srcPdfDocument.close();
 }
 if(srcDocument != null) {
 srcDocument.close();
 }
 if(destPdfDoc != null && !destPdfDoc.isClosed()) {
 destPdfDoc.close();
 }
 if(destDocument != null) {
 destDocument.close();
 }
}

如果其大型文档(文件大小以 GB 为单位)或标签结构损坏的文档被整理(服务器日志中的错误 -com.itextpdf.kernel.pdf.tagging.ParentTreeHandler 损坏的标签结构:遇到无效的标记内容引用 - 它没有引用到任何页面或任何 mcid。此内容引用将被忽略),将引发内存不足错误。

有什么方法可以在不将字节保留在内存中的情况下整理文档

使用 Itext 7。请注意,使用 Itext 5 (PdfCopy) 功能可以正常工作,没有问题。

标签: itextitext7

解决方案


回复有点晚。我有同样的问题 itext 7.2.1。我通过添加解决了它。

flushCopiedObjects()

合并一个 6000 页,400 MiB 的文件,工作正常。

PdfDocument pdf = new PdfDocument(new PdfWriter(outfile));
PdfMerger merger = new PdfMerger(pdf);
for ( String file : listFilesToAdd ) {
 PdfDocument fileAdd = new PdfDocument(new PdfReader(file));
 merger.merge(fileAdd , 1, fileAdd.getNumberOfPages());
 pdf.flushCopiedObjects(fileAdd);
 fileAdd.close();
}
pdf.close();

推荐阅读