python将OCR识别的表格还原到excel中

本文介绍如何使用Python将OCR识别的表格数据整理并存入Excel文件,提供了相关代码示例,包括处理单元格宽高调整的方法。

将OCR识别结果写入excel,直接上代码:

# -*- coding: UTF-8 -*-
import pdfplumber
import pandas as pd
import time, json
import os, openpyxl
from openpyxl.utils import get_column_letter
from openpyxl.styles import Border, Side

file_path = r"D:\Date11\data_pdf_txt"
save_path = r"D:\Date11\data_pdf_excel111"
os.makedirs(save_path, exist_ok=True)
# 设置边框样式
def set_border(t_border, b_border, l_border, r_border, t_color='000000', b_color='000000', l_color='000000', r_color='000000'):
    border = Border(top=Side(border_style=t_border, color=t_color),
                    bottom=Side(border_style=b_border, color=b_color),
                    left=Side(border_style=l_border, color=l_color),
                    right=Side(border_style=r_border, color=r_color))
    return border
#设置单元格的边框
def format_border(ws, start_row, end_row, start_col, end_col):
    # 内部
    for row in tuple(ws[start_row:end_row]):
        for cell in row[start_col-1:end_col]:
            # cell.border = set_border('dotted', 'dotted', 'dotted', 'dotted')
            cell.border = set_border('medium', 'medium', 'medium', 'medium')
            # cell.border = set_border(cell.border.top.style, cell.border.bottom.style, cell.border.left.style, 'medium')
    # 左側
    for cell in [row[start_col-1] for row in ws[start_row:end_row]]:
        cell.border = set_border(cell.border.top.style, cell.border.bottom.style, 'medium', cell.border.right.style)
        # cell.border = set_border(cell.border.top.style, cell.border.bottom.style, cell.border.left.style, 'medium')
    # 右側
    for cell in [row[end_col-1] for row in ws[start_row:end_row]]:
        cell.border = set_border(cell.border.top.style, cell.border.bottom.style, cell.border.left.style, 'medium')
    # 上側
    for cell in ws[start_row][start_col-1:end_col]:
        cell.border = set_border('medium', cell.border.bottom.style, cell.border.left.style, cell.border.right.style)
        # cell.border = set_border(cell.border.top.style, cell.border.bottom.style, cell.border.left.style, 'medium')
    # 下側
    for cell in ws[end_row][start_col-1:end_col]:
        cell.border = set_border(cell.border.top.style, 'medium', cell.border.left.style, cell.border.right.style)
    return ws

