办公利器!用Python批量识别发票并录入到Excel表格
<p>辰哥今天来分享一篇办公干货文章:<strong>用Python批量识别发票并录入到Excel表格</strong>。对于<strong>财务专业</strong>等学生或者<strong>公司财务</strong>人员来说,将报账发票等汇总到excel简直就是一个<strong>折磨</strong>。</p><p>尤其是到<strong>年底</strong>的时候,公司的财务人员面对一大堆的发票简直就是<strong>苦不堪言</strong>。正好我们学会了Python,我们应该将Python的优势发挥起来。$#</p>
<h1 id="01场景描述">01.场景描述</h1>
<p>这里有以四张发票为例(辰哥网上搜的),将发票图片放到pic文件夹下。</p>
<p><img src="https://img-blog.csdnimg.cn/img_convert/255b3896077d650c79dc28d31f7c463d.png"></p>
<p>随便打开一张发票</p>
<p><img src="https://img-blog.csdnimg.cn/img_convert/4de536970979c6726ac5723a857db1bb.png"></p>
<p>提取目标:<strong>金额</strong>、<strong>名称</strong>、<strong>纳税人识别号</strong>、<strong>开票人</strong>。</p>
<p><img src="https://img-blog.csdnimg.cn/img_convert/efafbeecf8e69701bc2f80624d82edcf.png"></p>
<p>最后将每一张发票的这四个内容保存到excel中:</p>
<p><img src="https://img-blog.csdnimg.cn/img_convert/ca2adf9314cd633183ccf762966b2228.png"></p>
<h1 id="02准备环境">02.准备环境</h1>
<p>需要用到的库如下:</p>
<pre><code class="language-python">from PIL import Image as PI
import pyocr
import pyocr.builders
from cnocr import CnOcr
</code></pre>
<p>安装的命令如下:</p>
<pre><code class="language-python">pip install pyocr
pip install cnocr
</code></pre>
<p>发票中含有中文内容,我们需要对图片中的中文进行识别,那么 cnocr 是一个不错的选择。</p>
<p><strong>提示</strong>:安装好上面的库之外,还需要安装额外的exe文件,不然会出现下面这种错误</p>
<p><img src="https://img-blog.csdnimg.cn/img_convert/6798095d3b1ba69f0902fb18c8ba2b48.png"></p>
<p>需要安装的exe文件:</p>
<h4 id="1--imagemagick">1.ImageMagick</h4>
<h4 id="2--tesseract-ocr">2.tesseract-OCR</h4>
<p>这两个软件的安装过程就不再赘述了,大家可以自行搜索教程进行安装。</p>
<h1 id="03提取内容">03.提取内容</h1>
<p>下面以其中一张图片为例,讲解如何提取目标内容:<strong>金额</strong>、<strong>名称</strong>、<strong>纳税人识别号</strong>、<strong>开票人</strong>。</p>
<p><img src="https://img-blog.csdnimg.cn/img_convert/e97440a0f26ae9a03f20995f37be43a7.png"></p>
<p>读取图片:<strong>pic/pic1.jpg</strong></p>
<pre><code class="language-python">tool = pyocr.get_available_tools()
img_url = "pic/pic1.jpg"
with open(img_url, 'rb') as f:
a = f.read()
new_img = PI.open(io.BytesIO(a))
</code></pre>
<h3 id="1提取金额">1.提取金额</h3>
<p>需要截取到发票中<strong>金额</strong>的位置</p>
<pre><code class="language-python">## 金额
left = 741
top = 420
right = 850
bottom = 445
image_text1 = new_img.crop((left, top, right, bottom))
#展示图片
image_text1.show()
</code></pre>
<p>这里的left、top、right、bottom的数值是通过<strong>多次修改定位而来</strong>。大家根据自己的发票内容去定位即可。</p>
<p><img src="https://img-blog.csdnimg.cn/img_convert/42d91d19ffa105cb91ce1c90a204a248.png"></p>
<p>接着将<strong>图片中的数字提取出来</strong></p>
<p><img src="https://img-blog.csdnimg.cn/img_convert/be45e5041d427d3cff2ec075e013d885.png"></p>
<p>同样的,下面继续提取:<strong>名称</strong></p>
<h3 id="2提取名称">2.提取名称</h3>
<pre><code class="language-python">left = 155
top = 450
right = 450
bottom = 470
image_obj2 = new_img.crop((left, top, right, bottom))
image_obj2.show()
</code></pre>
<p><img src="https://img-blog.csdnimg.cn/img_convert/583079eb502f76a17989a44ae63c54bf.png"></p>
<p>这里的名称是中文的,咱们不能再像提取金额(<strong>数字</strong>)操作。需要使用到cnocr去将图片中的中文取出。</p>
<pre><code class="language-python">image_obj2.save("tmp.jpg")
ocr = CnOcr()
res = ocr.ocr("tmp.jpg")
print("".join(res))
</code></pre>
<p><img src="https://img-blog.csdnimg.cn/img_convert/3e7859ed55e5b3066547f4de69e250f5.png"></p>
<h3 id="3提取纳税人识别号">3.提取纳税人识别号</h3>
<pre><code class="language-python">#纳税人识别号
left = 155
top = 470
right = 450
bottom = 490
image_text3 = new_img.crop((left, top, right, bottom))
#展示图片
image_text3.show()
</code></pre>
<p><img src="https://img-blog.csdnimg.cn/img_convert/3d6622c3cbe8c0dc2b2e739e5eea18a5.png"></p>
<pre><code class="language-python">txt3 = tool.image_to_string(image_text3)
print(txt3)
</code></pre>
<p>将图片中的纳税人识别号提取出来,结果如下:</p>
<p><img src="https://img-blog.csdnimg.cn/img_convert/812cc9821533f34933b8f5f6ad84cf79.png"></p>
<h3 id="4提取开票人">4.提取开票人</h3>
<pre><code class="language-python">left = 528
top = 550
right = 670
bottom = 600
image_obj4 = new_img.crop((left, top, right, bottom))
image_obj4.show()
</code></pre>
<p><img src="https://img-blog.csdnimg.cn/img_convert/a8cff1f3a479f8522d6b4e545d87c6f8.png"></p>
<pre><code class="language-python">image_obj4.save("tmp.jpg")
ocr = CnOcr()
res = ocr.ocr("tmp.jpg")
print("".join(res))
</code></pre>
<p>由于有中文,咱们这里同样和提取<strong>名称</strong>一样,使用cnocr将图片中的中文取出。</p>
<p><img src="https://img-blog.csdnimg.cn/img_convert/04710e8e3863635c0cebb82aac0300e1.png"></p>
<p>ok这样我们就将发票中的四个目标内容提取出来,接着将<strong>文件夹pic</strong>下的所有发票,进行识别将内容保存到excel。</p>
<h1 id="04批量识别发票并保存到excel">04.批量识别发票并保存到excel</h1>
<p>在读取图片之前,先将上面的四个操作封装成函数,方便每一种发票对象进行调用。</p>
<p><img src="https://img-blog.csdnimg.cn/img_convert/00b9ea7ddd36e7cc2bf74eeef04e6a12.png"></p>
<p>读取文件夹下的所有图片。</p>
<pre><code class="language-python">filePath = 'pic'
pic_name = []
for i,j,name in os.walk(filePath):
pic_name = name
for i in pic_name:
print(i)
</code></pre>
<p><img src="https://img-blog.csdnimg.cn/img_convert/48a2c675ad65b196ede82eec2366bbc0.png"></p>
<p>开始进行识别,并将结果写入到excel中。</p>
<pre><code class="language-python">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")# 保存结果
</code></pre>
<p>最后保存为:发票汇总-李运辰.xls,其结果如下:</p>
<p><img src="https://img-blog.csdnimg.cn/img_convert/9d7646a9dab35514b94a24c832060b96.png"></p>
<h1 id="05发票验证真伪">05.发票验证真伪</h1>
<p>在辰哥的交流群里,和小伙伴聊到这个内容时,小伙伴建议可以加一个功能:<strong>发票验证真伪</strong>。</p>
<p><img src="https://img-blog.csdnimg.cn/img_convert/c53fa87c47132e8f88e8a1f087368c85.png"></p>
<p>所有在上面的开始识别之前(自己公司的发票可能不需要查验这步),先调用一下第三方的接口,对发票进行识别,识别通过之后再将其提取发票中目标内容。</p>
<h3 id="1申请百度ai应用">1.申请百度AI应用</h3>
<p><img src="https://img-blog.csdnimg.cn/img_convert/00db50394942a052c738ea21cc12dc33.png"></p>
<h3 id="2获取token">2.获取token</h3>
<pre><code class="language-python"># 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']
</code></pre>
<p>这里的client_id 为官网获取的AK, client_secret 为官网获取的SK,是上面申请好应用即可获取</p>
<h3 id="3查验">3.查验</h3>
<p><img src="https://img-blog.csdnimg.cn/img_convert/2811d37cbd78cd47df83af179f2b1362.png"></p>
<p>咱以这张图片为例,进行查验</p>
<p><img src="https://img-blog.csdnimg.cn/img_convert/b8c0c0d708702fd8e5668cefea136a5b.png"></p>
<p>其中的发票类型对应如下:</p>
<p><img src="https://img-blog.csdnimg.cn/img_convert/1e17a4122840c543ac9a1cef72e7697c.png"></p>
<p>结果如下:</p>
<p><img src="https://img-blog.csdnimg.cn/img_convert/aed5a3a1982043e5dbb2f595fd706b95.png"></p>
<p>感觉这个结果查询不是很好(不详细)。下面还可以去<strong>税务局</strong>查询</p>
<h3 id="4税务局查询发票">4.税务局查询发票</h3>
<p><img src="https://img-blog.csdnimg.cn/img_convert/611442867475c793bb38dbb8a85ae2fb.png"></p>
<p>同样以这张图片为例,进行查验</p>
<p><img src="https://img-blog.csdnimg.cn/img_convert/84aa0f8c849205e43a5d09c302f71d38.png"></p>
<p>填写好信息点击查验,结果如下:</p>
<p><img src="https://img-blog.csdnimg.cn/img_convert/7f46688e1fca56c40c6390f4057d8001.png"></p>
<p>再税务局查验更加清晰。读者可以根据自己的情况去选择自己的方式去查验。</p>
<h1 id="06小结">06.小结</h1>
<p>本文基本就成功实现目标要求,从效果来看还是非常不错的!完整源码可由文中代码组合而成(已全部分享在文中),感兴趣的读者可以自己尝试!</p>
<p>一定要<strong>动手尝试****!</strong>一定要<strong>动手尝试****!</strong>一定要<strong>动手尝试!</strong></p>
<p>最后想说的是,其实本文的案例可以<strong>应用再其他方面</strong>,例如</p>
<ul>
<li>
<p><strong>批量计算发票金额汇总</strong></p>
</li>
<li>
<p><strong>根据发票类型批量分类</strong></p>
</li>
<li>
<p><strong>........</strong></p>
</li>
</ul>
</div>
<div id="MySignature" role="contentinfo">
耐得住寂寞,才能登得顶</br>
Gitee码云:https://gitee.com/lyc96/projects<br><br>
来源:https://www.cnblogs.com/chenlove/p/14928412.html
頁:
[1]