
本文介绍在使用 google vision api 处理图像型 pdf 表格时,针对多行单元格文本被垂直切分为多个独立文本块的问题,提供基于坐标聚类与网格对齐的可靠重建策略。
本文介绍在使用 google vision api 处理图像型 pdf 表格时,针对多行单元格文本被垂直切分为多个独立文本块的问题,提供基于坐标聚类与网格对齐的可靠重建策略。
在 OCR 表格解析中,一个常见却棘手的问题是:当单元格内含换行文本(如地址、备注、长描述)时,Google Vision API 倾向于将每行视为独立 text_annotation 或 block,仅依据其边界框(bounding box)的 y 坐标进行粗粒度排序,而忽略其所属逻辑单元格的上下文。这导致原始表格结构坍塌——例如“Manufactured”、“Dataline_1”、“Address”、“Dataline_2”、“Dataline_3”本属同一行的五个列,但因某列(如第二列)含两行文本,其第二行(Dataline_2)可能被误排到其他列下方,最终输出顺序错乱。
解决该问题的关键不在于强行按 y 坐标全局排序,而在于先还原表格物理结构,再做文本归属映射。推荐采用两阶段策略:
1. 构建表格网格(Cell Detection)
利用 Vision API 返回的 full_text_annotation 中的 pages[].blocks[].paragraphs[].words[].bounding_box.vertices 获取所有文本坐标;同时,通过 OpenCV 或 cv2.HoughLinesP 检测图像中的水平线与垂直线,或使用 camelot-py / tabula-py(针对 PDF 渲染图)提取表格线框。最终生成规则网格(如 4×5 的 cell 坐标矩阵),每个 cell 定义为 (x_min, y_min, x_max, y_max)。
2. 文本块归属与行内排序
对每个检测到的文本块(word 或 paragraph),计算其中心点 (cx, cy) = ((x_min+x_max)/2, (y_min+y_max)/2),并将其分配给中心点落入范围内的唯一 cell(可使用 shapely.geometry.Point.within(shapely.geometry.Polygon(cell_bbox)) 精确判断)。随后,在每个 cell 内部,仅对该 cell 下属的所有文本块按 cy(y 坐标)升序排列,即可自然恢复多行文本的阅读顺序。
from shapely.geometry import Point, Polygon
def assign_texts_to_cells(text_blocks, cell_polygons):
cell_texts = {i: [] for i in range(len(cell_polygons))}
for block in text_blocks:
cx, cy = (block['x0'] + block['x1']) / 2, (block['y0'] + block['y1']) / 2
p = Point(cx, cy)
for idx, poly in enumerate(cell_polygons):
if p.within(poly):
cell_texts[idx].append((cy, block['text']))
break
# 按 y 排序并拼接
return [
' '.join([t for _, t in sorted(cell_texts[i], key=lambda x: x[0])])
for i in range(len(cell_polygons))
]
# 示例:假设已获得 5 个 cell 的多边形列表与 8 个文本块
# result_row = assign_texts_to_cells(word_blocks, [cell0_poly, ..., cell4_poly])⚠️ 注意事项:
- 若表格无线条(如纯排版式表格),建议改用
layoutparser+detectron2模型识别表头/单元格区域; - 对高度重叠或倾斜文本,需先做仿射校正(
cv2.getRotationMatrix2D); - Vision API 的
text_annotations缺少显式 word-level bounding box 时,可用paragraphs[].bounding_box降级处理,但精度略低; - 最终导出 CSV/Excel 前,务必对每行 cell 文本做
.strip().replace('\n', ' ')清洗,避免残留换行符。
该方法将“语义归属”前置,从根本上规避了全局 y 排序的陷阱,已在金融报表、医疗表单等复杂多行表格 OCR 项目中稳定支持 98%+ 的单元格内容保序还原。

















