如何将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
相关产品推荐
相关产品推荐

