【发布时间】:2018-02-06 12:26:29
【问题描述】:
我需要将许多小 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();
}
【问题讨论】:
-
PDFBox 可以使用暂存文件,请参阅
public void mergeDocuments(MemoryUsageSetting memUsageSetting)。作为一种工具,请尝试基于 PDFBox fork 的 pdfsam。 -
IText 有多种方法来构建具有不同内存使用的 pdf 阅读器和编写器。因此:您尝试过什么?
-
@mkl 对于千兆字节大小的文件的特定用例,没有一个 PDF 库可以在不使用特殊策略的情况下一次性完成。这是一个已知问题。
-
@mkl 添加代码到问题
-
@AmedeeVanGasse 是的。但即使分组进行,也可以而且应该优化内存使用。
标签: pdf memory itext pdfbox pdftk