在尝试合并多个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
我认为显而易见的解决方案是增加堆空间(但我不确定)。 Routine可以处理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的数量和大小是未知的(在更糟糕的情况下,每个大小在2M到30M之间,计数可能超过1,000)。
设置堆大小的安全限制是什么,或者,如何确定运行我的例程的适当堆大小 - 我可以期望在执行时Web服务器上有什么样的imapacts?是否存在将其启动到最大程度的问题?
我在Ec2上使用了T2.micro实例。
答案 0 :(得分:2)
最大堆大小是您希望程序失败而不是继续使用更多内存的点。这通常取决于您拥有的机器的大小,即您可以将最大值设置为机器内存的80%。