def tranform_table(file_name, hd_name):
    print(file_name)
    head_name = os.path.splitext(hd_name)[0]
    ele_dict = {1: "A", 2: "B", 3: "C", 4: "D", 5: "E", 6: "F", 7: "G", 8: "H", 9: "I", 10: "J", 11: "K", 12: "L"}
    wb = openpyxl.Workbook()

    a = 0
    with open(file_name, 'r', encoding='utf-8') as load_json:
        data_json = json.load(load_json)
        data = data_json["pages"]

        for pag in data:
            tables = pag["tables"]
            for table in tables:  # 遍历所有的表排序
                print(table["cells"])
                table_list = table["cells"].sort(key=lambda x: (x["start_row"], x["start_column"]))
            for table in tables:

                a += 1
                # ws = wb.active
                # ws.title =
                ws = wb.create_sheet('sheet{}'.format(a))
                last_column = []
                last_row = []
                start_row=[]
                start_column=[]
                # for cell in table["cells"]:
                #     print(cell)
                #     if cell["start_row"] == cell["end_row"] :
                #     if cell["start_column"] == cell["end_column"]:
                #
                #     # 调整行高
                #     ws.row_dimensions[1].height = 20
                #     ws.row_dimensions[2].height = 20
                #     # 调整列宽
                #     ws.column_dimensions['A'].width = 40.0
                for dan in table["cells"]:
                    # for dan in cells:

                    print(dan["start_row"])
                    print(dan["content"])
                    print(type(dan["start_row"]))

                    try:


                        if dan["start_row"] == dan["end_row"] and dan["start_column"] == dan["end_column"]:
                            last_column.append(dan["end_column"])
                            last_row.append(dan["end_row"])
                            ws.cell(row=dan["start_row"], column=dan["start_column"]).value = dan["content"]
                        elif dan["start_row"] == dan["end_row"] and dan["start_column"] != dan["end_column"]:
                            font = ele_dict[dan["start_column"]] + str(dan["sta
<think>好的,用户的问题是想用Python识别图片中的文字和表格,并保存为docx文件。首先,我需要回忆一下相关的库和工具。 用户提到的引用里提到了处理PDF和DOCX的库,比如python-docx,但问题主要是关于图片识别。图片文字识别通常会用OCR技术,比如Tesseract,而Python中常用的是pytesseract库。另外,表格识别可能需要更高级的工具,比如OpenCV进行图像处理,或者使用深度学习的模型。不过用户可能希望有一个相对简单的解决方案。 然后,用户需要将识别的内容输出到docx文件,所以需要用到python-docx库来生成文档。可能需要将文字和表格分别处理,表格可能需要先识别结构,再在docx中重建。 接下来,我需要考虑是否有现成的库可以同时处理文字和表格识别。EasyOCR是一个不错的选择,它支持多语言,并且对复杂版面的处理较好。另外,有没有专门处理表格识别的工具?比如,Camelot或者Tabula,但这些主要是处理PDF中的表格。图片中的表格可能需要用其他方法,比如使用PaddleOCR,它支持表格结构的识别。 可能需要分步骤:首先用OCR识别图片中的文字,然后用专门的表格检测模型来定位和识别表格,再将两者结果整合到docx中。或者是否有集成方案,比如PaddleOCR不仅识别文字,还能处理表格,输出结构化的结果。 然后,安装相关的库,比如pytesseract需要安装Tesseract引擎,PaddleOCR可能需要安装paddlepaddle框架,这些可能会有依赖问题。另外,生成docx文件时,需要将文字段落和表格分别添加到文档中,使用python-docx的相应方法。 可能需要写一个流程:读取图片 -> OCR识别文字和表格 -> 解析表格结构 -> 创建docx文件,添加文字和表格。 还需要考虑图片中的表格可能比较复杂,是否有边框,如何处理合并单元格等问题。这时候可能需要更高级的OCR工具,或者结合图像处理来增强表格区域的识别。 另外,用户可能希望有一个完整的代码示例,所以需要将各个步骤整合起来,确保代码可行,并且处理常见的异常情况,比如图片质量不高导致的识别错误。 总结一下,可能的解决方案是使用PaddleOCR进行图片中的文字和表格识别,然后将结果python-docx写入docx文件。需要测试PaddleOCR表格识别能力,以及如何将识别后的表格结构转换为docx中的表格对象。 检查是否有相关的文档或示例代码,比如PaddleOCR提供了表格识别的模型,可以输出表格的HTML或Excel格式,可能需要进一步处理才能转成docx的表格。或者,如果表格识别结果返回的是二维数组,可以遍历数据创建表格。 另外,可能需要处理图片中的文字区域和表格区域的分割,确保文字和表格分别被正确识别。或者依赖OCR工具自动处理这些区域划分。 最后,整合所有步骤,给出一个可行的代码示例,并提醒用户需要安装的依赖库,以及可能遇到的问题,比如环境配置、图片清晰度要求等。</think>要使用Python实现图片中文字和表格识别并输出到docx文档,可通过以下分步方案实现: --- ### 一、技术选型与工具组合 1. **OCR识别核心** - **PaddleOCR**:支持中英文识别表格结构化提取,识别精度较高[^1] - **Tesseract+EasyOCR**:适合基础文字识别,但表格处理能力较弱 2. **文档生成工具** - **python-docx**:用于创建和编辑docx文件中的段落、表格[^2] --- ### 二、具体实现步骤 #### 步骤1:安装依赖库 ```bash pip install paddleocr python-docx Pillow ``` #### 步骤2:编写核心代码 ```python from paddleocr import PaddleOCR from docx import Document from docx.shared import Inches import cv2 def img_to_docx(image_path, docx_path): # 初始化OCR引擎(开启表格识别ocr = PaddleOCR(use_angle_cls=True, lang="ch", show_log=False) # 执行识别 result = ocr.ocr(image_path, cls=True) # 创建Word文档 doc = Document() # 解析识别结果 for line in result: if line[1][0] == 'table': # 处理表格 table_data = line[1][1] table = doc.add_table(rows=len(table_data), cols=len(table_data[0])) for row_idx, row in enumerate(table_data): for col_idx, cell in enumerate(row): table.cell(row_idx, col_idx).text = cell else: # 处理普通文本 doc.add_paragraph(line[1][0]) # 保存文档 doc.save(docx_path) # 调用示例 img_to_docx("input.jpg", "output.docx") ``` --- ### 三、关键优化点 1. **图像预处理** 添加灰度化、二值化处理提升识别率: ```python img = cv2.imread(image_path) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) _, thresh = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY) ``` 2. **表格增强处理** 使用PaddleOCR的`structure`模式强化表格识别: ```python from paddleocr import PPStructure table_engine = PPStructure(recovery=True) ``` 3. **版式保留** 通过坐标信息还原文字位置(需补充坐标解析逻辑) --- ### 四、效果对比 | 工具 | 文字识别率 | 表格支持 | 开发复杂度 | |------------|------------|----------|------------| | Tesseract | 85% | ❌ | 低 | | PaddleOCR | 92% | ✔️ | 中 | | EasyOCR | 88% | ❌ | 低 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

空弹壳

你的鼓励是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值