明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1074|回复: 5

PDF电子发票识别整理程序:PDF-->Excel

[复制链接]
发表于 2022-6-15 09:28 | 显示全部楼层 |阅读模式
基于python的PDF识别,通过文字处理获取发票关键信息并展示到table上,导出Excel合并PDF等功能。
(因ocr部分不能打包exe,故ocr发票识别部分不可用)


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2022-6-15 09:30 | 显示全部楼层
链接:https://pan.baidu.com/s/1Mh6ZlZcZh83l09P_4gfbAA?pwd=WCEO
提取码:WCEO     --来自百度网盘超级会员V7的分享

Python编写的PDF电子发票识别程序_哔哩哔哩_bilibili  https://www.bilibili.com/video/BV1M5411R7UA?spm_id_from=333.999.0.0&vd_source=22f968c8f7c8841759849afd5058a215
 楼主| 发表于 2022-6-15 09:32 | 显示全部楼层
import os
import pdfplumber as pb
import pandas as pd
import re
import openpyxl
from pathlib import Path
import sys
import shutil
from time import sleep
from tkinter import *
from tkinter import filedialog

# 遍历文件夹及其子文件夹中的文件,并存储在一个列表中
# 输入文件夹路径、空文件列表[]
# 返回 文件列表Filelist,包含文件名(完整路径)
def get_filelist(dir, Filelist):
    newDir=dir
    if os.path.isfile(dir):
        Filelist.append(dir)
        # # 若只是要返回文件文,使用这个
        # Filelist.append(os.path.basename(dir))
    elif os.path.isdir(dir):
        for s in os.listdir(dir):
        #如果需要忽略某些文件夹,使用以下代码
        #if s == "xxx":
        #continue
            newDir=os.path.join(dir, s)
            get_filelist(newDir, Filelist)
    return Filelist

def get_files(Filelist,dat):
    paths = []
    names=[]
    for file in Filelist:
        if file.split('.')[-1] in dat:
                paths.append(file)
                names.append(file.split('\\')[-1])
    return paths,names

def get_dic(page,name,m):
    dic = {}
    text = page.extract_text()
    gongsi = re.findall(r'[一-龟]+公司|个人', text)
    gongsi = [g for g in gongsi if '银行' not in g]
    dic['文件名'] = name.replace(".pdf", "_") + str(m + 1)
    dic['发票代码'] = re.findall(r'\d{12}', text)[0]
    dic['发票号码'] = re.findall(r'\d{8}', text)[1]
    da = re.findall(r'[\d ]+年[\d ]+月[\d ]+日', text)[0]
    dic['开票日期'] = re.sub(r'年|月|日| ', '', da)
    da = re.findall(r'[\d ]{20,30}', text)[0]
    dic['校验码'] = da.replace(' ', '')
    try:
        dic['税率'] = re.findall(r'免税|不征税|1{0,1}[1369]%', text)[-1]
    except:
        dic['税率'] = ''
    dic['价税合计(小写)'] = re.findall(r'[¥|¥]{0,1}\d+\.\d+', text)[-1]
    dic['购买方名称'] = gongsi[0]
    dic['销售方名称'] = gongsi[-1]
    da = re.findall(r'(?<=公司 )[\w\W]{0,}?纳税人识别号', text)
    if len(da)>1:
        dic['备注'] = re.sub(r'\n销 备 |\n纳税人识别号', '', da[-1])
    else:
        dic['备注'] = ''
    return dic

if __name__=="__main__":
    root = Tk()
    root.withdraw()
    ####rootDir = str(Path(sys.argv[0]).parent)
    rootDir =filedialog.askdirectory()#指定存储电子发票的文件夹
    filelist = get_filelist(rootDir, [])#遍历文件夹里的全部文件
    paths, names = get_files(filelist, ['pdf'])#判断PDF文件,返回PDF文件的路径和文件名
    data=[]
    for n in range(len(paths)):
        pdf = pb.open(paths[n])#打开PDF文件
        m = 0
        for page in pdf.pages:#遍历PDF文件的每一页
            if '开票人' in page.extract_text():#通过判断是否包含“开票人”,判断是否为电子发票(有的发票跟着行程或税务清单需排除掉)
                dic=get_dic(page,names[n],m)#获取电子发票的关键信息
                data += [dic]
            m+=1
        pdf.close()
    #保存到Excel
    wb = openpyxl.Workbook()
    ws = wb.active
    ws.append(list(dic.keys()))
    for d in data:
        ws.append(list(d.values()))
    wb.save(rootDir+"\\已识别发票信息.xlsx")
发表于 2022-6-15 17:10 | 显示全部楼层
最关心的是OCR识别部分,请问这部分用的是什么?
发表于 2022-6-20 11:46 | 显示全部楼层
有完整的源代码学习吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-5 12:18 , Processed in 0.439799 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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