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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 06:39:30