Python办公自动化之教你用Python批量识别发票并录入到Excel表格中


Posted in Python onJune 26, 2021

一、场景描述

这里有以四张发票为例(辰哥网上搜的),将发票图片放到pic文件夹下。

Python办公自动化之教你用Python批量识别发票并录入到Excel表格中

随便打开一张发票

Python办公自动化之教你用Python批量识别发票并录入到Excel表格中

提取目标:金额、名称、纳税人识别号、开票人。

Python办公自动化之教你用Python批量识别发票并录入到Excel表格中

最后将每一张发票的这四个内容保存到excel中:

Python办公自动化之教你用Python批量识别发票并录入到Excel表格中

二、准备环境

需要用到的库如下:

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

安装的命令如下:

pip install pyocr
pip install cnocr

发票中含有中文内容,我们需要对图片中的中文进行识别,那么 cnocr 是一个不错的选择。

提示:安装好上面的库之外,还需要安装额外的exe文件,不然会出现下面这种错误

Python办公自动化之教你用Python批量识别发票并录入到Excel表格中

需要安装的exe文件:

1. ImageMagick

2. tesseract-OCR

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

三、提取内容

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

Python办公自动化之教你用Python批量识别发票并录入到Excel表格中

读取图片:pic/pic1.jpg

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

1.提取金额

需要截取到发票中金额的位置

## 金额
left = 741
top = 420
right = 850
bottom = 445
image_text1 = new_img.crop((left, top, right, bottom))
#展示图片
image_text1.show()

这里的left、top、right、bottom的数值是通过多次修改定位而来。大家根据自己的发票内容去定位即可。

Python办公自动化之教你用Python批量识别发票并录入到Excel表格中

接着将图片中的数字提取出来

Python办公自动化之教你用Python批量识别发票并录入到Excel表格中

同样的,下面继续提取:名称

2.提取名称

left = 155
top = 450
right = 450
bottom = 470
image_obj2 = new_img.crop((left, top, right, bottom))
image_obj2.show()

Python办公自动化之教你用Python批量识别发票并录入到Excel表格中

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

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

Python办公自动化之教你用Python批量识别发票并录入到Excel表格中

3.提取纳税人识别号

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

Python办公自动化之教你用Python批量识别发票并录入到Excel表格中

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

将图片中的纳税人识别号提取出来,结果如下:

Python办公自动化之教你用Python批量识别发票并录入到Excel表格中

4.提取开票人

left = 528
top = 550
right = 670
bottom = 600
image_obj4 = new_img.crop((left, top, right, bottom))
image_obj4.show()

Python办公自动化之教你用Python批量识别发票并录入到Excel表格中

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

由于有中文,咱们这里同样和提取名称一样,使用cnocr将图片中的中文取出。

Python办公自动化之教你用Python批量识别发票并录入到Excel表格中

ok这样我们就将发票中的四个目标内容提取出来,接着将文件夹pic下的所有发票,进行识别将内容保存到excel。

四、批量识别发票并保存到excel

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

Python办公自动化之教你用Python批量识别发票并录入到Excel表格中

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

filePath = 'pic'
pic_name = []
for i,j,name in os.walk(filePath):
    pic_name = name
for i in pic_name:
    print(i)

Python办公自动化之教你用Python批量识别发票并录入到Excel表格中

开始进行识别,并将结果写入到excel中。

for i in pic_name:
    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")  # 保存结果

最后保存为:发票汇总-李运辰.xls,其结果如下:

Python办公自动化之教你用Python批量识别发票并录入到Excel表格中

五、发票验证真伪

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

Python办公自动化之教你用Python批量识别发票并录入到Excel表格中

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

1.申请百度AI应用

Python办公自动化之教你用Python批量识别发票并录入到Excel表格中

2.获取token

# 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']

这里的client_id 为官网获取的AK, client_secret 为官网获取的SK,是上面申请好应用即可获取

3.查验

Python办公自动化之教你用Python批量识别发票并录入到Excel表格中

咱以这张图片为例,进行查验

Python办公自动化之教你用Python批量识别发票并录入到Excel表格中

其中的发票类型对应如下:

Python办公自动化之教你用Python批量识别发票并录入到Excel表格中

结果如下:

Python办公自动化之教你用Python批量识别发票并录入到Excel表格中

感觉这个结果查询不是很好(不详细)。下面还可以去税务局查询

4.税务局查询发票

