Type: concept
Confidence: 0.80
Created: 2026-04-18
Updated: 2026-04-18
Tags: 文档解析PDF处理表格处理文档处理

表格单元格填充

概述

表格单元格填充是表格识别的第二阶段,在 TableMaster 输出 HTML 结构和单元格 bbox 后,将实际文字内容分配到对应单元格。根据 PDF 类型分为两条路径:文字型 PDF 走坐标对应,扫描件走 OCR。

关键内容

在 MinerU 流水线中的位置

表格单元格填充是 MinerU 双阶段表格识别第二阶段

阶段一:TableMaster 结构识别 → HTML 骨架 + 单元格 bbox
                                    ↓
阶段二:表格单元格填充 → 含文字的完整表格

文字型 PDF 的内容填充

对于文字型 PDF,表格内的文字在 PyMuPDF 提取的 Span层级结构 中已存在,只需坐标对应:

  1. 坐标转换:将单元格 bbox 从表格裁剪坐标转换为页面坐标
  2. 中心点匹配:找到中心点落在单元格内的所有 Span
  3. 阅读顺序排列:按 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:

  1. 裁剪单元格:根据 bbox 从表格图像中裁剪,加 padding 避免裁剪到边框线
  2. 单元格 OCR:对小块区域做 OCR(内容短,速度快)
  3. 文本拼接:将 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 已预测出正确的合并关系。

来源

相关