我发现我如果不是更新系列博客(例如django做网站系列),就总会在千面加一个事件的起因。格式之固定简直像极了小学生写作文。
所以……事情的起因是这样的,一位朋友是做财务相关的工作的。有一天向我叙述了一下其中一项工作内容,即打开发票,将信息录入excel,并同步对发票扫描件进行重命名。作为一个热心的python爱好者,自然挺身而出,帮助其解决这个问题。

文章目录

  • 我的思路
    • 自己调用库
    • 腾讯云
    • 调用方法
    • 代码
      • 依赖的库
  • 总结
  • github

我的思路

自己调用库

这个小项目的思路可以说是很easy了,无非就是,打开图片,ocr识别,然后进行一系列操作。
说到ocr,我很自然而然的联想到python的两个库

  • PIL
    PIL的功能就是对图片进行一系列操作,如打开,锐化、改变大小、旋转等等,功能丰富。
  • tesseract
    它是一个强大的ocr识别库。

但是最终我没有用这个方案,一来我自己的tesseract没有经过机器学习,识别率低得可怕,二来自己调用的话确实挺麻烦,可能还得自己写个服务器、客户端,但是我急于交货(写完这段代码,我过1024屌丝节(屌丝节这个词是我一个程序员兄弟说的,那是他的自嘲,不过却是我的向往))

腾讯云

在这里我没有打广告,我为什么选择了腾讯云,因为我有很多腾讯云的产品了,再增加一个就是了。
而且它有相对完善的接口,文档也很清楚,识别率奇高,我只要做一个说得过去的APIcaller即可。同时把接口改写一下,封装到类里面去,面向对象的思维有很多好处,我这个脚本虽然是单进程单线程,但是我这个改写做出来之后呢,多线程其实问题也不大。

调用方法

腾讯云发票识别接口

代码

代码其实比较简单的,需要这个思路的可以直接复制,我给用我自己不成熟的面向对象思维封装起来了。注释我写的详细一些。

依赖的库

  • tencentcloud-sdk-python
    主要使用的核心库,集中了最主要的命令
  • PIL
    负责打开图片,压缩图片,因为部分图片过大,请求起来比较慢
  • base64
    负责把图片转化为base64代码,方便解析
  • json
    腾讯云返回的信息是json格式,我要转回python的字典,才可以方便的操作

更详细的内容,见代码注释

#安装tencentcloud-sdk-python库之后方可调用
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.ocr.v20181119 import ocr_client, models
#导入PIL的Image,打开图片,压缩图片用
from PIL import Image
#获取目录下的文件,以及改名必备
import os
#图片转base64,必备
import base64
#腾讯云返回的信息是json格式,我要转回python的字典,才可以方便的操作
import json
import time#面向对象思维,创建类
class recognition:def __init__(self):#requestId和key是腾讯云开通后申请的,我这里保护下隐私,隐藏起来self.requestId = "AKIDiBNIFx8aU7JE8n**************"self.key = "VllY9VbR1OUJtDH**************"#必备参数self.Action = "ap-beijing"#这个方法是把图片转化为base64的方法,并添加类的属性def getBase64(self, name):with open(name, "rb") as f:self.base64_data = base64.b64encode(f.read()).decode()#核心部分,图片解析,根据腾讯云的文档来做即可def getInformation(self):try:cred = credential.Credential(self.requestId, self.key)httpProfile = HttpProfile()httpProfile.endpoint = "ocr.tencentcloudapi.com"clientProfile = ClientProfile()clientProfile.httpProfile = httpProfileclient = ocr_client.OcrClient(cred, "ap-beijing", clientProfile)req = models.VatInvoiceOCRRequest()dic = {"ImageBase64": self.base64_data}params = json.dumps(dic)req.from_json_string(params)self.resp = client.VatInvoiceOCR(req)except TencentCloudSDKException as err:print(err)#解析返回的数据,这个是根据返回的json来做的,他的格式是一个字典列表,即元素是字典的列表,需要遍历,获得想要的发票数据def analysis(self):self.data = json.loads(self.resp.to_json_string())self.fatherName = self.data['VatInvoiceInfos'][6]['Value']for i in self.data['VatInvoiceInfos']:if i['Name'] == "小写金额":self.value = i['Value']self.money = self.value.replace("¥", "")break#方法调用,这里可以开多线程其实,封装在函数里def start(self, name):self.getBase64(name)self.getInformation()self.analysis()os.rename(name, self.fatherName + "-" + self.money + ".jpg")print(self.data)print(self.fatherName)print(self.money)
#主函数部分应该不用解释了,很easy的方法。
if __name__ == "__main__":nameList = os.listdir()nameList.remove("main.py")for name in nameList:sImg = Image.open(name)w, h = sImg.sizedImg = sImg.resize((int(w/2), int(h/2)), Image.ANTIALIAS)dImg.save(name)try:re = recognition()re.start(name)except AttributeError:print(name + "错误")

总结

这个活没啥难度,主要是我进行了面向对象的改写。朋友们有想让我帮忙识别发票的,我可以来哦。

github

