我需要将许多小pdf文件合并为一个大pdf(~200G)。而且我找不到可以在不吃掉所有记忆的情况下完成它的库/工具。
我观看了itext,pdfbox,pdftk。但似乎所有这些都将文件存储在内存中。根据pdf文件结构,应该很容易顺序地输入文件流并写入结果文件,只保留在内存中的外部参照表。
我用来测试iText的代码。对于每个下一个文件,它会消耗越来越多的内存:
public static void MergePDFs(String[] fileNames, String targetPdf) throws IOException, DocumentException {
FileOutputStream stream = new FileOutputStream(targetPdf);
Document document = new Document();
PdfCopy pdf = new PdfCopy(document, stream);
PdfReader reader = null;
document.open();
for (String file : fileNames) {
reader = new PdfReader(file);
pdf.addDocument(reader);
pdf.freeReader(reader);
reader.close();
}
if (reader != null) {
reader.close();
}
document.close();
stream.close();
}
答案 0 :(得分:1)
一种策略是合并10个文件的组,然后合并中间文件。根据需要采取尽可能多的中间步骤。例如:
没有固定的规则,我说10但是对你来说最佳解决方案是每8或每14,你必须进行实验。
理论上,您甚至可以在不同的计算机上并行运行中间步骤,这可以显着加快合并速度,但需要更多硬件。
我的回答是通用的,适用于任何pdf库,但在iText Software,我们做了一项研究,表明这种策略更快,耗费更少的内存。