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基础教程之缩进介绍
Aug 29 Python
Python之父谈Python的未来形式
Jul 01 Python
django请求返回不同的类型图片json,xml,html的实例
May 22 Python
python pyheatmap包绘制热力图
Nov 09 Python
老生常谈python中的重载
Nov 11 Python
python的set处理二维数组转一维数组的方法示例
May 31 Python
python处理excel绘制雷达图
Oct 18 Python
让你的Python代码实现类型提示功能
Nov 19 Python
Python操作Sonqube API获取检测结果并打印过程解析
Nov 27 Python
pytorch 改变tensor尺寸的实现
Jan 03 Python
如何通过Django使用本地css/js文件
Jan 20 Python
什么是Python中的匿名函数
Jun 02 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中通过ADO调用Access数据库的方法测试不通过
2006/12/31 PHP
PHP常用正则表达式集锦
2014/08/17 PHP
实例简介PHP的一些高级面向对象编程的特性
2015/11/27 PHP
深入分析PHP优化及注意事项
2016/07/04 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
Jquery进度条插件 Progress Bar小问题解决
2011/07/12 Javascript
JavaScript中removeChild 方法开发示例代码
2016/08/15 Javascript
JavaScript 随机验证码的生成实例代码
2016/09/22 Javascript
基于javascript实现数字英文验证码
2017/01/25 Javascript
jquery.flot.js简单绘制折线图用法示例
2017/03/13 Javascript
jQuery设置图片等比例缩小的方法
2017/04/29 jQuery
JavaScript手风琴页面制作
2017/05/17 Javascript
深入理解Angular.JS中的Scope继承
2017/06/04 Javascript
详解AngularJS跨页面传值(ui-router)
2017/08/23 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(下)
2018/04/18 Javascript
vue单页缓存方案分析及实现
2018/09/25 Javascript
详解javascript函数写法大全
2019/03/25 Javascript
Layer组件多个iframe弹出层打开与关闭及参数传递的方法
2019/09/25 Javascript
Vue如何将页面导出成PDF文件
2020/08/17 Javascript
Vue过滤器,生命周期函数和vue-resource简单介绍
2021/01/12 Vue.js
python实现人人网登录示例分享
2014/01/19 Python
在Python中使用base64模块处理字符编码的教程
2015/04/28 Python
详解Python中expandtabs()方法的使用
2015/05/18 Python
使用PyTorch训练一个图像分类器实例
2020/01/08 Python
Python @property原理解析和用法实例
2020/02/11 Python
Python函数基本使用原理详解
2020/03/19 Python
python使用自定义钉钉机器人的示例代码
2020/06/24 Python
FragranceNet中文网:北美健康美容线上零售商
2020/08/26 全球购物
CLR与IL分别是什么含义
2016/08/23 面试题
Structs界面控制层技术
2013/10/11 面试题
五好党支部事迹材料
2014/02/06 职场文书
小学生操行评语
2014/04/22 职场文书
公司承诺书格式
2014/05/21 职场文书
行政司机岗位职责
2015/04/10 职场文书
创业计划书详解
2019/07/19 职场文书
python3 sqlite3限制条件查询的操作
2021/04/07 Python