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的exec、eval使用分析
Dec 11 Python
利用Python yagmail三行代码实现发送邮件
May 11 Python
pandas.dataframe按行索引表达式选取方法
Oct 30 Python
Python图像滤波处理操作示例【基于ImageFilter类】
Jan 03 Python
python 将字符串中的数字相加求和的实现
Jul 18 Python
django 微信网页授权认证api的步骤详解
Jul 30 Python
Flask框架模板继承实现方法分析
Jul 31 Python
tornado+celery的简单使用详解
Dec 21 Python
selenium+python配置chrome浏览器的选项的实现
Mar 18 Python
Python正则表达式如何匹配中文
May 27 Python
Python爬取科目四考试题库的方法实现
Mar 30 Python
Python scrapy爬取起点中文网小说榜单
Jun 13 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
实用函数9
2007/11/08 PHP
php简单分页类实现方法
2015/02/26 PHP
Laravel5.7 数据库操作迁移的实现方法
2019/04/12 PHP
php判断某个方法是否存在函数function_exists (),method_exists()与is_callable()区别与用法解析
2020/04/20 PHP
简单JS代码压缩器
2006/10/12 Javascript
JavaScript 嵌套函数指向this对象错误的解决方法
2010/03/15 Javascript
JavaScript自定义日期格式化函数详细解析
2014/01/14 Javascript
一种新的javascript对象创建方式Object.create()
2015/12/28 Javascript
AngularJS中实现显示或隐藏动画效果的方式总结
2015/12/31 Javascript
JS仿Base.js实现的继承示例
2017/04/07 Javascript
Ionic学习日记实现验证码倒计时
2018/02/08 Javascript
Express本地测试HTTPS的示例代码
2018/06/06 Javascript
详解vue文件中使用echarts.js的两种方式
2018/10/18 Javascript
微信小程序自定义组件传值 页面和组件相互传数据操作示例
2019/05/05 Javascript
vue+element创建动态的form表单及动态生成表格的行和列
2019/05/20 Javascript
Vue基于iview table展示图片实现点击放大
2020/08/05 Javascript
基于javascript实现放大镜特效
2020/12/03 Javascript
详解Django中的ifequal和ifnotequal标签使用
2015/07/16 Python
解决Python 遍历字典时删除元素报异常的问题
2016/09/11 Python
python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题
2018/01/17 Python
python实现求最长回文子串长度
2018/01/22 Python
PyQt5实现从主窗口打开子窗口的方法
2019/06/19 Python
Python模块的制作方法实例分析
2019/12/21 Python
Java ExcutorService优雅关闭方式解析
2020/05/30 Python
pytorch 限制GPU使用效率详解(计算效率)
2020/06/27 Python
全网最细 Python 格式化输出用法讲解(推荐)
2021/01/18 Python
英国厨房与餐具用品为主的设计品牌:Joseph Joseph
2018/04/26 全球购物
放飞蜻蜓反思
2014/02/05 职场文书
小学生九一八纪念日83周年演讲稿500字
2014/09/17 职场文书
四风问题原因分析及整改措施
2014/10/24 职场文书
环保守法证明
2015/06/24 职场文书
党员反腐倡廉学习心得体会
2015/08/15 职场文书
2017年大学生寒假社会实践活动总结
2016/04/06 职场文书
Python Numpy之linspace用法说明
2021/04/17 Python
JavaScript最完整的深浅拷贝实现方式详解
2022/02/28 Javascript
Nginx 匹配方式
2022/05/15 Servers