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中List.count()方法的使用教程
May 20 Python
Python的组合模式与责任链模式编程示例
Feb 02 Python
Python 详解基本语法_函数_返回值
Jan 22 Python
Python跨文件全局变量的实现方法示例
Dec 10 Python
Python中new方法的详解
Jan 15 Python
超简单使用Python换脸实例
Mar 27 Python
Python装饰器限制函数运行时间超时则退出执行
Apr 09 Python
详解python编译器和解释器的区别
Jun 24 Python
如何使用django的MTV开发模式返回一个网页
Jul 22 Python
python 定时器每天就执行一次的实现代码
Aug 14 Python
python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例
Feb 27 Python
Python random模块的使用示例
Oct 10 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
使用php+xslt在windows平台上
2006/10/09 PHP
PHP的substr_replace将指定两位置之间的字符替换为*号
2011/05/04 PHP
CI框架源码阅读,系统常量文件constants.php的配置
2013/02/28 PHP
PHP输出图像imagegif、imagejpeg与imagepng函数用法分析
2016/11/14 PHP
Thinkphp结合ajaxFileUpload实现异步图片传输示例
2017/03/13 PHP
Laravel中使用Queue的最基本操作教程
2017/12/27 PHP
php微信公众号开发之翻页查询
2018/10/20 PHP
thinkphp5+layui实现的分页样式示例
2019/10/08 PHP
nodejs实现bigpipe异步加载页面方案
2016/01/26 NodeJs
node.js爬虫爬取拉勾网职位信息
2017/03/14 Javascript
javascript 取小数点后几位几种方法总结
2017/08/02 Javascript
JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法
2017/09/21 Javascript
ligerUI---ListBox(列表框可移动的实例)
2017/11/28 Javascript
Puppeteer环境搭建的详细步骤
2018/09/21 Javascript
Vue CLI 3搭建vue+vuex最全分析(推荐)
2018/09/27 Javascript
学习LayUI时自研的表单参数校验框架案例分析
2019/07/29 Javascript
[02:07]DOTA2新英雄展现中国元素,完美“圣典”亮相央视
2016/12/19 DOTA
[45:59]完美世界DOTA2联赛PWL S2 FTD vs GXR 第二场 11.22
2020/11/24 DOTA
Python 文件和输入输出小结
2013/10/09 Python
python开发中module模块用法实例分析
2015/11/12 Python
深入了解Python数据类型之列表
2016/06/24 Python
通过Python实现自动填写调查问卷
2017/09/06 Python
python3+PyQt5实现自定义流体混合窗口部件
2018/04/24 Python
Django项目中model的数据处理以及页面交互方法
2018/05/30 Python
Python多线程原理与用法详解
2018/08/20 Python
win10 64bit下python NLTK安装教程
2018/09/19 Python
强悍的Python读取大文件的解决方案
2019/02/16 Python
python的pstuil模块使用方法总结
2019/07/26 Python
详解python tkinter包获取本地绝对路径(以获取图片并展示)
2020/09/04 Python
CSS3圆角边框和边界图片效果实例
2016/07/01 HTML / CSS
自1926年以来就为冰岛保持温暖:66°North
2020/11/27 全球购物
2014公安机关纪律作风整顿思想汇报
2014/09/13 职场文书
高等学院职业生涯规划书范文
2014/09/16 职场文书
结婚通知短信怎么写
2015/04/17 职场文书
战友聚会致辞
2015/07/28 职场文书
Kubernetes控制节点的部署
2022/04/01 Servers