技巧|Python 批量自动提取、整理 PDF 发票

本文分享一个基于 PDF 的 Python 办公自动化的案例解决,也是某位财务小姐姐提出的真实需求,先来看看需求。

需求描述

在某个文件夹下有多个 PDF 类型发票技巧|Python 批量自动提取、整理 PDF 发票

每一张发票 PDF 是纯图片类型,里面的文字信息无法手动复制(事实上大多数发票可以复制部分文字,但我们扔以图片形式来讲解),大致如下图所示:技巧|Python 批量自动提取、整理 PDF 发票

需要满足的需求是:获取 总金额、纳税人识别号、开票人,即如下三个方框位置:技巧|Python 批量自动提取、整理 PDF 发票

最后结合批量操作,在获取上述信息后将其存储入 Excel 中!技巧|Python 批量自动提取、整理 PDF 发票

思路与代码实现

需求本质是一个图片识别问题,因为 PDF 里的内容是图片类型,无法按常规方法直接把文本抽提出来。解决思路是利用光学字符识别(OCR)将图片中的文字识别出。但同时也需要注意,PDF 毕竟不是图片,为了完成 OCR,除了OCR自身之外还要下载 Ghostscript 和 ImageMagick 用来完成类型转换。已 Windows 系统为例,需要在电脑上安装以下三个软件:

Ghostscript 32 位
ImageMagick 32 位
tesseract-OCR 32 位

三个软件的下载安装没有特殊的地方(tesseract 配置稍复杂但网络有上诸多教程,这里不再赘述),读者可自行搜索下载及配置,下面讲解代码。首先导入需要的模块:

from wand.image import Imagefrom PIL import Image as PIimport pyocrimport pyocr.buildersimport ioimport reimport osimport shutil

登录后复制

具体的模块用途可以参考下面具体代码。其中 wand 和 pyocr 由于是非标准库需要自行额外安装。打开命令行输入:

pip install wandpip install pyocr

登录后复制

本需求还涉及对接 Excel,可考虑利用 openpyxl 库的 Workbook 用以创建新的 Excel 文件:

from openpyxl import Workbook

登录后复制

需求中的 发票.pdf 放在桌面上。可通过下面基于 os 模块的代码获取桌面路径:

# 获取桌面路径包装成一个函数def GetDesktopPath():    return os.path.join(os.path.expanduser("~"), 'Desktop')path = GetDesktopPath() + r'发票.pdf'

登录后复制

获取配置好的 tesseract 便于后面调用:

tool = pyocr.get_available_tools()[0]

登录后复制

通过 wand 模块将 PDF 文件转化为分辨率为 300 的 jpeg 图片形式:

image_pdf = Image(filename=path, resolution=300)image_jpeg = image_pdf.convert('jpeg')

登录后复制

将图片解析为二进制矩阵:

image_lst = []for img in image_jpeg.sequence:    img_page = Image(image=img)    image_lst.append(img_page.make_blob('jpeg'))

登录后复制

用 io 模块的 BytesIO 方法读取二进制内容为图片形式:

new_img = PI.open(io.BytesIO(image_lst[0]))new_img.show()

登录后复制

接下来分别截取需要提取部位字符串的图片了,尽量让图片中只有需要识别的部分,获取识别出来容易简单处理获得需要的内容。

首先以总金额为例,截取图片用 image.crop((left, top, right, bottom)) 四个参数需要反复调试才能确定。经确定四个参数分别是 1600 760 1830 900,尝试截取和预览图片:

### 解析1Z开头码left = 350top = 600right = 1300bottom = 730image_obj1 = new_img.crop((left, top, right, bottom))image_obj1.show()

登录后复制

技巧|Python 批量自动提取、整理 PDF 发票

截取成功后可以交给 OCR 了,代码为 tool.image_to_string()

txt1= tool.image_to_string(image_obj1)print(txt1)

登录后复制

技巧|Python 批量自动提取、整理 PDF 发票

同样,通过方位的调试就可以准确切割到需要的部分进行识别:

left = 560top = 1260right = 900bottom = 1320image_obj2 = new_img.crop((left, top, right, bottom))# image_obj2.show()txt2 = tool.image_to_string(image_obj2)# print(txt2)

登录后复制

最后是开票人的识别技巧|Python 批量自动提取、整理 PDF 发票

left = 1420top = 1420right = 1700bottom = 1500image_obj3 = new_img.crop((left, top, right, bottom))# image_obj3.show()txt3 = tool.image_to_string(image_obj3)# print(txt3)

登录后复制

技巧|Python 批量自动提取、整理 PDF 发票

