背景:
今天刷文章,发现有人自己做了个发票ocr,来实现发票文字识别,以解决低效繁琐的手工录入问题,大大的提高了工作效率,但他的ocr似乎还不是很成熟,我就想调用百度api来实现发票文字识别部分,挑选自己想要的东西写入excel表格,花了点时间,但是实现了,分享出来,希望能够帮到有需要的人
先上效果图,设计隐私,已马赛克 写入表格
准备工作
1.环境配置,你需要有以下四个库
import requests
import base64
import os
import xlwt
2.你需要在百度智能云注册一个账号,然后在管理控制台新建一个文字识别的应用,这样网站会给到你一个API key和一个Secret Key,有了这俩串字符,我们才能进行下一步操作,获取身份令牌access_token 这是百度智能云的管理控制台
然后在这里创建应用
选择文字识别方向,记得勾选增值税发票这一项,默认应该是选上的
这里就是api key和Secret Key,到时候代码里的这个也要求替换成自己的,获取access_token也需要
然后打开技术文档,里面有一个api文档,教你怎样获取access_token
获取access_token的代码如下,请把api key 和Secret Key替换成自己的就行
import requests
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【官网获取的AK】&client_secret=【官网获取的SK】'
response = requests.get(host)
if response:
print(response.json())
到了这里我们就已经获得了access_token了,接下来就要把他复制粘贴到代码里,我们的准备工作就完成了
代码里修改一下发票存放地址path、access_token就能用了 代码里面有注释 上代码
import requests
import base64
import os
import xlwt
'''
增值税发票识别
'''
def get_context(pic):
data = {}
try:
request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice"
f = open(pic, 'rb')
img = base64.b64encode(f.read())
params = {"image":img}
access_token = '你的access_token'
request_url = request_url + "?access_token=" + access_token
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(request_url, data=params, headers=headers)
if response:
json1 = response.json()
data['SellerRegisterNum'] = json1['words_result']['SellerRegisterNum']
data['InvoiceDate'] = json1['words_result']['InvoiceDate']
data['PurchasserName'] = json1['words_result']['PurchaserName']
data['SellerName'] = json1['words_result']['SellerName']
data['AmountInFiguers'] = json1['words_result']['AmountInFiguers']
return data
except Exception as e:
print(e)
return data
def pics(path):
print('正在生成图片路径')
pics = []
for filename in os.listdir(path):
if filename.endswith('jpg') or filename.endswith('png'):
pic = path + '/' + filename
pics.append(pic)
print('图片路径生成成功!')
return pics
def datas(pics):
datas = []
for p in pics:
data = get_context(p)
datas.append(data)
return datas
def save(datas):
print('正在写入数据!')
book = xlwt.Workbook(encoding='utf-8', style_compression=0)
sheet = book.add_sheet('增值税发票内容登记', cell_overwrite_ok=True)
title = ['开票日期', '纳税人识别号', '购买方名称', '卖方名称', '购买金额']
for i in range(len(title)):
sheet.write(0, i, title[i])
for d in range(len(datas)):
for j in range(len(title)):
sheet.write(d + 1, 0, datas[d]['InvoiceDate'])
sheet.write(d + 1, 1, datas[d]['SellerRegisterNum'])
sheet.write(d + 1, 2, datas[d]['PurchasserName'])
sheet.write(d + 1, 3, datas[d]['SellerName'])
sheet.write(d + 1, 4, datas[d]['AmountInFiguers'])
print('数据写入成功!')
book.save('增值税发票.xls')
def main():
print('开始执行!!!')
path = 'D:/fapiao'
Pics = pics(path)
Datas = datas(Pics)
save(Datas)
print('执行结束!')
if __name__ == '__main__':
main()
注意:
本项目可以实现后缀名为.jpg和.png的增值税发票的文字识别,并写入excel表格里,如需其他格式,稍作修改也能行
百度智能云返回的字段很丰富,按需取用,这次实战我选用的是五个字段,请大家自行修改使用,都包含在返回的json文件里面
总结一下,修改了path和access_token,就能使用,是不是很方便呢
感谢大家的阅读,我们下次见!!!
|