如何用Python按图层提取PDF注释的位置与图层名?
提取PDF注释及其所属图层名的解决方案
问题分析
PDF注释的图层归属信息通常存储在注释对象的/OC(可选内容)条目里,指向对应的OCG(可选内容组,即图层)对象。PyPDF2 v3.0.1需要手动关联OCG对象与注释,而PyMuPDF(fitz)库能更直接地获取这一关联关系。
方法一:使用PyPDF2实现
步骤如下:
- 先解析页面的所有OCG图层,建立OCG对象引用ID到图层名的映射字典。
- 遍历注释时,检查注释是否带有
/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
相关产品推荐
相关产品推荐

