You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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后,可按以下步骤获取对应文本:

  1. 将pgRef解包并转换为PDPage实例(若为间接引用需重复解包逻辑)
  2. 通过PDPage.getResources().getMarkedContentItems()获取标记内容,匹配MCID对应的文本片段

内容的提问来源于stack exchange,提问作者verapuah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 08:17:35