zhch158_admin 02ee248bbd fix: 移除多余的默认值设置,优化手动调整功能的行列修改逻辑 1 day ago
..
editor 02ee248bbd fix: 移除多余的默认值设置,优化手动调整功能的行列修改逻辑 1 day ago
README.md 880446a21e docs: 更新README.md,添加可视化编辑器的配置说明 3 days ago
streamlit_table_line_editor.py b7b1d5e55d feat: 优化新建标注模式,添加分析参数设置和分析按钮功能 2 days ago
table_line_generator.py 74c95e92f5 feat: 添加无图片模式以仅分析表格结构,优化行列边界计算逻辑 1 day ago
table_line_generator.yaml 0562a5f7b1 feat: 添加对B用户扫描流水的支持,更新数据源配置 2 days ago
table_template_applier.py adb6af311f feat: 支持混合模式,优化模板应用逻辑并增强OCR数据处理 1 day ago

README.md

📏 表格线生成工具

基于 OCR bbox 结果自动生成表格线,提升无线表格识别准确率

🎯 功能概述

通过 OCR 识别的文本框位置(bbox)自动推测表格结构,生成标准表格线,然后应用 PPStructure 有线表格识别,显著提升准确率。

核心功能

  • 自动检测:基于 OCR bbox 自动分析行列结构
  • 可视化调整:Streamlit 界面支持人工微调表格线位置
  • 模板复用:将标注好的表格结构应用到同类型的其他页面
  • 批量处理:一键应用模板到整个文件夹

📋 完整流程

OCR识别(bbox) → 自动分析 → 人工调整 → 保存模板 → 批量应用 → PPStructure识别

🚀 快速开始

1️⃣ 准备数据

确保有以下文件:

  • OCR 结果 JSON:包含文本框坐标(bbox)
  • 对应图片:PNG 或 JPG 格式

支持的 OCR 格式:

  • PaddleOCR PPStructure V3 格式
  • 标准 OCR 格式(含 textbbox 字段)

2️⃣ 打开可视化编辑器

# 读取缺省配置文件./table_line_generator.yaml
streamlit run streamlit_table_line_editor.py

# 关键是在入口脚本名后加 --,后面的参数才会传递给脚本自身
streamlit run streamlit_table_line_editor.py -- --config /path/to/custom.yaml

3️⃣ 新建标注(第一页)

选择模式

在侧边栏选择 🆕 新建标注