Python办公自动化之教你用Python批量识别发票并录入到Excel表格中

同样以这张图片为例,进行查验

Python办公自动化之教你用Python批量识别发票并录入到Excel表格中

填写好信息点击查验,结果如下:

Python办公自动化之教你用Python批量识别发票并录入到Excel表格中

再税务局查验更加清晰。读者可以根据自己的情况去选择自己的方式去查验。

六、小结

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

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

最后想说的是,其实本文的案例可以应用再其他方面,例如

批量计算发票金额汇总

根据发票类型批量分类

........

到此这篇关于Python办公自动化之教你用Python批量识别发票并录入到Excel表格中的文章就介绍到这了,更多相关Python识别发票并录入到Excel表格内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python的__builtin__模块中的一些要点知识
May 02 Python
浅析Python中的for 循环
Jun 09 Python
Python实现扩展内置类型的方法分析
Oct 16 Python
python3.5 email实现发送邮件功能
May 22 Python
Python numpy.array()生成相同元素数组的示例
Nov 12 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
Nov 14 Python
使用python绘制二元函数图像的实例
Feb 12 Python
Python如何筛选序列中的元素的方法实现
Jul 15 Python
Python获取时间戳代码实例
Sep 24 Python
使用sklearn的cross_val_score进行交叉验证实例
Feb 28 Python
python中的测试框架
Nov 13 Python
一篇文章搞懂python混乱的切换操作与优雅的推导式
Aug 23 Python
Python Pandas模块实现数据的统计分析的方法
Jun 24 #Python
FP-growth算法发现频繁项集——发现频繁项集
能让Python提速超40倍的神器Cython详解
Jun 24 #Python
FP-growth算法发现频繁项集——构建FP树
python ansible自动化运维工具执行流程
关于python中readlines函数的参数hint的相关知识总结
详解Python为什么不用设计模式
You might like
array_multisort实现PHP多维数组排序示例讲解
2011/01/04 PHP
php随机显示图片的简单示例
2014/02/15 PHP
php+mysqli预处理技术实现添加、修改及删除多条数据的方法
2015/01/30 PHP
PHP生成树的方法
2015/07/28 PHP
PHP获取当前系统时间的方法小结
2018/10/03 PHP
JQuery 获得绝对,相对位置的坐标方法
2010/02/09 Javascript
jquery ajax对特殊字符进行转义防止js注入使用示例
2013/11/21 Javascript
jQuery中验证表单提交方式及序列化表单内容的实现
2014/01/06 Javascript
jquery通过visible来判断标签是否显示或隐藏
2014/05/08 Javascript
javascript验证邮件地址和MX记录的方法
2015/06/16 Javascript
基于JavaScript获取鼠标位置的各种方法
2015/12/16 Javascript
一个极为简单的requirejs实现方法
2016/10/20 Javascript
vue使用axios跨域请求数据问题详解
2017/10/18 Javascript
vue中使用 pako.js 解密 gzip加密字符串的方法
2019/06/10 Javascript
layer父页获取弹出层输入框里面的值方法
2019/09/02 Javascript
[02:03]完美世界DOTA2联赛10月30日赛事集锦
2020/10/31 DOTA
详解Python3.1版本带来的核心变化
2015/04/07 Python
Python and、or以及and-or语法总结
2015/04/14 Python
python集合用法实例分析
2015/05/30 Python
Python的mysql数据库的更新如何实现
2017/07/31 Python
python操作redis方法总结
2018/06/06 Python
keras获得model中某一层的某一个Tensor的输出维度教程
2020/01/24 Python
Python捕获异常堆栈信息的几种方法(小结)
2020/05/18 Python
keras 使用Lambda 快速新建层 添加多个参数操作
2020/06/10 Python
Python创建文件夹与文件的快捷方法
2020/12/08 Python
DRF使用simple JWT身份验证的实现
2021/01/14 Python
Order by的几种用法
2013/06/16 面试题
请用Java实现列出某个目录下的所有文件
2013/09/23 面试题
UNIX命令速查表
2012/03/10 面试题
初中音乐教学反思
2014/01/12 职场文书
全民健身日活动方案
2014/01/29 职场文书
婚礼司仪主持词
2014/03/14 职场文书
手机银行营销方案
2014/03/14 职场文书
护理医院见习报告
2014/11/03 职场文书
2015年挂职干部工作总结
2015/05/14 职场文书
通知怎么写?
2019/04/17 职场文书