我有一个小pdf文件,Pdfbox无法打开。经过分析,PDFCloneUtility.cloneMerge((在内存和计算方面消耗极大,并且从未使用JavaHeapSpace完成或退出,虽然是32Gb ram,但图片中的转换不是问题,而且速度非常快。
我的PDF有什么特别或不好的地方?PDF文件
PDDocument pdDocument = PDDocument.load(imported);
new LayerUtility(pdDocument).importPageAsForm(pdDocument, 0);
事实上,importPageAsForm
似乎没有针对相同的源文档和目标文档进行完全测试。
在当前的情况下,PDF具有OCG(可选的内容组,在一些GUI中也称为层(,因此LayerUtility
尝试将OCG从源导入到目标,即导入到自身。
不幸的是,这是下面使用的PDFCloneUtility
所没有预料到的,在cloneMerge
中,会陷入一个永无止境的循环
COSArray array = (COSArray) base;
for (int i = 0; i < array.size(); i++)
{
((COSArray) target).add(cloneForNewDocument(array.get(i)));
}
其中base
、array
和target
指向相同的COSArray
。
如果扩展cloneMerge
顶部的检查
if( base == null )
{
return;
}
至
if( base == null || base == target )
{
return;
}
防止了无休止的循环。
然而,人们必须检查这是否有不必要的副作用。