上传文件

  • 上传 OCR 结果 JSON(如 康强_page_001.json
  • 上传 对应图片(如 康强_page_001.png

调整参数

  • Y轴聚类容差:控制行检测的灵敏度(默认 5)
  • X轴聚类容差:控制列检测的灵敏度(默认 10)
  • 最小行高:过滤高度过小的行(默认 20)

分析并调整

  1. 点击 🔍 分析表格结构
  2. 查看检测结果(行数、列数、横线数、竖线数)
  3. 使用 🛠️ 手动调整 功能微调:
    • 调整横线/竖线位置
    • 添加横线/竖线
    • 删除横线/竖线

保存配置

  1. 勾选 保存表格结构配置
  2. 勾选 保存表格线图片(可选)
  3. 选择线条颜色(黑色/蓝色/红色)
  4. 点击 💾 保存

生成文件:

  • 康强_page_001_structure.json - 表格结构配置
  • 康强_page_001_with_lines.png - 带表格线的图片

4️⃣ 加载已有标注(继续调整)

选择模式

在侧边栏选择 📂 加载已有标注

上传文件

  • 上传 配置文件(如 康强_page_001_structure.json
  • 上传 对应图片(可选,用于查看效果)

继续调整

  • 使用相同的调整功能修改表格线
  • 保存更新后的配置

5️⃣ 批量应用模板

将标注好的表格结构应用到同类型的其他页面。

命令行方式

单文件模式:

python table_template_applier.py \
  --template output/table_structures/康强_page_001_structure.json \
  --image-file data/康强_page_002.png \
  --json-file data/康强_page_002.json \
  --output-dir output/batch_results \
  --width 2 \
  --color black

批量模式:

python table_template_applier.py \
  --template output/table_structures/康强_page_001_structure.json \
  --image-dir data/images \
  --json-dir data/jsons \
  --output-dir output/batch_results \
  --width 2 \
  --color black

无参数快速运行

直接运行会使用默认配置:

python table_template_applier.py

6️⃣ 使用 PPStructure 识别有线表格

python batch_ocr/batch_process_pdf.py \
  -p ppstructv3 \
  -f output/batch_results/image_list.txt \
  -o output/ppstructv3_results

📊 参数说明

表格结构分析参数

参数 默认值 说明
Y轴聚类容差 5 相近行的Y坐标容差(像素)
X轴聚类容差 10 相近列的X坐标容差(像素)
最小行高 20 过滤掉高度过小的行(像素)

绘图参数

参数 选项 说明
线条宽度 1-5 表格线的粗细
线条颜色 black/blue/red 保存时的线条颜色

显示参数

参数 说明
显示模式 对比显示 / 仅显示划线图 / 仅显示原图
图片缩放 0.25x - 2.0x
显示线条编号 是否显示 R1, C1 等编号

🎨 功能详解

自动检测算法

行检测:

  1. 提取所有文本框的 Y 坐标
  2. 按 Y 坐标排序
  3. 聚类相近的 Y 坐标(容差内)
  4. 过滤高度过小的行

列检测:

  1. 提取所有文本框的 X 坐标(左边界和右边界)
  2. 聚类相近的 X 坐标
  3. 生成列分界线

行高计算:

  • 排除表头行(通常较小)
  • 计算数据行高度的中位数
  • 用于批量应用时推算行数

模板应用原理

固定参数(从模板继承):

  • ✅ 表头高度
  • ✅ 数据行高度
  • ✅ 列宽列表
  • ✅ 列的相对位置

可变参数(自动检测):

  • 🔄 表格起始位置(锚点)
  • 🔄 行数(根据页面内容计算)

手动调整功能

功能 说明
调整横线 修改特定横线的 Y 坐标
调整竖线 修改特定竖线的 X 坐标
添加横线 在指定位置插入新横线
删除横线 批量删除选中的横线
添加竖线 在指定位置插入新竖线
删除竖线 批量删除选中的竖线
撤销/重做 支持多步操作回退

📁 输出文件说明

配置文件(*_structure.json

{
  "rows": [...],                    // 行区间列表
  "columns": [...],                 // 列区间列表
  "horizontal_lines": [700, 735, ...],  // 横线Y坐标
  "vertical_lines": [50, 180, ...],     // 竖线X坐标
  "header_height": 35,              // 表头高度
  "row_height": 59,                 // 数据行高度
  "col_widths": [130, 128, ...],    // 各列宽度
  "table_bbox": [x1, y1, x2, y2],   // 表格边界框
  "modified_h_lines": [0, 5],       // 修改过的横线索引
  "modified_v_lines": [2]           // 修改过的竖线索引
}

表格线图片(*_with_lines.png

  • 预览模式:彩色编号(红色=已修改,蓝色=原始)
  • 保存模式:纯黑色线条,无编号

批量结果(batch_results.json

[
  {
    "source": "/path/to/page_002.png",
    "output": "/path/to/page_002_with_lines.png",
    "structure": "/path/to/page_002_structure.json",
    "num_rows": 15,
    "status": "success"
  }
]

🎯 使用场景

场景 1:单页表格标注

适用于表格结构固定的文档(如银行流水、报表)

1. 标注第1页 → 保存配置
2. 应用到其他页面
3. 批量识别

场景 2:多模板管理

适用于包含多种表格格式的文档

1. 为每种格式标注一个模板
2. 根据页面类型选择对应模板
3. 分别批量应用

场景 3:迭代优化

适用于初次标注不满意的情况

1. 加载已有配置
2. 微调表格线位置
3. 保存更新后的配置
4. 重新批量应用

🔧 故障排查

问题 1:检测不到行列

原因:

  • Y/X 轴容差设置不当
  • OCR 结果质量差

解决:

  • 增大容差值
  • 使用更高质量的 OCR 模型

问题 2:表头高度不对

原因:

  • 表头行与数据行混在一起

解决:

  • 使用"调整横线"功能手动分离表头
  • 调整"最小行高"参数

问题 3:批量应用后位置偏移

原因:

  • 不同页面的表格起始位置不同

解决:

  • 检查 OCR 结果是否正确检测到第一行
  • 模板会自动适应不同起始位置

问题 4:列宽不一致

原因:

  • 不同页面的文本框宽度有细微差异

解决:

  • 适当增大 X 轴聚类容差
  • 手动调整有问题的竖线

📚 进阶技巧

技巧 1:快速定位问题线

在可视化界面中,已修改的线会标记为红色,方便追踪调整历史。

技巧 2:使用撤销功能

支持多步撤销/重做,可以放心尝试不同调整方案。

技巧 3:分段保存

处理长文档时,可以分段保存配置:

  • template_section1.json - 表头部分
  • template_section2.json - 数据部分

技巧 4:虚拟画布模式

即使没有图片,也可以加载配置文件查看坐标信息,方便检查配置正确性。

🤝 贡献指南

欢迎提交 Issue 和 Pull Request!

改进方向

  • 支持合并单元格检测
  • 支持斜线表头处理
  • 支持不规则表格(非矩形)
  • 导出为 Excel 格式
  • 命令行批量处理增强

📄 许可证

MIT License


作者: [Your Name]
最后更新: 2025-01-13