You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将EasyOCR提取的带坐标文本转为Excel表格?附PDF转PNG方法

从EasyOCR提取的带边界框数据中识别表格并导出Excel,及PDF转PNG方法

一、基于边界框识别表格并导出到Excel

你当前的代码直接用像素坐标作为Excel的行列号,会导致单元格位置混乱(比如Y坐标95对应第95行,浪费大量空白行)。正确思路是先按文本块的垂直位置(Y坐标)分组为行,再在每行内按水平位置(X坐标)排序为列,最后将整理好的行列数据写入Excel。

改进实现代码

from openpyxl import Workbook

# 示例EasyOCR识别结果
result = [
    [[[1395, 95], [1557, 95], [1557, 137], [1395, 137]], 'Nst'],
    [[[663, 197], [779, 197], [779, 239], [663, 239]], 'COPY'],
    [[[200, 248], [586, 248], [586, 394], [200, 394]], 'TOM CHRIS LDSAY Ardmore Search Partners 4US'],
    [[[1004, 248], [1369, 248], [1369, 485], [1004, 485]], 'COMMERCIAL CARDS DIVISION Cards Customer Services PO BOX 5000 SOUTHEND-ON-SEA SP2 9AM Telephone: 1243 673 3701 Facsimile: 1234 789 5281 Monday Friday: 08.00 18.00 Saturday: 09.00 13.00'],
    [[[210, 596], [544, 596], [544, 628], [210, 628]], '06 February 05 March 2024'],
    # 更多数据...
]

# 1. 计算每个文本块的中心Y坐标,用于判断行归属
text_blocks = []
for bbox, text in result:
    y_center = (bbox[0][1] + bbox[2][1]) / 2
    text_blocks.append({"y_center": y_center, "x_left": bbox[0][0], "text": text})

# 2. 按Y坐标分组,将Y差值小于阈值的归为同一行(阈值根据图像分辨率调整)
row_threshold = 50  # 可根据字体大小灵活调整
rows = []
# 先按Y中心排序文本块
text_blocks_sorted = sorted(text_blocks, key=lambda x: x["y_center"])

current_row = [text_blocks_sorted[0]]
for block in text_blocks_sorted[1:]:
    if block["y_center"] - current_row[0]["y_center"] < row_threshold:
        current_row.append(block)
    else:
        rows.append(current_row)
        current_row = [block]
rows.append(current_row)  # 加入最后一行

# 3. 每行内按X坐标排序,确定列顺序
sorted_rows = []
for row in rows:
    sorted_row = sorted(row, key=lambda x: x["x_left"])
    sorted_rows.append([block["text"] for block in sorted_row])

# 4. 写入Excel
wb = Workbook()
ws = wb.active

for row_idx, row_data in enumerate(sorted_rows, start=1):
    for col_idx, text in enumerate(row_data, start=1):
        ws.cell(row=row_idx, column=col_idx, value=text)

wb.save("output_table.xlsx")

关键说明

  • 行分组阈值:row_threshold需根据图像实际字体大小调整,确保同一行的文本块被分到一组。
  • 复杂表格处理:如果是带线条的表格,可先用OpenCV检测表格线条的边界框,再将文本块匹配到对应单元格中,需额外添加图像处理逻辑。

二、PDF转PNG的方法

EasyOCR不支持直接处理PDF,可通过以下Python工具将PDF每页转为PNG:

方法1:使用pdf2image库

先安装依赖:

pip install pdf2image

Windows用户需额外下载Poppler并配置环境变量,Linux/macOS可通过系统包管理器安装Poppler。

代码示例:

from pdf2image import convert_from_path

# 将PDF转为图像列表(每页对应一个图像对象)
pages = convert_from_path("input.pdf", dpi=300)  # dpi越高图像越清晰,处理速度越慢

# 保存每页为PNG
for idx, page in enumerate(pages):
    page.save(f"page_{idx+1}.png", "PNG")

方法2:使用PyMuPDF(fitz)

无需额外外部依赖,安装简便:

pip install pymupdf

代码示例:

import fitz  # PyMuPDF

doc = fitz.open("input.pdf")
for page_num in range(len(doc)):
    page = doc.load_page(page_num)
    # 3倍缩放对应约300dpi分辨率,可根据需求调整
    pix = page.get_pixmap(matrix=fitz.Matrix(3, 3))
    pix.save(f"page_{page_num+1}.png")

内容的提问来源于stack exchange,提问作者Drashti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 11:52:33