连接在此:
github上托管的代码地址

作为APIcaller识别发票信息相关推荐

  1. Python批量识别发票信息并自动填写到网上

    一.问题缘起 平时工作中会接触到很多发票,报销前需要把发票的各种信息包括:发票号码.发票代码.校验码.金额等信息录入到报账系统中.如果手机一个个复制粘贴,非常麻烦,而且容易出错,如果采用Python的 ...

  2. 发票信息批量提取到 excel 软件 4.0

    个人微信 394467238 4.0 更新 新增了自己的OCR引擎,使用了神经网络模型,但是很可能会导致导入模块失败,并且识别的结果还有很多小问题,所以还请大家使用后反馈问题 新增了用发票号码.发票代 ...

  3. 发票信息批量提取到 excel 软件 3.1

    3.1 更新 基础图片识别完全放开了次数限制,可以完全免费使用了,并且修改了之前的一个会导致闪退的bug 新增了高级PDF批量识别,对于扫描版本的PDF文件可以支持了 3.0 更新 最大的改动为使用次 ...

  4. 发票信息批量提取到 excel 软件 3.0

    3.0 更新 最大的改动为使用次数可以自动获取了,通过微信扫描小程序即可获得 修改了高级图片识别的一些发票项目的bug 2.5更新: 改正了很多影响体验的bug....用起来应该会好多了 2.4更新: ...

  5. 发票信息批量提取到 excel 软件 5.1

    5.1更新 精简入口,合并了图片和PDF的识别入口 修正了一些网络不好的情况下的bug 4.0 更新 新增了自己的OCR引擎,使用了神经网络模型,但是很可能会导致导入模块失败,并且识别的结果还有很多小 ...

  6. Python提取PDF发票信息保存Excel文件并制作EXE程序

    前言 通过本篇文章可学习pdf发票信息的提取,内容保存至Excel,了解命令图像工具Gooey,以及如何将python文件打包为exe程序 背景 现在电子发票越来越普遍,各公司开票形式已基本无纸化.目 ...

  7. Python批量识别PDF文件格式发票信息并生成Excel表格

    最近有同学提问说,能不能讲一讲识别发票图片并整理数据到Excel里的方法.今天我们就针对这样的实际需求,分享一个基于 PDF 的 Python 办公自动化的解决案例. 先来看看需求. 需求描述 在某个 ...

  8. 快速准确读取发票信息——发票扫描识别系统

    一.发票扫描识别系统的定义 奥普思凯快票通表票扫描识别系统(以下简称发票扫描识别系统)是高性能扫描仪和OCR识别技术的结合.软硬一体化的系统. 快速准确读取发票信息--发票扫描识别系统 发票扫描识别系 ...

  9. 发票识别+发票查验API-企业财务信息智能化与共享化建设

    对于企业而言,财务部门是企业的神经中枢,能够对企业信息进行全面掌控,对于公司战略规划.预算管理.资金管理.内部控制.纳税管理等起着决定性作用.但在技术不发达的年代,财务信息共享难度大,管理成本高. 现 ...

最新文章

  1. DIP第一章习题解答
  2. yum搭建本地仓库、国内源、下载rpm包、源码安装
  3. 增加定时检测linux占用内存,及时清理功能
  4. 数据结构与算法LeetCode题目记录
  5. 中国移动苏州研发中心前端笔试(2)
  6. 计算机b类核心期刊有哪些,cssci、A类、B类、C类、核心期刊都是什么等级的期刊?...
  7. 人才管理是什么意思_hr是什么意思(HR到底是干什么的?)
  8. java中执行ddl语句,DDL(数据定义语言)
  9. ae去闪插件deflicker使用_ae去闪烁插件Flicker Free怎么用-ae去闪烁插件Flicker Free的使用教程 - 河东软件园...
  10. postgresql-timescaldb_extention
  11. 汇编语言里 eax ebx ecx edx esi edi ebp esp
  12. 华为服务器显示乱码,本地正常 服务器乱码
  13. OpenglES2.0 for Android:来做个地球吧
  14. linux系统查看IP地址,不显示IP地址或者只显示127.0.0.1
  15. SpringCloud-4-OpenFeign
  16. 冯诺依曼体系结构及操作系统(OS)的简单认识
  17. Linux-安装ifconfig
  18. android studio真机调试华为手机
  19. (19)正投影变换(三视图)
  20. 图片懒加载是怎么实现的?如何实现图片懒加载?

热门文章

  1. PPT画图如何保存600dpi以及消除白边问题
  2. itpt_TCPL 第三章:控制流
  3. java LPT1_Java 未知异常 求解
  4. 理解BPDU Filtering的意义(BPDU Filtering在全局配置与接口配置上的区别)
  5. excel减法函数_会计小白的EXCEL学习笔记
  6. 一个美式英语发音的app开源
  7. 哈工大CSAPP大作业:程序人生-Hello’s P2P
  8. Minigui实现半透效果
  9. win7请不要关闭计算机 正在安装更新,WIN7旗舰版系统总是提示自动安装更新关闭方法...
  10. 微信小程序开发中遇到的坑