PDF 表格提取:复用前保留表头、单元格与来源证据

PDF 表格提取会重建原表的行、列和单元格内容,以便检查或复用。在给出待确认的解析值之前,应保留每个值对应的表头、原文标注的单位以及所有脚注。即使字符识别正确,放错列仍然属于重建错误。

能力状态:已有文档说明。 组件目录中已记录 Docling 和 Structured Output;Ai Flowi 尚未对本文所述的重建流程进行生产环境测试。没有已记录的组合工作流结果。

作者:Ai Flowi · 发布于

先还原表格结构,再解释业务字段

审核过程中应始终保留原始来源、表格标识和版本。记录审核者确实能找到的来源定位信息,例如页码标识、表格标题、行键和表头路径。本练习中的这些定位锚点由人工提供,并非自动生成的版面坐标。

文档 AI 指南介绍如何从文档中选取指定字段。本文处理的是更早的一步:保留表格结构,确认原始单元格受哪个表头约束、是否为空,以及备注是否改变其单位。完整组件接口请参阅Docling 集成参考。

如果原始来源本身已是可信的结构化表格,应直接保留其结构,无须仅为重建而增加 OCR 或模型。对于 PDF 或图片,先确认所选读取方法能从获准使用的样本中生成可检查的内容。仅有 OCR 设置,并不能证明支持你的文件。

相关内容:Unstructured.io 文档解析:API 配置与结果检查。

检查这份包含三行数据的模拟原表

这张虚构报价卡标记为 SOURCE-CARD-A、表 A、第 2 版。合并的价格表头同时适用于两个价格列。R-B 的修订价单元格为空,没有印出的数字;R-C 中的零值则明确印在原表中。

在手机上,两张表都可以在各自的区域内滚动。用键盘将焦点移到相应区域,即可查看初始视图之外的列。

SOURCE-CARD-A / 表 A / 第 2 版:模拟印刷原表
行键每包数量
(件/包)
价格(RM/包)
标价修订价
R-A1224.0022.00
R-B6*18.00
R-C10.000.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 作为不同的工作表状态。空白指来源中可见但没有内容的单元格;无法辨读指单元格存在,但无法确定其中的字符;未提供指所需来源区域不在资料包内。这些状态都不能作为填入零值的依据。

为全部九个数据单元格人工设定的目标;所有记录的来源与版本均为 SOURCE-CARD-A / A / 2
行 / 表头路径原始单元格内容待确认的解析值 / 单位状态与审核
R-A / 每包数量1212 / 件/包有值;核对数量表头。
R-A / 价格 → 标价24.0024.00 / RM/包有值;保留两级表头。
R-A / 价格 → 修订价22.0022.00 / RM/包有值;修订价与标价分别保留。
R-B / 每包数量6*6 / 内盒/包有值;确认单位前先附上脚注 *。
R-B / 价格 → 标价18.0018.00 / RM/包有值;不因脚注而换算价格。
R-B / 价格 → 修订价来源单元格为空无待确认的解析值空白;价格仍不可用。
R-C / 每包数量11 / 件/包有值;不能套用 R-B 的单位例外。
R-C / 价格 → 标价0.000.00 / RM/包有值;保留原文明确写出的零值。
R-C / 价格 → 修订价0.000.00 / RM/包有值;与 R-B 的空白区别处理。

上方的印刷来源示意是这些目标的独立参照。它们是人工编写的预期结果,并非从表格提取器捕获的输出。还应保留三个行键和两级价格表头;即使九条单元格记录看似都正确,也无法弥补行标识被对调的问题。

读取、审核,再将已确认文本结构化

示例配置,并非已记录的测试

将获准使用的源文件及其原件放在工作表旁,便于核对;按照模型连接参考配置自己的模型提供商账户和 API 密钥,其费用另行计收。

  1. 按照Docling 配置示例完成基础处理设置。
  2. 针对本次表格结构审核,将 Docling 的 do_picture_classification 设为 false,检查其声明为 Table 的 dataframe,确认 R-A、R-B、R-C 和两级价格表头;分类设置本身不提供单元格验收证据。
  3. 逐一将重建后的单元格、表头和脚注与原件比较。人工编写包含来源定位信息的已审核工作表文本。如果结果无法保留行列对应关系,应停止处理。
  4. 将已审核文本放入 Structured Output 必填的 input_value。Docling 的 Table 输出并未声明可直接连接到这个兼容 Message 的文本输入;本方案刻意采用人工交接。
  5. 参阅Structured Output 配置参考设置必填的 model 和 output_schema,通过 schema_name 将本工作表模式命名为 cell_reconstruction,并把下方的单元格保留指令放入必填的 system_prompt。
  6. 检查 structured_output JSON 和 dataframe_output Table,确认包含九条独立单元格记录: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 和模型使用费用。