吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3849|回复: 68
上一主题 下一主题
收起左侧

[原创工具] [有源码V5版本]批量改发票pdf名称为金额+发票号码+销售方,方便金额核对!

  [复制链接]
跳转到指定楼层
楼主
renminwansui 发表于 2026-6-3 15:07 回帖奖励
本帖最后由 renminwansui 于 2026-6-4 14:58 编辑

  • 工具使用目的:批量改发票pdf名称为金额+发票号码+销售方,方便金额核对,方便牛马(自嘲)报销
  • 使用步骤:双击运行exe,选择文件夹即可
  • 场景:报销的时候为了识别出发票是哪个(程序批量识别金额和销售方且自动回填)
  • 成品更新:
v2版本更新:https://95879587.lanzouu.com/isOYb3r18nbe  废弃
v3版本更新:https://95879587.lanzouu.com/iVC763r1el6d   废弃
V5版本更新:增加多种发票情况识别,增加名称加入发票号,下载地址https://95879587.lanzouu.com/iYgTw3r3ugpa

源码:
[Python] 纯文本查看 复制代码
import sys[list=1]
[*]import os
import re
import pdfplumber

def main():
    if len(sys.argv) > 1:
        folder_path = sys.argv[1]
    else:
        import tkinter as tk
        from tkinter import filedialog
        
        root = tk.Tk()
        root.withdraw()
        folder_path = filedialog.askdirectory(title="请选择包含发票PDF的文件夹")
        root.destroy()
        
        if not folder_path:
            print("未选择文件夹,程序退出。")
            input("按回车键退出...")
            sys.exit(0)
    
    if not os.path.isdir(folder_path):
        print(f"错误: {folder_path} 不是有效的文件夹")
        input("按回车键退出...")
        sys.exit(1)
    
    print("=" * 50)
    print("       发票PDF批量重命名工具")
    print("=" * 50)
    print(f"\n已选择文件夹: {folder_path}\n")
    
    pdf_files = [f for f in os.listdir(folder_path) if f.lower().endswith('.pdf')]
    
    if not pdf_files:
        print("未找到PDF文件")
        input("\n按回车键退出...")
        sys.exit(0)
    
    print(f"找到 {len(pdf_files)} 个PDF文件,开始处理...\n")
    
    success_count = 0
    fail_count = 0
    
    for filename in pdf_files:
        filepath = os.path.join(folder_path, filename)
        try:
            with pdfplumber.open(filepath) as pdf:
                text = ''
                for page in pdf.pages:
                    text += page.extract_text() or ''
            
            if not text:
                print(f"警告: {filename} 无法提取文本内容(可能是扫描件)")
                fail_count += 1
                continue
            
            amount = ''
            amount_patterns = [
                r'[金额合计¥¥]\s*[::]?\s*([0-9]+[.,][0-9]{2})',
                r'价税合计[¥¥]?\s*[::]?\s*([0-9]+[.,][0-9]{2})',
                r'合计[¥¥]?\s*[::]?\s*([0-9]+[.,][0-9]{2})',
                r'¥\s*([0-9]+[.,][0-9]{2})',
                r'¥\s*([0-9]+[.,][0-9]{2})',
            ]
            for pattern in amount_patterns:
                matches = re.findall(pattern, text)
                if matches:
                    amount = matches[0]
                    break
            
            amount = re.sub(r'[^0-9.,]', '', amount)
            if amount:
                amount = amount.replace(',', '')
            
            company = ''
            company_patterns = [
                r'名\s*称[::]\s*([^\n]{2,30})',
                r'销方[::]\s*([^\n]{2,30})',
                r'销售方[::]\s*([^\n]{2,30})',
                r'纳税人名称[::]\s*([^\n]{2,30})',
                r'销售方纳税人识别号[::\s]*([^\n]{2,30})',
            ]
            for pattern in company_patterns:
                matches = re.findall(pattern, text)
                if matches:
                    company = matches[0].strip()
                    break
            
            company = re.sub(r'[^\u4e00-\u9fa5a-zA-Z0-9()\(\)]', '', company)
            company = company[:20]
            
            if amount and company:
                new_name = f'{amount}元_{company}_发票.pdf'
            elif amount:
                new_name = f'{amount}元_销售方主体_发票.pdf'
            elif company:
                new_name = f'未知金额_{company}_发票.pdf'
            else:
                new_name = f'未识别发票_{filename}'
            
            base_name = new_name
            counter = 1
            while os.path.exists(os.path.join(folder_path, new_name)):
                name_part = os.path.splitext(base_name)[0]
                ext_part = os.path.splitext(base_name)[1]
                new_name = f'{name_part}_{counter}{ext_part}'
                counter += 1
            
            new_path = os.path.join(folder_path, new_name)
            os.rename(filepath, new_path)
            print(f'✓ 重命名: {filename}')
            print(f'  -> {new_name}\n')
            success_count += 1
            
        except Exception as e:
            print(f'✗ 处理失败: {filename}')
            print(f'  错误: {str(e)}\n')
            fail_count += 1
    
    print("-" * 50)
    print(f"处理完成!成功: {success_count}, 失败: {fail_count}")
    print("-" * 50)
    input("\n按回车键退出...")

