结构化 PDF 解析器¶
使用 StructuredPDFParser 的综合指南。
概述¶
StructuredPDFParser 是 Doctra 中的基础解析器,设计用于通用 PDF 文档处理。它结合了布局检测、OCR 和可选的 VLM 集成,从 PDF 文档中提取所有内容。
主要特性¶
- 布局检测:基于 PaddleOCR 的文档结构分析
- OCR 处理:从所有文档元素中提取文本
- 视觉元素提取:自动裁剪图形、图表和表格
- VLM 集成:可选的结构化数据提取
- 分割表格合并:自动检测和合并跨页分割的表格
- 多种输出格式:Markdown、HTML、Excel、JSON
基本用法¶
from doctra import StructuredPDFParser
# 使用默认值初始化解析器
parser = StructuredPDFParser()
# 解析文档
parser.parse("document.pdf")
配置¶
有关详细参数文档,请参阅 API 参考。
分割表格合并¶
StructuredPDFParser 包含一个高级功能,可以自动检测和合并跨多个页面分割的表格。这对于处理财务报告、数据表格和其他大型表格跨页面边界的文档特别有用。
工作原理¶
分割表格检测使用两阶段方法,结合空间启发式方法和结构分析:
阶段 1:邻近检测¶
系统首先使用基于位置的启发式方法识别候选表格对:
- 位置检查:
- 第一个表格段必须接近其页面底部(默认在 20% 以内)
-
第二个表格段必须接近下一页的顶部(默认在 15% 以内)
-
水平对齐:
- 表格必须具有显著的水平重叠(至少 50%)
-
这确保它们在页面上垂直对齐
-
间隙分析:
- 测量第一个表格结束和第二个表格开始之间的间隙
- 间隙考虑分页、页眉和页脚
-
默认最大允许间隙为页面高度的 25%
-
宽度相似性:
- 两个表格段必须具有相似的宽度(差异在 20% 以内)
- 这确保它们属于同一个表格结构
阶段 2:结构验证¶
一旦邻近检查通过,系统使用 OpenCV 的 **LSD(线段检测器)**执行更深层的结构分析:
- 列检测:
- LSD 检测两个表格段中的垂直线
- 这些线代表列边界
-
算法是自适应的,适用于不同的表格结构,无需参数调整
-
列数匹配:
- 系统比较两个段中检测到的列数
-
容差基于表格大小自适应:
- 小表格(≤5 列):允许 1 列差异
- 中等表格(6-10 列):允许 2 列差异
- 大型表格(11-20 列):允许 15% 差异或最少 3 列
-
列对齐:
- 比较段之间列的相对位置
- 至少 60% 的列必须在容差内对齐(默认 10 像素)
-
这确保结构连续性
-
置信度评分:
- 基于以下因素计算置信度分数(0-1):
- 列数匹配
- 列对齐质量
- 宽度相似性
- 重叠比率
- 只有置信度 ≥ 0.65(默认)的匹配才会被合并
回退机制¶
系统包含针对边缘情况的智能回退:
-
检测到太多列:如果 LSD 检测到 >20 列,可能表示噪声(水平线、文本边界)。系统回退到基于邻近的匹配,置信度较低。
-
未检测到列:对于无边框表格或图像质量差的情况,如果在任一段中未检测到列,系统使用基于邻近的匹配。
-
噪声过滤:系统过滤掉太靠近图像边缘的列(可能是伪影)。
启用分割表格合并¶
from doctra import StructuredPDFParser
# 使用默认设置启用分割表格合并
parser = StructuredPDFParser(
merge_split_tables=True
)
# 解析文档 - 分割表格将自动合并
parser.parse("document.pdf")
配置选项¶
parser = StructuredPDFParser(
merge_split_tables=True,
# 位置阈值
bottom_threshold_ratio=0.20, # 距离页面底部 20%
top_threshold_ratio=0.15, # 距离页面顶部 15%
# 间隙容差
max_gap_ratio=0.25, # 页面高度的 25% 最大间隙
# 结构验证
column_alignment_tolerance=10.0, # 列对齐的像素容差
min_merge_confidence=0.65, # 合并的最小置信度(0-1)
)
参数详情¶
| 参数 | 默认值 | 描述 |
|---|---|---|
merge_split_tables |
False |
启用/禁用分割表格检测 |
bottom_threshold_ratio |
0.20 |
检测页面底部附近表格的比率(0-1) |
top_threshold_ratio |
0.15 |
检测页面顶部附近表格的比率(0-1) |
max_gap_ratio |
0.25 |
表格之间的最大允许间隙(考虑页眉/页脚) |
column_alignment_tolerance |
10.0 |
列对齐验证的像素容差 |
min_merge_confidence |
0.65 |
合并表格所需的最小置信度分数(0-1) |
输出¶
当检测到并合并分割表格时:
- 合并图像:创建单个合成图像,组合两个表格段
- Markdown 输出:合并的表格在 markdown 中出现一次,并带有指示它跨多个页面的注释
- HTML 输出:与 markdown 类似,合并的表格作为单个元素出现
- 文件位置:合并的表格保存为
tables/目录中的merged_table_{page1}_{page2}.png
示例输出注释:
何时使用¶
在以下情况下启用分割表格合并:
- 处理包含跨多个页面的大型表格的文档
- 处理财务报告、数据表格或结构化文档
- 您希望在单个视图中获得完整的表格上下文
- 表格经常跨页面边界分割
在以下情况下考虑禁用:
- 表格在页面之间是故意分开的
- 处理速度至关重要(会增加少量开销)
- 文档结构不一致
技术详情¶
算法:检测使用 OpenCV 的 LSD(线段检测器),它是: - 自适应的:适用于不同的表格结构,无需参数调整 - 鲁棒的:处理各种线条样式(实线、虚线、部分断开) - 高效的:快速处理,适合批量操作
预处理:在列检测之前,图像经过: - 灰度转换 - 对比度增强(CLAHE) - 二进制阈值化(OTSU) - 形态学操作以连接断开的线
聚类:检测到的线段使用基于图像宽度的自适应阈值进行聚类,确保同一列边界的多次检测合并为单个列标记。
有关完整的详细说明(包括可视化架构和示例),请参阅分割表格合并指南。
输出结构¶
何时使用¶
在以下情况下使用 StructuredPDFParser:
- 通用 PDF 处理
- 高质量文档
- 不需要图像恢复时
- 提取所有内容类型