【问题标题】:How do I merge multiple, small PDF's into a single one using PDFBox without running out of heap space?如何使用 PDFBox 将多个小型 PDF 合并为一个而不用完堆空间?
【发布时间】:2014-09-25 00:07:20
【问题描述】:

我一直在尝试将多个较小的 PDF(6 MB 是我迄今为止使用过的最大 PDF)合并为一个 PDF。每当我尝试使用超过 14 MB 的输入时,都会出现内存不足错误。

合并时,进程的内存使用量跃升至 550MB 以上。这对于 14MB 的输入来说似乎过多。

我使用 PDFBox 1.8.5 版在本地 IBM Websphere Application Server 上运行此应用程序

我已将堆大小增加到 1024MB,虽然这允许我使用更多文件进行输入,但我很快遇到了同样的问题。

根据评论者的建议,我更改了将文档对合并在一起的方法,然后进一步合并先前合并的对。这让我比以前走得更远。对于大小约为 30 MB 的文件,我仍然会遇到内存不足错误,但它更可行。

File sourceLoc = new File(System.getProperty("java.io.tmpdir") + "source_files");
File scratch = new File(System.getProperty("java.io.tmpdir") + "scratch.txt");
PDFMergerUtility merger = new PDFMergerUtility();

merger.setDestinationFileName(System.getProperty("java.io.tmpdir") + "merged.pdf");
for(File file : sourceLoc.listFiles())
    merger.addSource(file);
merger.mergeDocumentsNonSeq(new org.apache.pdfbox.io.RandomAccessFile(scratch, "rw"));

这是生成的日志:

JVMDUMP039I Processing dump event "systhrow", detail "java/lang/OutOfMemoryError" at      2014/08/01 13:01:50 - please wait.
JVMDUMP032I JVM requested System dump using 'C:\Working\IntranetApps\I-Document\Services\core.20140801.130150.2408.0001.dmp' in response to an event
JVMDUMP010I System dump written to C:\Working\IntranetApps\I-Document\Services\core.20140801.130150.2408.0001.dmp
JVMDUMP032I JVM requested Heap dump using 'C:\Working\IntranetApps\I-Document\Services\heapdump.20140801.130150.2408.0002.phd' in response to an event
JVMDUMP010I Heap dump written to C:\Working\IntranetApps\I-Document\Services\heapdump.20140801.130150.2408.0002.phd
JVMDUMP032I JVM requested Java dump using 'C:\Working\IntranetApps\I-Document\Services\javacore.20140801.130150.2408.0003.txt' in response to an event
JVMDUMP010I Java dump written to C:\Working\IntranetApps\I-Document\Services\javacore.20140801.130150.2408.0003.txt
JVMDUMP032I JVM requested Snap dump using 'C:\Working\IntranetApps\I-Document\Services\Snap.20140801.130150.2408.0004.trc' in response to an event
JVMDUMP010I Snap dump written to C:\Working\IntranetApps\I-Document\Services\Snap.20140801.130150.2408.0004.trc
JVMDUMP013I Processed dump event "systhrow", detail "java/lang/OutOfMemoryError".
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at org.apache.pdfbox.io.RandomAccessBuffer.clone(RandomAccessBuffer.java:69)
    at org.apache.pdfbox.cos.COSStream.clone(COSStream.java:72)
    at org.apache.pdfbox.cos.COSStream.<init>(COSStream.java:96)
    at org.apache.pdfbox.pdfparser.NonSequentialPDFParser.parseCOSStream(NonSequentialPDFParser.java:1513)
    at org.apache.pdfbox.pdfparser.NonSequentialPDFParser.parseObjectDynamically(NonSequentialPDFParser.java:1266)
    at org.apache.pdfbox.pdfparser.NonSequentialPDFParser.parseObjectDynamically(NonSequentialPDFParser.java:1192)
    at org.apache.pdfbox.pdfparser.NonSequentialPDFParser.parseDictObjects(NonSequentialPDFParser.java:1166)
    at org.apache.pdfbox.pdfparser.NonSequentialPDFParser.initialParse(NonSequentialPDFParser.java:479)
    at org.apache.pdfbox.pdfparser.NonSequentialPDFParser.parse(NonSequentialPDFParser.java:740)
    at org.apache.pdfbox.pdmodel.PDDocument.loadNonSeq(PDDocument.java:1306)
    at org.apache.pdfbox.pdmodel.PDDocument.loadNonSeq(PDDocument.java:1289)
    at org.apache.pdfbox.util.PDFMergerUtility.mergeDocuments(PDFMergerUtility.java:232)
    at org.apache.pdfbox.util.PDFMergerUtility.mergeDocumentsNonSeq(PDFMergerUtility.java:201)
    at com.my.pkg.MyMergeClass.main(MyMergeClass.java:90)

【问题讨论】:

  • 您是否在 Tomcat 服务器上运行您的应用程序?
  • 增加堆空间再试一次,如果问题仍然存在,请更新。
  • IBM WAS 服务器。我增加了堆,它允许更多的输入,但是在添加了更多输入后,我仍然用完了堆。我编辑了问题以包含此信息。这是预期的开销吗?
  • 您是否尝试过以两个为一组的方式合并文档,而不是一次将它们全部合并在一起?以允许快速合并的方式将所有各种 PDF 数据结构保存在内存中肯定会很昂贵。
  • Space Pope,你可能想把你的想法变成一个答案,因为它已经取得了迄今为止最大的进步,而且它比“仅仅弄清楚如何处理运行中的 OOM”要好得多好”。\

标签: java out-of-memory pdfbox


【解决方案1】:

PDF 大多是附言,它是一种自己的语言...所以 14MB 的输入可以是从零到无限输出的任何内容。最好的办法是弄清楚如何很好地处理运行 OOM。

【讨论】:

    猜你喜欢
    • 2017-01-10
    • 1970-01-01
    • 2013-06-16
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    相关资源
    最近更新 更多