Python发票查看小程序,简易代码读取电子发票编码库,上传发票自动比对数据库,重复发票即时标红提醒,解决重复报销痛点。

张开发
2026/4/18 14:48:42 15 分钟阅读

分享文章

Python发票查看小程序,简易代码读取电子发票编码库,上传发票自动比对数据库,重复发票即时标红提醒,解决重复报销痛点。
针对企业财务和个人报销中“重复报销”这一顽疾设计了一套 基于Python的“电子发票查重与验真助手”。这套方案利用哈希指纹算法通过对比发票的唯一标识码实现毫秒级的重复报销拦截。以下是完整的项目交付文档项目名称InvoiceGuardian (发票查重卫士)一、 实际应用场景描述场景 A企业财务 员工小张不小心把一张1000元的餐饮发票夹在两本不同的单据夹里月底分别提交给了财务财务审核未发现导致公司损失1000元。场景 B个人记账 你用微信支付了一张发票后来又用支付宝支付了同一笔退款未到账如果不查重你可能误以为自己花了双倍钱。解决方案1. 运行本程序通过GUI界面或命令行上传电子发票PDF或OFD格式。2. 程序自动解析发票上的发票代码和发票号码唯一ID。3. 程序查询本地数据库SQLite检查是否存在相同ID。4. 若存在立即在界面上标红并弹窗警告“重复发票”。二、 引入痛点 (Pain Points)传统发票管理方式存在以下漏洞1. 人工肉眼难辨 发票数量多时靠人眼核对发票号码几乎不可能。2. PS造假 纸质发票复印件容易造假但电子发票的“发票代码号码”是唯一且不可篡改的。3. 跨周期报销 上月忘记报本月又拿出来容易被忽略。4. 系统昂贵 市面上的ERP查重模块动辄上万小微企业和个体户用不起。本方案的解决思路利用 “哈希指纹 轻量级数据库”。将每张发票的唯一编号存入SQLite数据库。Python读取新发票时只需一次SELECT 查询即可判定真伪与重复性。三、 核心逻辑讲解 (Algorithm Logic)我们采用 “唯一键哈希 SQLite索引查询” 算法1. 发票指纹提取 (Fingerprint Extraction)- 电子发票PDF/OFD本质上是文本文件。- 使用正则表达式regex 提取发票代码 (\d{12}) 和发票号码 (\d{8})。- 组合成唯一键invoice_id code _ number。2. 数据库设计 (Schema)- 使用 SQLite无需单独安装数据库服务。- 表结构invoices (id INTEGER PRIMARY KEY, invoice_code TEXT, invoice_number TEXT, amount REAL, upload_time DATETIME)。- 对(invoice_code, invoice_number) 建立 UNIQUE 约束。3. 查重逻辑 (Duplicate Check)-INSERT OR IGNORE尝试插入新发票如果违反唯一约束说明是重复的。四、 代码模块化实现 (Core Code)以下是核心程序invoice_guardian.py。技术栈 Python 3.x pdfplumber (解析PDF) sqlite3 tkinter (简易GUI)。invoice_guardian.py功能电子发票查重与数据库管理作者全栈工程师 技术博主日期2026-04-13import sqlite3import pdfplumberimport reimport osfrom datetime import datetime# # 模块一数据库管理器# class InvoiceDBManager:使用SQLite管理发票数据库def __init__(self, db_pathinvoices.db):self.conn sqlite3.connect(db_path)self.cursor self.conn.cursor()self._create_table()def _create_table(self):创建发票表并设置唯一约束self.cursor.execute(CREATE TABLE IF NOT EXISTS invoices (id INTEGER PRIMARY KEY AUTOINCREMENT,invoice_code TEXT NOT NULL,invoice_number TEXT NOT NULL,amount REAL,upload_time DATETIME DEFAULT CURRENT_TIMESTAMP,UNIQUE(invoice_code, invoice_number)))self.conn.commit()def check_and_insert(self, code, number, amount):检查发票是否存在不存在则插入返回(is_duplicate, message)try:self.cursor.execute(INSERT INTO invoices (invoice_code, invoice_number, amount)VALUES (?, ?, ?), (code, number, amount))self.conn.commit()return False, ✅ 发票校验通过已入库。except sqlite3.IntegrityError:# 违反唯一约束说明是重复发票return True, 警告重复发票该发票已在数据库中。# # 模块二发票解析器 (PDF)# class InvoiceParser:从PDF电子发票中提取关键信息def __init__(self):# 发票代码通常是12位数字号码是8位self.code_pattern re.compile(r发票代码[:]?\s*(\d{12}))self.number_pattern re.compile(r发票号码[:]?\s*(\d{8}))self.amount_pattern re.compile(r价税合计.*?(\d\.\d{2}))def parse_pdf(self, pdf_path):解析PDF文件内容with pdfplumber.open(pdf_path) as pdf:page pdf.pages[0]text page.extract_text()code_match self.code_pattern.search(text)number_match self.number_pattern.search(text)amount_match self.amount_pattern.search(text)if not code_match or not number_match:raise ValueError(无法从PDF中解析出发票代码或号码)return {code: code_match.group(1),number: number_match.group(1),amount: float(amount_match.group(1)) if amount_match else 0.0}# # 模块三主程序入口 (CLI/GUI逻辑)# def main(file_path):print( 启动发票查重卫士...)# 1. 初始化数据库db_manager InvoiceDBManager()# 2. 解析发票parser InvoiceParser()try:invoice_data parser.parse_pdf(file_path)print(f 解析成功: {invoice_data})except Exception as e:print(f❌ 解析失败: {e})return# 3. 查重校验is_duplicate, message db_manager.check_and_insert(invoice_data[code],invoice_data[number],invoice_data[amount])# 4. 输出结果print(message)if is_duplicate:print( 操作终止请勿重复报销)else:print(✅ 操作成功发票已记录。)if __name__ __main__:# 示例用法实际使用时可以从GUI获取文件路径test_file test_invoice.pdfif not os.path.exists(test_file):print(f请将测试发票 {test_file} 放在同目录下。)else:main(test_file)五、 README.md 文件# InvoiceGuardian 终结重复报销Python电子发票查重系统## 项目简介利用Python解析PDF电子发票通过SQLite数据库存储发票唯一ID毫秒级检测重复报销行为。适用于中小企业财务及个人记账。## ️ 环境依赖- Python 3.8- pdfplumber (pip install pdfplumber)- sqlite3 (Python内置)## 快速开始1. 安装依赖bashpip install pdfplumber2. 准备测试发票 test_invoice.pdf。3. 运行程序bashpython invoice_guardian.py## ⚙️ 核心逻辑- **唯一键** 发票代码 发票号码- **防重机制** SQLite UNIQUE 约束六、 使用说明 (User Guide)Step 1: 准备环境确保你的电脑安装了Python 3.8以上版本。Step 2: 安装解析库pip install pdfplumberStep 3: 运行与测试1. 将一张电子发票PDF文件重命名为test_invoice.pdf放在脚本同目录。2. 运行脚本。3. 第一次运行 显示“✅ 发票校验通过”。4. 第二次运行同一张发票 显示“ 警告重复发票”。Step 4: 集成到GUI (进阶)可以将此逻辑嵌入到tkinter 或PyQt 按钮事件中实现点击按钮上传文件并查重。七、 核心知识点卡片 (Flash Cards)卡片主题 编程/算法概念 财税/安全关联正则表达式 (Regex)\d{12},search() 从非结构化文本中提取关键IDSQLite 唯一约束UNIQUE(code, number) 数据库层面的原子性防重最可靠PDF 文本提取pdfplumber 破解电子发票的“黑盒”数据事务处理COMMIT 确保数据写入的完整性异常处理try...except 优雅处理文件损坏或格式错误八、 总结作为一名全栈工程师我深知“信任但要验证”是财务管理的基石。这个发票查重项目用不到200行Python代码构建了一个企业级的防作弊系统1. 数据指纹 将物理世界的票据转化为数字世界的唯一哈希键。2. 零成本部署 利用SQLite无需昂贵的服务器笔记本即可运行。3. 风险隔离 在资金流出前代码筑起最后一道防线。下次当你收到一张电子发票时别急着贴票先让invoice_guardian.py 帮你“验明正身”。让每一分钱的流向都经得起代码的推敲。️利用AI解决实际问题如果你觉得这个工具好用欢迎关注长安牧笛

更多文章