if __name__ == "__main__":
    main()

PixPin_2026-06-03_15-13-17.png (39.81 KB, 下载次数: 0)

PixPin_2026-06-03_15-13-17.png

PixPin_2026-06-03_14-55-05.png (34.36 KB, 下载次数: 4)

选择处理的文件夹

选择处理的文件夹

免费评分

参与人数 16吾爱币 +22 热心值 +15 收起 理由
simple91 + 1 + 1 谢谢@Thanks!
踽踽独行 + 1 + 1 已收藏,谢谢@Thanks!
wuai78 + 1 用心讨论,共获提升!
towy007 + 1 + 1 谢谢@Thanks!
左岸麦田 + 3 + 1 谢谢@Thanks!
yuppy34 + 1 + 1 热心回复!
阿汪汪 + 1 我很赞同!再加个选项,把购买方的也加进去就就完美,还有个红冲的是识别不 ...
38342175 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
ioyr5995 + 1 + 1 热心回复!
hot1828958 + 1 + 1 我很赞同!
风之暇想 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
fuckcc + 1 + 1 我很赞同!
MateX + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
info99 + 1 + 1 谢谢@Thanks!对财务工作者很友好!感恩!
tb0633 + 1 + 1 我很赞同!
lzk1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

来自 35#
 楼主| renminwansui 发表于 2026-6-4 14:28 |楼主
V5版本更新:增加多种发票情况识别,增加名称加入发票号,下载地址https://95879587.lanzouu.com/iYgTw3r3ugpa
推荐
 楼主| renminwansui 发表于 2026-6-3 16:13 |楼主
推荐
 楼主| renminwansui 发表于 2026-6-3 16:27 |楼主
沙发
lwz5616 发表于 2026-6-3 15:20
这玩意提取的不对,把金额提取了,没有加税,提取的不是最终的总额度
3#
 楼主| renminwansui 发表于 2026-6-3 15:49 |楼主
lwz5616 发表于 2026-6-3 15:20
这玩意提取的不对,把金额提取了,没有加税,提取的不是最终的总额度

已发现,准备优化
4#
buzhidai 发表于 2026-6-3 15:59
税务系统可以直接导出发票的xls表格
5#
shicaoshuai 发表于 2026-6-3 16:08
这个使用有漏洞吗
7#
ocect 发表于 2026-6-3 16:20
这光金额,没有公司名称了
8#
ocect 发表于 2026-6-3 16:22
最想要的结果是公司+金额
9#
lwz5616 发表于 2026-6-3 16:22
renminwansui 发表于 2026-6-3 16:13
已优化 https://95879587.lanzouu.com/isOYb3r18nbe

还是有问题,金额对了,但是开票方很多不对。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-6-18 03:02

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表