在Python的spaCy Layout中调用Docling功能的技术咨询
在Python的spaCy Layout中调用Docling功能的技术咨询
嘿,我完全懂你现在的困扰——spaCy-layoutparser主打文本布局解析,用span.label_ == "picture"确实行不通,毕竟spaCy的Span对象天生就是用来处理文本范围的。不过结合Docling的能力来实现你要的统计图片、导出图片,甚至区分页眉页脚logo和正文图片的需求,完全是可以做到的,我给你梳理几个实用的实现思路:
1. 先单独用Docling提取图片的完整元数据
Docling对文档里的视觉元素(包括各种图片)处理能力很强,你可以先用它把文档全量解析一遍,把所有图片的位置、所属区域、内容都提取出来存成结构化数据,这样后续和spaCy的结果关联就方便了:
from docling.document_converter import DocumentConverter # 初始化Docling转换器并解析文档 converter = DocumentConverter() doc = converter.convert("你的目标文档.pdf") # 提取所有图片的详细信息 image_records = [] for page in doc.pages: page_height = page.mediabox[3] # 获取页面总高度,用来判断页眉页脚 for img in page.images: # 图片的边界框坐标,格式是(x1, y1, x2, y2),左上角为原点 img_bbox = img.bbox # 简单判断是否在页眉页脚区域(这里用页面上下10%的高度作为阈值,你可以根据实际调整) is_header_footer = img_bbox[1] < page_height * 0.1 or img_bbox[3] > page_height * 0.9 # 把图片信息存进列表 image_records.append({ "page_num": page.page_number, "bbox": img_bbox, "is_logo_candidate": is_header_footer, "pil_image": img.image # 这是PIL Image对象,直接可以保存 }) # 统计正文区域的图片数量 body_image_count = sum(1 for img in image_records if not img["is_logo_candidate"]) print(f"正文里的图片一共有{body_image_count}张") # 导出正文区域的图片 for idx, img_info in enumerate(image_records): if not img_info["is_logo_candidate"]: img_info["pil_image"].save(f"正文图片_{idx}.png")
2. 和spaCy Layout的布局结果做关联匹配
如果你已经用spaCy-layoutparser得到了文档的布局块(比如页眉、页脚、正文这些标签),可以把Docling提取的图片坐标和这些布局块的坐标做匹配,更精准地判断图片所属区域:
import spacy from spacy_layoutparser import LayoutParserComponent # 初始化spaCy和布局解析组件 nlp = spacy.load("en_core_web_sm") nlp.add_pipe("layoutparser") # 用Docling的OCR文本喂给spaCy(这样布局解析更准确) doc_spacy = nlp(doc.text) # 定义一个辅助函数,判断图片bbox是否落在某个布局块里 def is_image_in_layout(img_bbox, layout_bbox): return (img_bbox[0] >= layout_bbox[0] and img_bbox[1] >= layout_bbox[1] and img_bbox[2] <= layout_bbox[2] and img_bbox[3] <= layout_bbox[3]) # 遍历每个布局块,匹配对应的图片 for layout_block in doc_spacy._.layout: layout_label = layout_block.label layout_bbox = layout_block.bbox # 找到当前布局块内的所有图片 matched_images = [img for img in image_records if is_image_in_layout(img["bbox"], layout_bbox)] if layout_label in ["header", "footer"]: # 标记这些图片为logo,后续处理时忽略 for img in matched_images: img["is_logo"] = True else: # 正文区域的图片,这里可以加你需要的后续处理逻辑 for img in matched_images: print(f"找到正文区域图片,页码:{img['page_num']}") # 比如可以在这里调用图片分析工具,或者做其他处理
几个实用小提示
- Docling的
page.images不管是原生PDF里的嵌入式图片,还是扫描件里的图片都能识别,因为它本身集成了OCR能力,兼容性很强。 - 如果你觉得用高度阈值判断页眉页脚不够准,可以结合spaCy-layoutparser识别的布局标签交叉验证,这样准确率会更高。
- 保存图片的时候,Docling返回的
img.image是标准的PIL Image对象,直接用save()方法就能导出为PNG、JPG等格式,非常方便。
备注:内容来源于stack exchange,提问作者Virtual Architectures
相关产品推荐
相关产品推荐

