PDFBox v3.0.0读取StructTreeRoot中Pg与MCID信息时类型转换异常问题
解决PDFBox 3.0.0中COSObject转COSDictionary的ClassCastException问题
问题原因
你遇到的ClassCastException是因为PDF结构树中的元素可能以间接引用形式存储,被COSObject包装。直接把COSArray里的COSBase强转成COSDictionary会失败,因为实际拿到的是COSObject实例,而非直接的字典对象。
解决步骤
处理COSArray中的元素时,需要先判断并解包COSObject,再转换为COSDictionary:
- 检查当前
COSBase是否为COSObject类型,若是则调用getObject()获取内部真实COS对象 - 确认真实对象是
COSDictionary后,再进行强转操作
修改后的代码
File file = new File("document.pdf"); PDDocument originalDocument = Loader.loadPDF(file); PDDocumentCatalog catalog = originalDocument.getDocumentCatalog(); PDStructureTreeRoot structTree = catalog.getStructureTreeRoot(); COSBase KstructTree = structTree.getK(); COSDictionary Kdict = (COSDictionary) KstructTree; COSBase tagsDict = Kdict.getDictionaryObject(COSName.K); COSArray tagsArray = (COSArray) tagsDict; Iterator<COSBase> iteratorTagsArray = tagsArray.iterator(); while (iteratorTagsArray.hasNext()) { COSBase object = iteratorTagsArray.next(); // 解包COSObject,获取真实内部对象 if (object instanceof COSObject) { object = ((COSObject) object).getObject(); } // 确认类型后强转并处理 if (object instanceof COSDictionary) { COSDictionary object2 = (COSDictionary) object; // 提取页面引用和MCID COSBase pgRef = object2.getDictionaryObject(COSName.PG); COSBase mcid = object2.getDictionaryObject(COSName.K); System.out.println("页面引用: " + pgRef + ", MCID: " + mcid); } } originalDocument.close();
后续提取文本提示
拿到页面引用(Pg)和MCID后,可按以下步骤获取对应文本:
- 将
pgRef解包并转换为PDPage实例(若为间接引用需重复解包逻辑) - 通过
PDPage.getResources().getMarkedContentItems()获取标记内容,匹配MCID对应的文本片段
内容的提问来源于stack exchange,提问作者verapuah
相关产品推荐
相关产品推荐

