java - Groovy with JAVA:合并多个大 PDF 文件时出错,导致内存不足
问题描述
我正在尝试将多个大型 PDF 文件(~10MB)与书签合并。它适用于小型 PDF 文件,但如果有一些非常大的文件需要合并,则无法正常工作。
下面是我用 Groovy 写的代码
public class MergePDFBookmarks
{
public static void mergePDFFiles(Map jsonobj, String pathname, String
pdfoutfullpath)
{
def mergePdf = new PDFMergerUtility();
jsonobj.each{k,v->
if (v instanceof List){
v.each{it ->
mergePdf.addSource(pathname + "/" + it["TLF_ID"] + ".pdf")
}
}
}
println "Merging to PDF File: " + pdfoutfullpath + ".pdf"
mergePdf.setDestinationFileName(pdfoutfullpath)
mergePdf.mergeDocuments()
}
错误消息:我收到错误消息说
org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.call(StaticMetaMethodSite.java:88)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:40)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:117)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133)
at MergePDFBookmarks.main(Script1.groovy:112)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:88)
... 6 more
Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.util.Arrays.copyOf(Arrays.java:2219)
at java.util.ArrayList.grow(ArrayList.java:242)
at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:216)
at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:208)
at java.util.ArrayList.add(ArrayList.java:440)
at org.apache.pdfbox.cos.COSArray.add(COSArray.java:52)
at org.apache.pdfbox.pdfparser.BaseParser.parseCOSArray(BaseParser.java:1092)
at org.apache.pdfbox.pdfparser.BaseParser.parseDirObject(BaseParser.java:1275)
at org.apache.pdfbox.pdfparser.BaseParser.parseCOSDictionaryValue(BaseParser.java:249)
at org.apache.pdfbox.pdfparser.BaseParser.parseCOSDictionary(BaseParser.java:356)
at org.apache.pdfbox.pdfparser.BaseParser.parseDirObject(BaseParser.java:1264)
at org.apache.pdfbox.pdfparser.PDFObjectStreamParser.parse(PDFObjectStreamParser.java:106)
at org.apache.pdfbox.cos.COSDocument.dereferenceObjectStreams(COSDocument.java:683)
at org.apache.pdfbox.pdfparser.PDFParser.parse(PDFParser.java:255)
at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1227)
at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1194)
at org.apache.pdfbox.util.PDFMergerUtility.mergeDocuments(PDFMergerUtility.java:238)
at org.apache.pdfbox.util.PDFMergerUtility.mergeDocuments(PDFMergerUtility.java:195)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
解决方案
推荐阅读
- python - 如何使用 bitbucket api 获取 repo 的所有拉取请求列表?
- netsuite - SuiteScript 2.0:如何编写高效的代码?
- android - 密封类在 Android 环境中的性能影响是什么?
- variables - 如何使用动态变量查询 ansible 字典
- java - 使用netty发送多个RTSP消息
- php - 如何在 AJAX 循环函数中调用 PHP Strtotime?
- swift - 单击单元格时 UILabel 内容无效
- filter - 如何在授权过滤器中使用redis缓存?
- firebase - 如何从 Firebase 主题消息中排除设备?
- powershell - 存储多维数据以提高速度的最佳类型