首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >使用spaCy处理PDF和Word文档的技术指南

使用spaCy处理PDF和Word文档的技术指南

原创
作者头像
用户11764306
发布2025-10-30 06:12:38
发布2025-10-30 06:12:38
1150
举报

spaCy Layout:使用spaCy处理PDF、Word文档等

该插件与Docling集成,将PDF、Word文档和其他输入格式的结构化处理引入spaCy管道。它输出清洁的结构化数据,创建spaCy的Doc对象,可访问带标签的文本跨度(如章节或标题),并将表格数据转换为pandas.DataFrame。

安装

⚠️ 此包需要Python 3.10或更高版本。

代码语言:bash
复制
pip install spacy-layout

使用方法

初始化spaCyLayout预处理器后,可调用文档路径将其转换为结构化数据。生成的Doc对象包含布局跨度,映射到原始文本并暴露各种属性。

代码语言:python
复制
import spacy
from spacy_layout import spaCyLayout

nlp = spacy.blank("en")
layout = spaCyLayout(nlp)

# 处理文档并创建spaCy Doc对象
doc = layout("./starcraft.pdf")

# 文档的基于文本的内容
print(doc.text)
# 文档布局包括页面和页面尺寸
print(doc._.layout)
# 文档中的表格及其提取的数据
print(doc._.tables)
# 文档的Markdown表示
print(doc._.markdown)

# 不同部分的布局跨度
for span in doc.spans["layout"]:
    # 文档部分和文本字符偏移
    print(span.text, span.start, span.end, span.start_char, span.end_char)
    # 部分类型,如"text"、"title"、"section_header"等
    print(span.label_)
    # 部分的布局特征,包括边界框
    print(span._.layout)
    # 最接近该跨度的标题
    print(span._.heading)

批量处理

如需大规模处理文档,可使用spaCyLayout.pipe方法:

代码语言:python
复制
paths = ["one.pdf", "two.pdf", "three.pdf", ...]
for doc in layout.pipe(paths):
    print(doc._.layout)

表格和表格数据

表格包含在标签为"table"的布局跨度中,可通过Doc._.tables访问。它们暴露布局扩展属性以及data属性,包含转换为pandas.DataFrame的表格数据。

代码语言:python
复制
for table in doc._.tables:
    # 令牌位置和边界框
    print(table.start, table.end, table._.layout)
    # 内容的pandas.DataFrame
    print(table._.data)

序列化

处理文档后,可将结构化Doc对象序列化为spaCy的高效二进制格式:

代码语言:python
复制
from spacy.tokens import DocBin

docs = layout.pipe(["one.pdf", "two.pdf", "three.pdf"])
doc_bin = DocBin(docs=docs, store_user_data=True)
doc_bin.to_disk("./file.spacy")

API参考

数据和扩展属性

属性

类型

描述

Doc._.layout

DocLayout

文档的布局特征

Doc._.pages

list[tuplePageLayout, listSpan]

文档中的页面及其包含的跨度

Doc._.tables

listSpan

文档中的所有表格

Doc._.markdown

str

文档的Markdown表示

Doc.spans"layout"

spacy.tokens.SpanGroup

文档中的布局跨度

Span.label_

str

提取的布局跨度类型

Span._.layout

SpanLayout | None

布局跨度的布局特征

Span._.heading

Span | None

最接近跨度的标题

Span._.data

pandas.DataFrame | None

表格跨度的提取数据

PageLayout数据类

属性

类型

描述

page_no

int

页码(从1开始)

width

float

页面宽度(像素)

height

float

页面高度(像素)

DocLayout数据类

属性

类型

描述

pages

listPageLayout

文档中的页面

SpanLayout数据类

属性

类型

描述

x

float

边界框的水平偏移(像素)

y

float

边界框的垂直偏移(像素)

width

float

边界框宽度(像素)

height

float

边界框高度(像素)

page_no

int

跨度所在的页码

示例代码

使用matplotlib可视化页面和边界框

代码语言:python
复制
import pypdfium2 as pdfium
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
import spacy
from spacy_layout import spaCyLayout

DOCUMENT_PATH = "./document.pdf"

# 加载并将PDF页面转换为图像
pdf = pdfium.PdfDocument(DOCUMENT_PATH)
page_image = pdf[2].render(scale=1)  # 获取第3页(索引2)
numpy_array = page_image.to_numpy()

# 使用spaCy处理文档
nlp = spacy.blank("en")
layout = spaCyLayout(nlp)
doc = layout(DOCUMENT_PATH)

# 获取第3页布局和部分
page = doc._.pages[2]
page_layout = doc._.layout.pages[2]

# 创建图形和坐标轴
fig, ax = plt.subplots(figsize=(12, 16))
ax.imshow(numpy_array)

# 为每个部分的边界框添加矩形
for section in page[1]:
    rect = Rectangle(
        (section._.layout.x, section._.layout.y),
        section._.layout.width,
        section._.layout.height,
        fill=False,
        color="blue",
        linewidth=1,
        alpha=0.5
    )
    ax.add_patch(rect)
    ax.text(
        section._.layout.x,
        section._.layout.y,
        section.label_,
        fontsize=8,
        color="red",
        verticalalignment="bottom"
    )

ax.axis("off")
plt.show()

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • spaCy Layout:使用spaCy处理PDF、Word文档等
    • 安装
    • 使用方法
    • 批量处理
    • 表格和表格数据
    • 序列化
    • API参考
      • 数据和扩展属性
      • PageLayout数据类
      • DocLayout数据类
      • SpanLayout数据类
    • 示例代码
      • 使用matplotlib可视化页面和边界框
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档