PDF 表格提取:复用前保留表头、单元格与来源证据
PDF 表格提取会重建原表的行、列和单元格内容,以便检查或复用。在给出待确认的解析值之前,应保留每个值对应的表头、原文标注的单位以及所有脚注。即使字符识别正确,放错列仍然属于重建错误。
能力状态:已有文档说明。 组件目录中已记录 Docling 和 Structured Output;Ai Flowi 尚未对本文所述的重建流程进行生产环境测试。没有已记录的组合工作流结果。
作者:Ai Flowi · 发布于
官方来源:Docling 文档
先还原表格结构,再解释业务字段
审核过程中应始终保留原始来源、表格标识和版本。记录审核者确实能找到的来源定位信息,例如页码标识、表格标题、行键和表头路径。本练习中的这些定位锚点由人工提供,并非自动生成的版面坐标。
文档 AI 指南介绍如何从文档中选取指定字段。本文处理的是更早的一步:保留表格结构,确认原始单元格受哪个表头约束、是否为空,以及备注是否改变其单位。完整组件接口请参阅Docling 集成参考。
如果原始来源本身已是可信的结构化表格,应直接保留其结构,无须仅为重建而增加 OCR 或模型。对于 PDF 或图片,先确认所选读取方法能从获准使用的样本中生成可检查的内容。仅有 OCR 设置,并不能证明支持你的文件。
相关内容:Unstructured.io 文档解析:API 配置与结果检查。
检查这份包含三行数据的模拟原表
这张虚构报价卡标记为 SOURCE-CARD-A、表 A、第 2 版。合并的价格表头同时适用于两个价格列。R-B 的修订价单元格为空,没有印出的数字;R-C 中的零值则明确印在原表中。
在手机上,两张表都可以在各自的区域内滚动。用键盘将焦点移到相应区域,即可查看初始视图之外的列。
| 行键 | 每包数量 (件/包) | 价格(RM/包) | |
|---|---|---|---|
| 标价 | 修订价 | ||
| R-A | 12 | 24.00 | 22.00 |
| R-B | 6* | 18.00 | |
| R-C | 1 | 0.00 | 0.00 |
来源脚注 *:仅对 R-B,每包数量指每包所含的内盒数;每个内盒包含四件物品。
因此,R-B 原文写的是六个内盒,而不是六件物品。每包二十四件是依据脚注另行推导出的结果,并非提取出的单元格值。待确认的解析数量应保留为 6,单位为内盒/包,并保留脚注中的限定说明。
复制单元格重建工作表
每个单元格使用一条记录,避免展平数据时丢失表头和来源证据。以下字段表头是可复制的审核材料,并非承诺支持的上传格式,也不是原生的 output_schema 定义。
source_ref | table_ref | source_version | source_locator | header_path | row_key | printed_cell | printed_unit | proposed_parsed_value | cell_state | footnote | review_decision
本示例规则将 present、blank、unreadable 和 not_supplied 作为不同的工作表状态。空白指来源中可见但没有内容的单元格;无法辨读指单元格存在,但无法确定其中的字符;未提供指所需来源区域不在资料包内。这些状态都不能作为填入零值的依据。
| 行 / 表头路径 | 原始单元格内容 | 待确认的解析值 / 单位 | 状态与审核 |
|---|---|---|---|
| R-A / 每包数量 | 12 | 12 / 件/包 | 有值;核对数量表头。 |
| R-A / 价格 → 标价 | 24.00 | 24.00 / RM/包 | 有值;保留两级表头。 |
| R-A / 价格 → 修订价 | 22.00 | 22.00 / RM/包 | 有值;修订价与标价分别保留。 |
| R-B / 每包数量 | 6* | 6 / 内盒/包 | 有值;确认单位前先附上脚注 *。 |
| R-B / 价格 → 标价 | 18.00 | 18.00 / RM/包 | 有值;不因脚注而换算价格。 |
| R-B / 价格 → 修订价 | 来源单元格为空 | 无待确认的解析值 | 空白;价格仍不可用。 |
| R-C / 每包数量 | 1 | 1 / 件/包 | 有值;不能套用 R-B 的单位例外。 |
| R-C / 价格 → 标价 | 0.00 | 0.00 / RM/包 | 有值;保留原文明确写出的零值。 |
| R-C / 价格 → 修订价 | 0.00 | 0.00 / RM/包 | 有值;与 R-B 的空白区别处理。 |
上方的印刷来源示意是这些目标的独立参照。它们是人工编写的预期结果,并非从表格提取器捕获的输出。还应保留三个行键和两级价格表头;即使九条单元格记录看似都正确,也无法弥补行标识被对调的问题。
读取、审核,再将已确认文本结构化
示例配置,并非已记录的测试
将获准使用的源文件及其原件放在工作表旁,便于核对;按照模型连接参考配置自己的模型提供商账户和 API 密钥,其费用另行计收。
- 按照Docling 配置示例完成基础处理设置。
- 针对本次表格结构审核,将 Docling 的
do_picture_classification设为 false,检查其声明为 Table 的dataframe,确认 R-A、R-B、R-C 和两级价格表头;分类设置本身不提供单元格验收证据。 - 逐一将重建后的单元格、表头和脚注与原件比较。人工编写包含来源定位信息的已审核工作表文本。如果结果无法保留行列对应关系,应停止处理。
- 将已审核文本放入 Structured Output 必填的
input_value。Docling 的 Table 输出并未声明可直接连接到这个兼容 Message 的文本输入;本方案刻意采用人工交接。 - 参阅Structured Output 配置参考设置必填的
model和output_schema,通过schema_name将本工作表模式命名为cell_reconstruction,并把下方的单元格保留指令放入必填的system_prompt。 - 检查
structured_outputJSON 和dataframe_outputTable,确认包含九条独立单元格记录:R-B 的修订价必须保持空白,R-C 的两个价格则须保留原文中的零值。验证两种表示如何携带header_path和footnote;工作表中以竖线分隔的文本不是可导入的模式定义。
Represent only the supplied reviewed cell records. Preserve source version,
row key, complete header path, printed cell, unit, footnote and source locator.
Keep blank, unreadable and not-supplied states distinct from printed zero.
Do not fill missing prices, detach unit exceptions or turn derived quantities
into extracted values. Keep unresolved cells awaiting source review.
应将每个价格表头视为一条路径,而非孤立标签:价格表头提供 RM/包这一单位,标价或修订价则指定具体金额。如果将两者展平为单一价格字段,就会抹去 R-A 的 24.00 与 22.00 之间的区别。应分别按行和表头路径检查覆盖情况:重复一条 R-A 标价记录,可能让总数仍为九条,但 R-B 的标价单元格却缺失。仅凭记录数量不能判定工作表通过审核。
从 PDF 或图片提取表格,需要检查什么?
对于含可读文本的 PDF,检查读取顺序是否展平了合并表头,或将脚注移到了相邻行。对于图片或扫描 PDF,在 OCR 后检查数字、小数点、列边界和脚注标记。右侧列被裁掉时应标记为未提供;金额可见但无法辨读时应标记为无法辨读。
修改这份测试样例,尝试将 18.00 移到修订价列、删除 RM 表头、把空白单元格改成 0.00,或去掉 6* 中的星号。即使结构化输出可以解析,每个变体也都必须无法通过来源比对。删除脚注会使 R-B 的数量单位无法确认,不能因此退回使用该列的常规单位。
这些审核检查定义了预期失败情形,但没有实测通过率。组件目录并未为此配置确立自动坐标保真度、经校准的准确率、受支持的 OCR 安装环境或 Excel 导出能力。本文提供的是工作表,而非在线提取工具。
下游复用前,先确认表格结构
记录由谁比对表格结构、核对了哪个来源版本,以及哪些单元格仍未解决。小数格式发生变化时,应将待确认的解析值与其原始内容证据分开保存。下一步要约定字段含义,可使用数据字典模板;后续记录标识与转换结果的核对可参阅ETL 测试。
不要将未经检查的重建结果用于汇总、订单或自动决策。如果来源有更正,应保留旧证据并审核新版本;仅修改解析值,无法证明来源发生了什么变化。
套餐:Go 年付方案每月 USD8 起(月付 USD10),Plus 年付方案每月 USD16 起(月付 USD20),Pro 100 年付方案每月 USD80 起(月付 USD100),Pro 200 年付方案每月 USD160 起(月付 USD200),Pro 500 年付方案每月 USD400 起(月付 USD500),每月包含 5,000 至 250,000 个 Flowi Tokens,并支持充值;每次节点运行消耗 1 个 token;不包含第三方 API 和模型使用费用。