欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

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

时间:2023-05-28
前言

通过本篇文章可学习pdf发票信息的提取,内容保存至Excel,了解命令图像工具Gooey,以及如何将python文件打包为exe程序

背景

现在电子发票越来越普遍,各公司开票形式已基本无纸化。目前所在公司的情况是,每个人自己报账,需要将发票信息(发票号/金额)填如K3系统进行流程申请,另外将电子发票打印为纸质并贴票后找领导签字及审批K3的流程;之后在将纸质单据送至财务审批。如果财务发现数据填写不正确,就会将流程和单据打回来,又要重新找领导签字审批,相当麻烦。

分析

为了减少报账被打回来的情况,我们先分析,整个报账过程中,存在的问题

下载回来的发票文件命名不规范不容易识别
如:04500160011131347550.pdf

填K3时需要复制发票号和金额,还要选择发票类型
每次要打开pdf发票复制发票号和金额

发票可能存在错误情况:如公司名称或纳税人识别号不正确
每次还要检查一下

优化

一开始的想法是,做一个程序,识别发票信息并提供复制按钮,方便复制到k3。自动检查发票信息是否完整正确,公司名称和纳税人识别号是否正确,如不正确则提示错误,另外自动将文件重名称,及一键打印功能。
不过由于对Python的GUI还不大熟悉,就改了方式:将发票信息提取至Excel,在自己到Excel上复制信息和检查发票是否完整,另外将文件重命名为开票公司+金额的形式

最终效果 实现 读取pdf发票

使用pdfplumber,安装命令pip install pdfplumber,

import pdfplumberimport reimport osdef re_text(bt, text): m1 = re.search(bt, text) if m1 is not None: return re_block(m1[0])def re_block(text): return text.replace(' ', '').replace(' ', '').replace(')', '').replace(')', '').replace(':', ':')def get_pdf(dir_path): pdf_file = [] for root, sub_dirs, file_names in os.walk(dir_path): for name in file_names: if name.endswith('.pdf'): filepath = os.path.join(root, name) pdf_file.append(filepath) return pdf_filedef read(): filenames = get_pdf('C:UsersAdministratorDesktopa') # 修改为自己的文件目录 for filename in filenames: print(filename) with pdfplumber.open(filename) as pdf: first_page = pdf.pages[0] pdf_text = first_page.extract_text() if '发票' not in pdf_text: continue # print(pdf_text) print('--------------------------------------------------------') print(re_text(re.compile(r'[u4e00-u9fa5]+电子普通发票.*?'), pdf_text)) t2 = re_text(re.compile(r'[u4e00-u9fa5]+专用发票.*?'), pdf_text) if t2: print(t2) # print(re_text(re.compile(r'发票代码(.*d+)'), pdf_text)) print(re_text(re.compile(r'发票号码(.*d+)'), pdf_text)) print(re_text(re.compile(r'开票日期(.*)'), pdf_text)) print(re_text(re.compile(r'名s*称s*[::]s*([u4e00-u9fa5]+)'), pdf_text)) print(re_text(re.compile(r'纳税人识别号s*[::]s*([a-zA-Z0-9]+)'), pdf_text)) price = re_text(re.compile(r'小写.*(.*[0-9.]+)'), pdf_text) print(price) company = re.findall(re.compile(r'名.*称s*[::]s*([u4e00-u9fa5]+)'), pdf_text) if company: print(re_block(company[len(company)-1])) print('--------------------------------------------------------')read()

通过上述代码可以实现对pdf发票的内容识别和输出功能,完整的功能请通过学习本文后续的内容自主实现。

写入Excel

使用xlwt写Excel文件,安装命令pip install xlwt,一个简单的例子如下

import xlwt# 创建工作簿wb = xlwt.Workbook()# 创建表单sh = wb.add_sheet('sheet 1')# 写入数据sh.write(0, 1, '姓名')# 保存wb.save('test.xls')

创建图像界面

使用Gooey创建GUI图像界面,安装命令pip install Gooey
官网地址:https://github.com/chriskiehl/Gooey 目前是:15.4k stars
这里对Gooey的适用情况做一个说明,Gooey适用于命令行的图形工具,也就是只做输入(有各种输入/选择框)和输出的情况,不适用于做界面展示,无法添加自定义按钮,如button等。使用print就能将输出内容显示到GUI图形界面上
一个简单的例子

from gooey import Gooey, GooeyParser@Gooey(program_name="简单的实例")def main(): parser = GooeyParser(description="第一个示例!") parser.add_argument('文件路径', widget="FileChooser") # 文件选择框 parser.add_argument('日期', widget="DateChooser") # 日期选择框 args = parser.parse_args() # 接收界面传递的参数 print(args)if__name__ == '__main__': main()

打包为exe文件

使用pyinstaller将代码打包为exe文件
安装命令pip install pyinstaller
打包命令pyinstaller -F xxxxx.py -w (xxxxx.py改为具体的.py文件名)
等待打包完成,在代码目录的会生成dist文件夹,打开后可以看到exe程序

注意:程序有中文输出的请查看该文章,避免打包后程序无法正常运行https://www.jianshu.com/p/6b98cdbdcfae

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。