python实现批量增值税发票文字识别(ocr),并写入excel表格

背景:

今天刷文章,发现有人自己做了个发票ocr,来实现发票文字识别,以解决低效繁琐的手工录入问题,大大的提高了工作效率,但他的ocr似乎还不是很成熟,我就想调用百度api来实现发票文字识别部分,挑选自己想要的东西写入excel表格,花了点时间,但是实现了,分享出来,希望能够帮到有需要的人

先上效果图,设计隐私,已马赛克
python实现批量增值税发票文字识别(ocr),并写入excel表格_第1张图片写入表格

python实现批量增值税发票文字识别(ocr),并写入excel表格_第2张图片

准备工作

1.环境配置,你需要有以下四个库

import requests
import base64
import os
import xlwt

2.你需要在百度智能云注册一个账号,然后在管理控制台新建一个文字识别的应用,这样网站会给到你一个API key和一个Secret Key,有了这俩串字符,我们才能进行下一步操作,获取身份令牌access_token
python实现批量增值税发票文字识别(ocr),并写入excel表格_第3张图片
这是百度智能云的管理控制台

python实现批量增值税发票文字识别(ocr),并写入excel表格_第4张图片
然后在这里创建应用

python实现批量增值税发票文字识别(ocr),并写入excel表格_第5张图片
选择文字识别方向,记得勾选增值税发票这一项,默认应该是选上的

python实现批量增值税发票文字识别(ocr),并写入excel表格_第6张图片
这里就是api key和Secret Key,到时候代码里的这个也要求替换成自己的,获取access_token也需要

然后打开技术文档,里面有一个api文档,教你怎样获取access_token

python实现批量增值税发票文字识别(ocr),并写入excel表格_第7张图片
获取access_token的代码如下,请把api key 和Secret Key替换成自己的就行

# encoding:utf-8
import requests 

# client_id 为官网获取的AK, client_secret 为官网获取的SK
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就能用了
代码里面有注释
上代码

# encoding:utf-8

import requests
import base64
import os
import xlwt
'''
增值税发票识别
'''
# 获取发票正文内容
def get_context(pic):
    # print('正在获取图片正文内容!')
    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 = '你的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:
            # print (response.json())
            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']
            # print(data['AmountInFiguers'])
        # print('正文内容获取成功!')
        return data

    except Exception as e:
        print(e)
    return data

# 定义生成图片路径的函数
def pics(path):
    print('正在生成图片路径')
    #生成一个空列表用于存放图片路径
    pics = []
    # 遍历文件夹,找到后缀为jpg和png的文件,整理之后加入列表
    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

# 定义一个写入将数据excel表格的函数
def save(datas):
    print('正在写入数据!')
    book = xlwt.Workbook(encoding='utf-8', style_compression=0)
    sheet = book.add_sheet('增值税发票内容登记', cell_overwrite_ok=True)
    # 设置表头,这里可以根据自己的需求设置,我这里设置了5个
    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,就能使用,是不是很方便呢

感谢大家的阅读,我们下次见!!!

你可能感兴趣的:(笔记,python玩出个性,python,ocr)