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

如何用Python按图层提取PDF注释的位置与图层名?

提取PDF注释及其所属图层名的解决方案

问题分析

PDF注释的图层归属信息通常存储在注释对象的/OC(可选内容)条目里,指向对应的OCG(可选内容组,即图层)对象。PyPDF2 v3.0.1需要手动关联OCG对象与注释,而PyMuPDF(fitz)库能更直接地获取这一关联关系。


方法一:使用PyPDF2实现

步骤如下:

  1. 先解析页面的所有OCG图层,建立OCG对象引用ID到图层名的映射字典。
  2. 遍历注释时,检查注释是否带有/OC条目,通过引用ID匹配对应的图层名。

代码示例:

from PyPDF2 import PdfReader

reader = PdfReader("myFile.pdf")

for page in reader.pages:
    # 构建OCG ID到图层名的映射
    oc_map = {}
    if "/OCProperties" in page and "/OCGs" in page["/OCProperties"]:
        ocgs = page["/OCProperties"]["/OCGs"]
        for ocg_ref in ocgs:
            ocg_obj = ocg_ref.get_object()
            # 获取图层名(/Name字段对应的值)
            oc_name = ocg_obj.get("/Name", "Unnamed Layer")
            # 用对象引用的id作为映射键
            oc_map[id(ocg_obj)] = oc_name

    # 遍历注释并匹配对应图层
    if "/Annots" in page:
        for annot_ref in page["/Annots"]:
            annot_obj = annot_ref.get_object()
            location = annot_obj["/Rect"]
            layer_name = "Unassigned"
            # 检查注释是否关联了OC图层
            if "/OC" in annot_obj:
                oc_ref = annot_obj["/OC"]
                oc_obj = oc_ref.get_object()
                layer_name = oc_map.get(id(oc_obj), "Unnamed Layer")
            # 输出目标格式
            print(f'{{ "layerName": "{layer_name}", "location" : {location} }}')

方法二:使用PyMuPDF(fitz)实现(更简洁)

PyMuPDF对PDF图层和注释的支持更友好,可直接获取注释的所属图层名:

代码示例:

import fitz  # PyMuPDF

doc = fitz.open("myFile.pdf")

for page in doc:
    # 遍历页面所有注释
    for annot in page.annots():
        # 获取注释所属图层名,未分配则设为"Unassigned"
        layer_name = annot.layer_name if annot.layer_name else "Unassigned"
        # 将边界框转换为列表格式
        location = list(annot.rect)
        # 输出目标格式
        print(f'{{ "layerName": "{layer_name}", "location" : {location} }}')

说明:

  • annot.rect返回fitz.Rect对象,用list()转换为数值列表即可匹配需求格式。
  • 若注释未绑定任何图层,annot.layer_name会返回None,这里统一处理为"Unassigned"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:33:19