基于Python的发票识别与机器学习(保姆式教程)

37 篇文章 20 订阅

公众号:yk 坤帝
后台回复 发票识别 获取全部源代码

1.场景描述

2.准备环境

3.提取内容

1.提取发票金额
2.提取销售方名称
3.提取纳税人识别号
4.提取开票人

4.识别发票并保存到excel

5.发票验证真伪

1.申请百度AI应用
2.获取token
3.查验发票
4.税务局查询发票

6.扩展总结

大家好,我是坤哥!

坤哥今天来分享一篇办公干货文章:用Python批量识别发票并录入到Excel表格。对于财务专业等学生或者公司财务人员来说,将报账发票等汇总到excel简直就是一个折磨。坤哥就是学财务的,真是感同深受啊,今天就把具体流程方法发给大家。

尤其是到年底的时候,公司的财务人员面对一大堆的发票简直就是苦不堪言。正好我们学会了Python,我们应该将Python的优势发挥起来。在这里只给大家讲一下基于python的发票批量识别,另外还有基于机器学习的python的发票识别,感兴趣的可以先自己挖掘一下,我们来看看基于python的发票批量识别。

1.场景描述

这里有以四张发票为例(坤哥网上搜的),将发票图片放到pic文件夹下(放在任意文件夹都可以),先用四张批量识别一下。

随便打开一张发票。
在这里插入图片描述

提取目标:发票金额,销售方名称、纳税人识别号、发票开票人。

在这里插入图片描述

最后将每一张发票的这四个内容保存到excel中,如果有学过数据库的,还是建议直接储存在数据库中,也算是对数据库的复习了,毕竟一般情况下还是用数据库比较多:

在这里插入图片描述

2.准备环境

需要用到的库如下:


from PIL import Image as PI
import pyocr
import io
import pyocr.builders
from cnocr import CnOcr

在这里插入图片描述
安装的命令如下:

pip install pyocr
pip install cnocr
下面是需要用到的全部库,模块

在这里插入图片描述
发票中含有中文内容(一些机器学习的内容,大家只需要知道怎么用就可以了),我们需要对图片中的中文进行识别(页面识别), cnocr 是一个不错的选择。(上面有使用方法)

提示:安装好上面的库之外,还需要安装额外的exe文件,不然会出现下面这种错误(相关配置尽量安装好)

在这里插入图片描述
需要安装的exe文件:

ImageMagick 
tesseract-OCR

这两个软件的安装过程就不再赘述了,大家可以自行搜索教程进行安装(可以在csdn上面)。

这两个软件最好还是安装上,之前好像不用安装也可以显示数据,报错可能不影响程序运行,不过最好还是安装一下,不然别的地方也报错的时候可能无法下手了。

3.提取内容

下面以其中一张图片为例,讲解如何提取目标内容:金额、名称、纳税人识别号、开票人。

在这里插入图片描述
读取图片:pic1.jpg

from PIL import Image as PI
import pyocr
import io
import pyocr.builders
from cnocr import CnOcr

tool = pyocr.get_available_tools()[0]
img_url = "pic1.png"
with open(img_url, 'rb') as f:
    a = f.read()
new_img = PI.open(io.BytesIO(a))

1.提取金额

需要截取到发票中金额的位置,不同电脑可能坐标不一样。

注释是解析,按照自己的电脑调试位置。

from PIL import Image as PI
import pyocr
import io
import pyocr.builders
from cnocr import CnOcr

tool = pyocr.get_available_tools()[0]
img_url = "pic1.png"
with open(img_url, 'rb') as f:
    a = f.read()
new_img = PI.open(io.BytesIO(a))


#提取金额
# 金额
# left = 741
# top = 420
# right = 850
# bottom = 445
left = 645
top =360
right = 719
bottom = 385
image_text1 = new_img.crop((left, top, right, bottom))
#展示图片
image_text1.show()
txt1 = tool.image_to_string(image_text1)
print(txt1)

这里的left、top、right、bottom的数值是通过多次修改定位而来。大家根据自己的发票内容去定位即可,不要觉得麻烦,一步到位的话是不会提高的,代码还是要理解理解,自己敲一敲。

在这里插入图片描述

接着将图片中的数字提取出来
在这里插入图片描述
同样的,下面继续提取:名称

2.提取名称

from PIL import Image as PI
import pyocr
import io
import pyocr.builders
from cnocr import CnOcr


tool = pyocr.get_available_tools()[0]
img_url = "发票识别/pic1.png"
with open(img_url, 'rb') as f:
    a = f.read()
new_img = PI.open(io.BytesIO(a))

#提取名称
left = 135
top = 390
right = 450
bottom = 410
image_obj2 = new_img.crop((left, top, right, bottom))
#image_obj2.show()



image_obj2.save("tmp.png")
ocr = CnOcr()
res = ocr.ocr("tmp.png")
print(res[0][0])

print("".join(res[0][0]))

#print("".join('%s' %a for a in res))

在这里插入图片描述
这里的名称是中文的,咱们不能再像提取金额(数字)操作。需要使用到cnocr去将图片中的中文取出。

image_obj2.save("tmp.jpg")
ocr = CnOcr()
res = ocr.ocr("tmp.jpg")
print("".join(res[0]))

在这里插入图片描述
3.提取纳税人识别号

from PIL import Image as PI
import pyocr
import io
import pyocr.builders
from cnocr import CnOcr

