扫描件转文字还不够:PaddleOCR 把表格和版面也接上了

开源项目猫目发布于 来源:PaddleOCR 官方仓库与文档
沿一张官方中文报销表示例,看文字、单元格坐标和合并关系怎样一起留下来,再接到 Excel。

为什么值得关注

区分单纯文字识别和文档结构解析,按最终要拿到的内容选择处理路线。

适合谁:需要整理中文扫描材料、表格和文档图片的办公与资料处理人员

这次有哪些亮点

  • 表格结果分别保留文字、单元格坐标与HTML合并关系
  • 提供表格XLSX/HTML/JSON输出,整页解析还保留版面与阅读顺序

使用前需要知道

官方案例为空白报销表,只能说明相应结构输出;手写金额、计算和业务字段仍需另外处理,运行依赖按管线配置。

一张扫描表识出了所有字,复制到 Excel 后却还是没法用:表头不知对应哪一列,合并单元格被拆散,空白区域也失去了位置。对于这种材料,目标不是多得到一串文字,而是把字和格子重新放到一起。

PaddleOCR 同时提供文字识别与文档结构解析路线。PP-StructureV3 关注版面、阅读顺序、表格等元素,并将通用表格识别 v2 列为可用子产线。下面沿这条子产线的官方中文样例,看它实际交付了哪些内容。PP-StructureV3 官方文档

同一张报销表,除了文字还留下什么

官方表格教程使用一张空白报销表:上方依次是部门、报销人、报销事由和批准人,右侧则放单据数量、合计金额及费用分类。大块空白区域和右侧窄列交错,普通逐行文字列表无法表达这种关系。官方输入原图

PaddleOCR官方中文报销表示例,红框标出识别的单元格结构

官方表格识别 v2 的可视化结果,点击可看原尺寸。看右侧“其中”纵向跨过多个费用行,以及左侧的大块空白单元格;这是官方样例,不是本文运行结果。原始教程

对应输出里有三类东西:rec_texts 保存识别出的字,cell_box_list 保存单元格位置,pred_html 用 HTML 表格表达行列及合并关系。三者各有用途,不应把 JSON 里的文字数组直接当成整张表。

看一个具体位置:官方 pred_html 的第一行按顺序放入“部门”、空格、“报销人”、空格、“报销事由”、空格,最后的“批准人”单元格带有 colspan="2"。下一行左侧的大空格则带 colspan="6" rowspan="8",右边才是单据数量等小格。

这些标记的作用,是将“一格横跨几列、纵跨几行”保留下来。“其中”也以跨行单元格出现,右侧的车费、火车费等各占一行。只看文字,容易丢掉它们共同属于费用分类的关系;看表格结构,才知道文字原来摆在哪里。

想继续在 Excel 里用,已有直接出口

官方 Python 示例提供 save_to_xlsx(),可以将识别的表格保存为 XLSX;save_to_html() 用于查看表格,save_to_json() 则保留结构与坐标等结果。处理一张表时,不必先手工从文字数组拼出行列,再猜怎么转换成 Excel。表格识别 v2 使用示例

不过,这张官方材料是空白表单,能展示结构恢复,不能证明手写金额、实际票据或计算合计都已处理正确。导出的 XLSX 是识别材料的出口,不会自动变成符合自己财务台账字段的业务记录;表内单位、空值与后续字段映射仍属于另一层整理。

整页资料,为什么还要版面解析

表格子产线处理表格本身,PP-StructureV3 还要组织整页的标题、正文、图片与阅读顺序。它的结构化结果将版面内容与表格结果分开保存,方便后续既取出表格,也保留表格在文档里的上下文。

因此,截图摘一句话可以从文字识别开始;扫描材料中有完整表格、正文说明和多栏内容时,结构解析才更接近要拿走的成果。PaddleOCR 代码采用 Apache 2.0,本地使用仍要按所选管线安装依赖与模型。这个官方例子最清楚展示的是:空白也是表格结构的一部分,提取时不该因为那里没有字就消失。

原始资料:PaddleOCR 官方仓库与文档

以上为编辑整理,功能、许可与使用条件以官方说明为准。

返回每日分享