在日常工作中,经常遇到一些表格是图片格式的,那怎么把图片中的表格数据提取出来,放在excel文件中呢?

如果数据量比较少,手动抄录是没有问题的,当数据量比较多的时候,就非常耗时了,而且容易出错。

网上搜了一下,有一些提供读图片转存excel的工具,但是生成的excel文件格式有点乱。

还有一些平台提供了这种功能的api,比如阿里云,腾讯云,百度智能云,输入一张图片就会输出一些表格数据。下面以腾讯云的api接口进行说明。

接口申请

首先在腾讯云注册账号,开通通用文字识别服务,每个月有1000次的免费调用次数,超过次数后开始收费。自动转入后付费关掉后,超过次数就不会收费了,当然也就无法使用api了。

开通服务后,还需要申请访问api的秘钥,申请好以后如下图所示。

sdk包安装

主要安装腾讯云提供的组件包:tencentcloud_sdk_python,本文使用离线包的形式安装,下载后是个whl文件,使用pip install即可安装。如果缺少其他包,请自行安装。

pip install tencentcloud_sdk_python-3.0.531-py2.py3-none-any.whl

实现方法

配置文件config.yml

#coding=utf-8 secret_id: AKID3vXswjGWVDeohJfkY5LK2ScU5PSEivrX secret_key: SdXCclcxxxx

源代码imgToExcel.py

#coding=utf-8 import sys import ocr import yaml def get_yaml_data(yaml_file): # 打开yaml文件 file = open(yaml_file, 'r', encoding="utf-8") file_data = file.read() file.close() # 将字符串转化为字典或列表 data = yaml.load(file_data, Loader=yaml.FullLoader) return data def imageToExcel(pic_path): config = get_yaml_data("config.yml") # 使用ocr进行转换 trans = ocr.OCR() path_excel = trans.img_to_excel( pic_path, image_path=pic_path, secret_id=config['secret_id'], secret_key=config['secret_key'], ) if __name__ == '__main__': pic_path = sys.argv[1] imageToExcel(pic_path)

源代码ocr.py,参考官方api示例:https://console.cloud.tencent.com/api/explorer?Product=ocr&Version=2018-11-19&Action=RecognizeTableOCR&SignVersion=

#coding=utf-8 from tencentcloud.common import credential from tencentcloud.common.profile.client_profile import ClientProfile from tencentcloud.common.profile.http_profile import HttpProfile from tencentcloud.ocr.v20181119 import ocr_client, models import base64 # OCR识别封装 class OCR(object): def img_to_excel(self, output_file_name, 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-shanghai", clientProfile) # 实例化一个请求对象 #req = models.GeneralFastOCRRequest() 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.RecognizeTableOCR(req) # 获取返回数据(Data为Base64编码后的Excel数据) data = resp.Data # 转换为Excel output_file_name = str(output_file_name) path_excel = output_file_name + ".xlsx" with open(path_excel, 'wb') as f: f.write(base64.b64decode(data)) return path_excel

效果展示

来自本人原创首发地址:https://developer.hs.net/thread/1628