有时候我们需要将图片中的表格数据提取出来进行再次编辑,但一个字一个字的敲出来是件非常麻烦的事。
有没有更好的办法,一键提取图片中的表格数据,并转成Excel。
这时候,就需要用到OCR 技术了。
传统OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程;即,针对印刷体字符,采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件,并通过识别软件将图像中的文字转换成文本格式,供文字处理软件进一步编辑加工的技术。
随着深度学习在OCR领域的成功应用,检测图像中的文字区域以及识别文字内容已经变得越来越成熟。
待转换图片:
转换后的Excel:
本文使用腾讯的“文字识别OCR”,每月免费1千次,可以满足大部分普通用户的需求。
使用准备:
代码分享:
import base64
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.ocr.v20181119 import ocr_client, models
class OCR(object):
def img_to_excel(self,
image_path,
secret_id,
secret_key):
# 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey
cred = credential.Credential(
secret_id,
secret_key
)
# 实例化client对象
httpProfile = HttpProfile()
httpProfile.endpoint = "ocr.tencentcloudapi.com"
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
clientProfile.signMethod = "TC3-HMAC-SHA256"
client = ocr_client.OcrClient(cred, "ap-guangzhou", clientProfile)
# 实例化一个请求对象
req = models.GeneralFastOCRRequest()
# 读取图片数据,使用Base64编码
with open(image_path, 'rb') as f:
image = f.read()
image_base64 = str(base64.b64encode(image), encoding='utf-8')
req.ImageBase64 = image_base64
# 通过client对象调用访问接口,传入请求对象
resp = client.TableOCR(req)
# 获取返回数据(Data为Base64编码后的Excel数据)
data = resp.Data
# 转换为Excel
path_excel = image_path + ".xlsx"
with open(path_excel, 'wb') as f:
f.write(base64.b64decode(data))
return path_excel
import os
from menu.menu import EMenu
from utils.img.ocr import OCR
from utils.clipboard.clipboard import Clipboard
class MenuImg(EMenu):
LABEL_NAME = "Img"
LABEL_IMG_TO_EXCEL = "IMG to Excel"
def __init__(self, master=None, cnf={}, **kw):
super().__init__(master=master, cnf=cnf, **kw)
# 添加主菜单
master.add_cascade(label=self.LABEL_NAME, menu=self)
# 添加子菜单-图片表格数据转Excel
self.add_command(
label=self.LABEL_IMG_TO_EXCEL,
command=self.img_to_excel
)
@EMenu.thread_run(LABEL_IMG_TO_EXCEL)
def img_to_excel(self):
# 获取图片文件路径
data_type, data_content = Clipboard.get_data()
if data_type != Clipboard.DATA_TYPE_FILE:
self.msg_box_err("请先复制图片文件", title="错误")
return
# 使用ocr进行转换
ocr = OCR()
for file in data_content:
path_excel = ocr.img_to_excel(
image_path=file,
secret_id=self.conf.api.TC_OCR_SECRET_ID,
secret_key=self.conf.api.TC_OCR_SECRET_KEY
)
self.msg_box_info("转换成功:\n" + path_excel)
步骤1:复制图片文件
步骤2:选择Img菜单下的IMG to Excel子菜单
步骤3:转换成功
GitHub上搜索TheUncleWhoGrowsBeans