如何在没有内存消耗的情况下进行流式PDF合并?

时间:2018-02-06 12:26:30

标签: pdf memory itext pdfbox pdftk

我需要将许多小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();
}

1 个答案:

答案 0 :(得分:1)

一种策略是合并10个文件的组,然后合并中间文件。根据需要采取尽可能多的中间步骤。例如:

  • 步骤0:1页的1000个文件
  • 第1步:100页10页文件
  • 第2步:10页100页
  • 第3步:1页1000页

没有固定的规则,我说10但是对你来说最佳解决方案是每8或每14,你必须进行实验。

理论上,您甚至可以在不同的计算机上并行运行中间步骤,这可以显着加快合并速度,但需要更多硬件。

我的回答是通用的,适用于任何pdf库,但在iText Software,我们做了一项研究,表明这种策略更快,耗费更少的内存。