需要确认识别的内容是否正确,如果识别正确率欠佳可以考虑通过图片处理技术消除噪声,也可以去官网下载更高精度的训练包提高识别的正确性

至此,我们成功的识别了总金额、纳税人识别号、开票人三个消息,接下来就通过非常熟悉的 openpyxl 写入Excel,并使用 os 模块实现批量操作即可

workbook = Workbook()sheet = workbook.activeheader = ['总金额', '纳税人识别号', '开票人']sheet.append(header)sheet.append([txt1, txt2, txt3])workbook.save(GetDesktopPath() + r'汇总.xlsx')

登录后复制

技巧|Python 批量自动提取、整理 PDF 发票

综上,整个需求就成功实现,从效果来看还是非常不错的!完整源码可由文中代码组合而成(已全部分享在文中),感兴趣的读者可以自己尝试!

最后想说的是,其实本文的案例可以衍生出很多实用的办公自动化脚本,例如

批量计算发票金额并重命名文件夹
根据发票类型批量分类
根据发票批量制作报销单
··· ···

以上就是技巧|Python 批量自动提取、整理 PDF 发票的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2228116.html

(0)
上一篇 2025年2月26日 12:47:06
下一篇 2025年2月26日 12:47:24

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • git如何使用工具辅助解决合并冲突

    解决git合并冲突可以使用vs code和git mergetool:1. vs code通过直观展示冲突并提供合并编辑器,适合快速解决简单冲突。2. git mergetool与kdiff3等工具集成,适合处理复杂冲突。使用这些工具能提高…

    2025年5月2日
    000
  • 批量安装VSCode插件的高效方法

    批量安装vscode插件的高效方法是使用命令行工具。具体步骤包括:1. 导出插件列表:运行code –list-extensions > extensions.txt。2. 批量安装插件:运行cat extensions.…

    2025年5月2日
    000
  • 禁用VSCode插件以提升性能的策略

    是的,使用vscode时,插件过多会导致性能下降。可以通过以下步骤禁用插件来提升性能:1. 明确工作需求,禁用偶尔使用的插件;2. 使用性能监视器查看插件资源消耗,禁用高占用且不常用的插件;3. 在扩展管理器中禁用插件,并在特定工作区灵活配…

    2025年5月2日
    000
  • 在Debian上Nginx SSL如何实现自动续期

    在debian系统上,可以通过certbot工具轻松实现nginx ssl证书的自动续期。certbot是一个自动化的let’s encrypt客户端,专门用于获取和续期ssl证书。以下是具体的操作步骤: 安装Certbot: sudo a…

    2025年5月2日
    000
  • CentOS上如何调试PyTorch代码

    在centos上调试pytorch代码,你可以遵循以下步骤: 安装Python和PyTorch:确保你的CentOS系统上安装了Python。推荐使用Anaconda来管理Python环境和包。你可以从Anaconda官网下载并安装适合你系…

    编程技术 2025年5月2日
    000
  • Ubuntu Overlay如何解决冲突

    在ubuntu中,overlay文件系统通常用于容器技术,特别是在docker中。它通过将多个文件系统层次结构组合成一个单一的视图,来实现文件的覆盖和修改,而不会影响到底层文件系统。然而,当使用overlay文件系统时,可能会遇到冲突,例如…

    编程技术 2025年5月2日
    000
  • ubuntu定时器失败怎么办

    当ubuntu的定时器失败时,可以按照以下步骤进行排查和解决: 检查Cron服务状态 首先,确保Cron服务正在运行。可以使用以下命令检查Cron服务的状态: sudo systemctl status cron 登录后复制 如果服务未运行…

    编程技术 2025年5月2日
    000
  • Flutter在Debian上的使用体验

    在debian系统上使用flutter的体验可以从多个角度进行详细探讨,包括安装配置、性能表现以及如何处理常见问题。以下是详细的介绍: 安装与配置 要在Debian上运行Flutter,首先需要安装Flutter SDK和Dart运行时。安…

    2025年5月2日
    000
  • Debian Apache虚拟主机域名怎么设置

    在debian系统上配置apache虚拟主机域名需要经过多个步骤,下面是详细的操作指南: 1. 安装Apache 首先,确认Apache服务器已安装。如果未安装,请使用以下命令进行安装: sudo apt updatesudo apt in…

    2025年5月2日
    000
  • 如何在Debian中自定义Strings内容

    在debian系统中,调整字符串内容通常涉及修改系统或应用程序的配置文件。以下是一些常用的方法来实现这一目标: 1. 调整系统默认字符串 如果你希望改变系统的默认字符串(如错误信息、提示文字等),可以通过编辑相关的配置文件来实现。 示例:编…

    2025年5月2日
    000

发表回复

登录后才能评论