在pdfbox 2.00中使用PDFMergerUtility合并文档

12

使用Pdfbox 1.8.xx版时,类似于mergePdf.mergeDocuments()的合并文档功能能够正常运行。现在Pdfbox 2.0.0版本中包含一些像org.apache.pdfbox.multipdf.PDFMergerUtility.mergeDocuments(MemoryUsageSetting arg0)这样的参数。那么MemoryUsageSetting是什么?如何与mergeDocuments一起使用?我读到的是将源文档列表合并,保存到目标文件中。请提供一些等价于版本2.0.0的代码。

public void combine()
    {
        try
        {
        PDFMergerUtility mergePdf = new PDFMergerUtility();
        String folder ="pdf";
        File _folder = new File(folder);
        File[] filesInFolder;
        filesInFolder = _folder.listFiles();
        for (File string : filesInFolder)
        {
            mergePdf.addSource(string);    
        }
    mergePdf.setDestinationFileName("Combined.pdf");
    mergePdf.mergeDocuments();
        }
        catch(Exception e)
        {

        }  
    }
1个回答

23
根据 javadocMemoryUsageSetting 控制如何使用内存/临时文件进行缓冲。
两个最简单的用法是:
MemoryUsageSetting.setupMainMemoryOnly()

这将缓冲区的内存使用设置为仅使用主存储器(没有临时文件),其大小不受限制。

MemoryUsageSetting.setupTempFileOnly()

这将设置缓冲区内存使用,仅使用临时文件(而非主内存),其大小不受限制。

因此,对于您来说,调用将是

mergePdf.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly());
或者
mergePdf.mergeDocuments(MemoryUsageSetting.setupTempFileOnly());

或者只需传递 null。这将默认仅使用主内存。这也是 javadoc 所说的: memUsageSetting 定义了如何使用内存缓冲 PDF 流;如果为 null,则使用不受限制的主内存。


"appendchild" 在 PDDocumentOutline 中用于 1.8.8 版本,现在我们使用的是 2.00 版本中的 "addLast",这会有什么区别吗? - senthil kumar
@SenthilKumar 这是一个不同的问题,但是是的,你可以使用它。我看到迁移指南中没有提到它。作为一般规则-始终查看示例源。还有一个2.0文档建议的问题(但不包括“如何”问题!):https://issues.apache.org/jira/browse/PDFBOX-3030 我稍后会提到概述。 - Tilman Hausherr
@SenthilKumar 如果这个答案有用,请点击绿色的勾号。这适用于您在此处提出的所有问题。如果答案没有帮助或不清楚,请向该人提供反馈,以便他/她改进答案。 - Tilman Hausherr
嗨@TilmanHausherr,我也对内存感到困惑。我也正在使用PDFbox(2.0.27),我将主内存大小设置为2M:MemoryUsageSetting.setupMainMemoryOnly(2000000L)。虽然我非常确定要合并的文件的总大小小于2M,但它仍会抛出“超过允许的最大刮擦文件内存”异常。您有任何关于此的想法吗?缓冲内存大小是否应大于文件的总大小? - suanziliu
你永远不知道它会变得多大。文件高度压缩。将所有这些存储在Java类中的内存中可能会使用更多。 - Tilman Hausherr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接