【发布时间】:2015-07-23 02:53:35
【问题描述】:
在尝试合并多个 PDF 文档时,我遇到了以下错误......
PDFMerger failed with the following exception:
org.apache.pdfbox.exceptions.WrappedIOException
at org.apache.pdfbox.pdfparser.PDFParser.parse(PDFParser.java:278)
at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1220)
at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1187)
at org.apache.pdfbox.util.PDFMergerUtility.mergeDocuments(PDFMergerUtility.java:237)
at org.apache.pdfbox.util.PDFMergerUtility.mergeDocuments(PDFMergerUtility.java:194)
at org.apache.pdfbox.PDFMerger.merge(PDFMerger.java:82)
at org.apache.pdfbox.PDFMerger.main(PDFMerger.java:44)
at org.apache.pdfbox.PDFBox.main(PDFBox.java:83)
Caused by: 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:78)
at org.apache.pdfbox.cos.COSStream.<init>(COSStream.java:102)
at org.apache.pdfbox.pdfparser.BaseParser.parseCOSStream(BaseParser.java:409)
at org.apache.pdfbox.pdfparser.PDFParser.parseObject(PDFParser.java:650)
at org.apache.pdfbox.pdfparser.PDFParser.parse(PDFParser.java:203)
... 7 more
我认为显而易见的解决方案是增加堆空间(但我不确定)。该例程适用于 20-30 个文件,但在接近 100 个时会引发异常。
环境是一个带有 Java 1.8.0 的 apache2 Web 服务器,我正在通过 PHP exec() 调用命令...
// Build a string for PDF box...
$mergepdf = "java -jar pdfbox-app-1.8.9.jar PDFMerger ";
foreach ($drawings as $key => $id){
$mergepdf .= $path.$userid."-".$key.".pdf ";
}
$mergepdf .= $path.$pdffilename;
// Make the compiled pdf
exec($mergepdf);
用户可以请求他想要下载多少个 pdf。目的是合并它们并提供编译的 PDF。因为在编程时 PDF 的数量和大小是未知的(在更糟糕的情况下,计数可能超过 1,000 个,每个大小在 2M 到 30M 之间)。
将堆大小设置为的安全限制是什么,或者,我如何确定运行例程的适当堆大小 - 在执行时我可以期望它在 Web 服务器上具有哪些 imapact?把它调到最大有问题吗?
我在 Ec2 上使用 T2.micro 实例。
【问题讨论】:
-
足以容纳你的一段字符串。
-
没有简单的答案。这取决于您的 PDF 的大小和复杂性。
标签: java heap-memory