我想问一下如何将超过 100k 的 pdf 文件(每个 pdf 文件大约 160 KB)合并为 1 个 pdf 文件?
我已经阅读了本教程,该代码适用于少数 pdf。但是当我尝试 10k pdf 文件时,我收到此错误“java.lang.OutOfMemoryError:超出 GC 开销限制”
我已经尝试使用 -Xmx 或 -Xms,错误变为“java heap space”。
我也在使用“pdf.flushCopiedObjects(firstSourcePdf);”它没有帮助。还是我使用不当?
File file = new File(pathName);
File[] listFile = file.listFiles();
if (listFile == null) {
throw new Exception("File not Found at " + pathName);
}
Arrays.sort(listFile, 0, listFile.length - 1);
PdfADocument pdf = new PdfADocument(new PdfWriter(dest),
PdfAConformanceLevel.PDF_A_1A,
new PdfOutputIntent("Custom", "", "http://www.color.org",
"sRGB IEC61966-2.1", null));
//Setting some required parameters
pdf.setTagged();
pdf.getCatalog().setLang(new PdfString("en-US"));
pdf.getCatalog().setViewerPreferences(
new PdfViewerPreferences().setDisplayDocTitle(true));
PdfDocumentInfo info = pdf.getDocumentInfo();
info.setTitle("iText7 PDF/A-1a example");
//Create PdfMerger instance
PdfMerger merger = new PdfMerger(pdf);
//Add pages from the first document
for (File filePdf : listFile) {
System.out.println("filePdf = " +filePdf.getName());
PdfDocument firstSourcePdf = new PdfDocument(new PdfReader(filePdf));
merger.merge(firstSourcePdf, 1, firstSourcePdf.getNumberOfPages());
pdf.flushCopiedObjects(firstSourcePdf);
firstSourcePdf.close();
}
pdf.close();
谢谢
最佳答案
这是合并大量 PDF 文档(或大型 PDF)时的已知问题。
iText 将尝试使生成的 PDF 尽可能小。它通过尝试重用对象来做到这一点。例如,如果您有一个多次出现的图像,它不会每次都嵌入该图像,而是将其嵌入一次并简单地为其他出现的图像使用一个引用。
这意味着 iText 必须将所有对象保存在内存中,因为无法事先知道对象是否会被重用。
通常有用的解决方案是分批处理流程。 不要将 1000 个文件合并为 1 个文件,而是尝试将 1000 个文件成对合并(生成 500 个文档),然后将每个文件成对合并(生成 250 个文档),依此类推。
这允许 iText 定期刷新缓冲区,这应该会阻止内存开销导致 VM 崩溃。
关于java - 如何合并多个pdf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46485104/