tool = pyocr.get_available_tools()[0]
img_url = "pic1.png"
with open(img_url, 'rb') as f:
    a = f.read()
new_img = PI.open(io.BytesIO(a))

#纳税人识别号
left = 135
top = 405
right = 450
bottom = 425
image_text3 = new_img.crop((left, top, right, bottom))
#展示图片
#image_text3.show()

txt3 = tool.image_to_string(image_text3)
print(txt3)

在这里插入图片描述

在这里插入图片描述
将图片中的纳税人识别号提取出来,结果如下:

在这里插入图片描述

4.提取开票人

from PIL import Image as PI
import pyocr
import io
import pyocr.builders
from cnocr import CnOcr

tool = pyocr.get_available_tools()[0]
img_url = "pic1.png"
with open(img_url, 'rb') as f:
    a = f.read()
new_img = PI.open(io.BytesIO(a))

#提取开票人

left = 458
top = 470
right = 570
bottom = 490
image_obj4 = new_img.crop((left, top, right, bottom))
#image_obj4.show()

image_obj4.save("tmp.png")
ocr = CnOcr()
res = ocr.ocr("tmp.png")
#print("".join(res[0]))

print("".join(res[0][0]))

在这里插入图片描述
在这里插入图片描述
由于有中文,咱们这里同样和提取名称一样,使用cnocr将图片中的中文取出。
在这里插入图片描述
ok这样我们就将发票中的四个目标内容提取出来,接着将文件夹pic下的所有发票,进行识别将内容保存到excel。

4.批量识别发票并保存到excel

在读取图片之前,先将上面的四个操作封装成函数,方便每一种发票对象进行调用。


读取文件夹下的所有图片。

from PIL import Image as PI
import pyocr
import io
import pyocr.builders
from cnocr import CnOcr

tool = pyocr.get_available_tools()[0]
img_url = "pic1.png"
with open(img_url, 'rb') as f:
    a = f.read()
new_img = PI.open(io.BytesIO(a))

在这里插入图片描述
开始进行识别,并将结果写入到excel中。

#批量识别
    ##写入到excel
    import openpyxl
    outwb = openpyxl.Workbook()  # 打开一个将写的文件
    outws = outwb.create_sheet(index=0)  # 在将写的文件创建sheet

    outws.cell(row=1, column=1, value="名称")
    outws.cell(row=1, column=2, value="纳税人识别号")
    outws.cell(row=1, column=3, value="金额")
    outws.cell(row=1, column=4, value="开票人")
    count = 2
    filePath = '发票识别'
    pic_name = []
    # for i,j,name in os.walk(filePath):
    #     pic_name = name
    # for i in pic_name[0:1]:
    #     img_url = filePath+"/"+i
    #     with open(img_url, 'rb') as f:
    #         a = f.read()
    #     new_img = PI.open(io.BytesIO(a))
    #     ## 写入csv
    #     outws.cell(row=count, column=1, value=text2(new_img))
    #     outws.cell(row=count, column=2, value=text3(new_img))
    #     outws.cell(row=count, column=3, value=text1(new_img))
    #     outws.cell(row=count, column=4, value=text4(new_img))
    #     count = count + 1
    # outwb.save("发票汇总-坤哥.xls")  # 保存结果


    with open("发票识别/pic1.png", 'rb') as f:
        a = f.read()
    new_img = PI.open(io.BytesIO(a))
    ## 写入csv
    outws.cell(row=count, column=1, value=text2(new_img))
    outws.cell(row=count, column=2, value=text3(new_img))
    outws.cell(row=count, column=3, value=text1(new_img))
    outws.cell(row=count, column=4, value=text4(new_img))
    
    outwb.save("发票汇总-坤哥.xls")  # 保存结果

最后保存为:发票汇总-坤哥.xls,其结果如下:

在这里插入图片描述

5.发票验证真伪

在坤哥的交流群里,和小伙伴聊到这个内容时,小伙伴建议可以加一个功能:发票验证真伪。

所有在上面的开始识别之前(自己公司的发票可能不需要查验这步),先调用一下第三方的接口,对发票进行识别,识别通过之后再将其提取发票中目标内容。

1.申请百度AI应用

在这里插入图片描述
2.获取token
在这里插入图片描述
这里的client_id 为官网获取的AK, client_secret 为官网获取的SK,是上面申请好应用即可获取

3.查验
在这里插入图片描述
咱以这张图片为例,进行查验
在这里插入图片描述
其中的发票类型对应如下:
在这里插入图片描述
结果如下:
在这里插入图片描述
4.税务局查询发票
在这里插入图片描述
在这里插入图片描述

同样以这张图片为例,进行查验
在这里插入图片描述
填写好信息点击查验,结果如下:
在这里插入图片描述
再税务局查验更加清晰。读者可以根据自己的情况去选择自己的方式去查验。

6.小结

本文基本就成功实现目标要求,从效果来看还是非常不错的!完整源码可由文中代码组合而成(已全部分享在文中),感兴趣的读者可以自己尝试!

一定要动手尝试!一定要动手尝试!一定要动手尝试!

坤哥另最后讲一下基于python的发票识别,基于机器学习的发票识别,感兴趣的大家可以尝试一下,画了一个思维导图。
在这里插入图片描述
最后说一声:原创不易,求给个赞、收藏!

公众号:yk 坤帝
后台回复 发票识别 获取全部源代码

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yk 坤帝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值