itext - 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) 功能可以正常工作,没有问题。
解决方案
回复有点晚。我有同样的问题 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();
推荐阅读
- python - 将应用程序添加到 Anaconda Navigator
- php - PHP file_get_contents() 汉字错误码
- reactjs - useState 指的是陈旧的值
- c# - PlatformNotSupportedException:此平台不支持 Microsoft.Data.SqlClient
- python - 在 python 3 中替换 base64 编码中的填充
- angular - RXJS - BehaviorSubject:正确使用 .value
- postgresql - 将 postgreSQL 表从模式复制到雪花的最简单方法是什么?
- javascript - 为“未来”时间生成按钮?
- listview - 从 Firestore 数据列表视图中搜索/拟合,颤动
- javascript - 在 JavaScript 中将不带连字符或空格的日期转换为日期