表格单元格填充
概述
表格单元格填充是表格识别的第二阶段,在 TableMaster 输出 HTML 结构和单元格 bbox 后,将实际文字内容分配到对应单元格。根据 PDF 类型分为两条路径:文字型 PDF 走坐标对应,扫描件走 OCR。
关键内容
在 MinerU 流水线中的位置
阶段一:TableMaster 结构识别 → HTML 骨架 + 单元格 bbox
↓
阶段二:表格单元格填充 → 含文字的完整表格
文字型 PDF 的内容填充
对于文字型 PDF,表格内的文字在 PyMuPDF 提取的 Span层级结构 中已存在,只需坐标对应:
- 坐标转换:将单元格 bbox 从表格裁剪坐标转换为页面坐标
- 中心点匹配:找到中心点落在单元格内的所有 Span
- 阅读顺序排列:按 y 优先、x 次之排序,拼接为单元格内容
核心逻辑:
cell_spans = [span for span in page_spans
if point_in_box(span_center(span), cell_bbox_page)]
cell_spans.sort(key=lambda s: (s.bbox[1], s.bbox[0]))
cell.content = "".join(span.content for span in cell_spans)
扫描件的内容填充
扫描件需要对每个单元格区域单独做 OCR:
- 裁剪单元格:根据 bbox 从表格图像中裁剪,加 padding 避免裁剪到边框线
- 单元格 OCR:对小块区域做 OCR(内容短,速度快)
- 文本拼接:将 OCR 结果拼接为单元格内容
核心逻辑:
padding = 3 # 避免裁剪到边框线
cell_img = table_image[y0+padding:y1-padding, x0+padding:x1-padding]
results = ocr_engine.ocr(cell_img, cls=False)
cell.content = " ".join(text for line in results)
为什么分两条路径
| 路径 | 优势 | 适用场景 |
|---|---|---|
| Span 坐标对应 | 亚像素精度,无需 OCR,速度极快 | 文字型 PDF |
| OCR 逐单元格 | 处理扫描/图像内容 | 扫描件 PDF |
文字型 PDF 直接利用已有文字坐标,避免了 OCR 的误差和性能开销;扫描件则必须依赖 OCR,但逐单元格裁剪使 OCR 范围极小,速度和精度都有保障。
与跨单元格的关系
对于跨行/跨列单元格(colspan/rowspan),填充逻辑相同——只需将 bbox 覆盖的区域所有 Span/OCR 结果归入该单元格即可。TableMaster 已预测出正确的合并关系。
来源
- raw/assets/MinerU/minerU_06_table.md — MinerU 深度解析系列 · 第六篇:表格识别系统