在日常的财务和办公处理中,我们常常会遇到大量的 PDF 格式发票,需要从中提取关键数据,如开票公司、开票日期、发票号码和开票金额等,以便进行数据分析、财务报表制作或其他业务流程。手动提取这些数据不仅耗时费力,还容易出错。今天,我们就来分享一个使用 Python 和 PyQt5 开发的 PDF 发票数据提取工具,它可以自动化地完成这些繁琐的工作。
一、代码应用场景
这个工具主要应用于需要对大量 PDF 发票进行数据提取的场景,比如企业财务部门处理每月的发票数据、会计师事务所进行审计工作时处理客户发票等。它能够将原本需要人工逐张发票查看并记录数据的工作,转变为一键式的数据提取,大大提高了工作效率和准确性。
二、代码整体结构
整个代码主要分为三个部分:
- 导入必要的库:这部分代码引入了程序运行所需的各种库,包括文件操作、多线程处理、PDF 文件解析、正则表达式处理、CSV 文件写入以及 PyQt5 图形界面库。
- 定义图形界面类:
Windows
类继承自QWidget
,负责创建和管理图形用户界面,包括各种输入框、按钮、标签和进度条等组件的初始化和布局设置,以及用户交互事件的处理。 - 数据提取逻辑:在
extract_data
方法中,实现了从 PDF 文件中提取数据,并将数据写入 CSV 文件的核心逻辑。同时,通过多线程技术,避免了界面在数据提取过程中出现卡顿现象。
三、代码详细解析
(一)导入库
import glob
import sys
import threading
import pdfplumber
import re
import os
import csv
from PyQt5.Qt import *
glob
:用于查找符合特定规则的文件路径名,方便获取指定目录下的所有 PDF 文件。sys
:提供对 Python 解释器使用或维护的一些变量的访问,以及与解释器进行交互的函数,例如获取命令行参数、退出程序等。threading
:实现多线程编程,使得数据提取操作可以在后台线程中进行,不影响主界面的响应。pdfplumber
:专门用于处理 PDF 文件的库,可以方便地提取 PDF 文件中的文本内容。re
:正则表达式操作库,用于在提取的 PDF 文本中搜索和匹配特定的字符串模式,以提取我们需要的数据。os
:提供了与操作系统进行交互的功能,例如文件和目录操作。csv
:用于处理 CSV 文件的读取和写入,CSV 是一种常用的表格数据存储格式。from PyQt5.Qt import *
:导入 PyQt5 库的所有模块,PyQt5 是 Python 的一个 GUI(图形用户界面)框架,用于创建交互式应用程序的图形界面。
(二)图形界面类定义
class Windows(QWidget):
def __init__(self):
super().__init__()
self.initUI()
Windows
类继承自QWidget
,__init__
方法是类的构造函数,在创建类的实例时被调用。它首先调用父类的构造函数super().__init__()
,然后调用initUI
方法来初始化用户界面。
def initUI(self):
# 创建主布局
main_layout = QVBoxLayout()
self.setLayout(main_layout)
# 文件选择部分布局
file_layout = QHBoxLayout()
# 文件地址标签
label = QLabel("文件地址:")
file_layout.addWidget(label)
# 文件地址输入框
self.text_edit = QLineEdit()
file_layout.addWidget(self.text_edit)
# 打开文件按钮
open_button = QPushButton("发票位置")
file_layout.addWidget(open_button)
open_button.clicked.connect(self.filedir)
main_layout.addLayout(file_layout)
# 保存位置选择部分布局
save_layout = QHBoxLayout()
# 保存位置标签
save_label = QLabel("保存位置:")
save_layout.addWidget(save_label)
# 保存位置输入框
self.save_edit = QLineEdit()
self.save_edit.setReadOnly(True)
save_layout.addWidget(self.save_edit)
# 选择保存位置按钮
save_button = QPushButton("选择保存位置")
sa