PDFBox 3.0.0 Splitter类空指针异常求助及规避方案咨询
解决PDFBox 3.0.0 Splitter拆分PDF时的NullPointerException问题
问题根源
你遇到的NPE是因为COSArray.getIndirectObjectKeys方法遍历内部数组时,碰到了cosBase为null的元素,直接调用getKey()触发了空指针;另外这个方法只检查了indirectObjects是否为null,没处理它是空数组的情况,双重问题导致异常。
可行的规避方法
先修复PDF文件结构
用PDFBox自带的PDFMergerUtility把有问题的PDF合并一遍(哪怕是单个文件合并成自己),能自动清理无效的COS对象引用。代码示例:PDFMergerUtility merger = new PDFMergerUtility(); merger.addSource("problem-file.pdf"); merger.setDestinationFileName("fixed-file.pdf"); merger.mergeDocuments(null);用修复后的文件再拆分,大概率能解决null引用的问题。
自定义Splitter做安全校验
继承Splitter类,在处理页面时手动过滤掉COS数组里的null元素。示例代码:public class SafeSplitter extends Splitter { @Override protected void processPage(PDPage page, int pageNumber) throws IOException { COSDictionary pageDict = page.getCOSObject(); for (COSName key : pageDict.keySet()) { COSBase value = pageDict.getObject(key); if (value instanceof COSArray) { COSArray array = (COSArray) value; Iterator<COSBase> iter = array.iterator(); while (iter.hasNext()) { if (iter.next() == null) { iter.remove(); } } } } super.processPage(page, pageNumber); } }之后用这个
SafeSplitter替代原生的Splitter执行拆分逻辑。升级PDFBox版本
查一下PDFBox 3.0.x的后续更新,官方可能已经修复了这个bug。如果有修复版,直接升级是最省心的方案。
应急处理
要是上面的方法都走不通,试试用其他工具把PDF转成PDF/A再转回普通PDF,或者换个第三方PDF库先预处理文件,确保COS对象结构合法后再用Splitter拆分。
内容的提问来源于stack exchange,提问作者contributor
相关产品推荐
相关产品推荐

