在日常工作中,经常遇到一些表格是图片格式的,那怎么把图片中的表格数据提取出来,放在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