提取电子发票内信息

做财务的小伙伴都知道,像动辄复制几百张发票的发票号等信息这种事遇到不肯给冲会员的抠笔老板多蛋疼,下面我们就用python来减清工作量。这段粗糙的代码能满足三种发票的提取。
#需要导入以下包
import pdfplumber,os
from openpyxl import Workbook
import re

wenjian = Workbook()#创建存放发票信息的文件
D = wenjian.active
title = ["发票号码","开票日期","价税合计","开票人","发票代码"]#先把要提取内容的抬头写入单元格
for h in range(1,6):
    D.cell(1, h, title[h-1])
#下面是三种发票内容提取函数,其他格式我还没遇到
def write_something(B,text):
    D = B.active
    s5 = re.findall('发票代码\s*[::]\s*(\d+)', text, re.DOTALL)
    s1 = re.findall('发票号码\s*[::]\s*(\d+)', text, re.DOTALL)
    s2 = re.findall('开票日期\s*[::]\s*(.*?)\n', text, re.DOTALL)
    s3 = re.findall('价税合计.*?[¥¥]\s*([\d.]+)', text, re.DOTALL)
    s4 = re.findall('价税合计.*?名 称\s*[::]\s*(.*?)\s', text, re.DOTALL)
    D.cell(i, 1, s1[0])
    D.cell(i, 2, s2[0])
    D.cell(i, 3, s3[0])
    D.cell(i, 4, s4[0])
    D.cell(i, 5, s5[0])
def write_anotherthing(B,text):
    D = B.active
    s1 = re.findall('发票号码\s*[::]\s*(\d+)', text, re.DOTALL)
    s2 = re.findall('开票日期\s*[::]\s*(.*?)\n', text, re.DOTALL)
    s3 = re.findall('价税合计.*?[¥¥]\s*([\d.]+)', text, re.DOTALL)
    s4 = re.findall('[销售]\s*名称\s*[::]\s*(.*?)\s', text, re.DOTALL)
    D.cell(i, 1, s1[0])
    D.cell(i, 2, s2[0])
    D.cell(i, 3, s3[0])
    D.cell(i, 4, s4[0])
def write_fuckthing(B,text):
    D = B.active
    s5 = re.findall('票据代码\s*[::]\s*(\d+)', text, re.DOTALL)
    s1 = re.findall('票据号码\s*[::]\s*(\d+)', text, re.DOTALL)
    s2 = re.findall('开票日期\s*[::]\s*([\d-]+)\n', text, re.DOTALL)
    s3 = re.findall('\(小写\)¥\s*([\d.,]+)', text, re.DOTALL)
    D.cell(i, 1, s1[0])
    D.cell(i, 2, s2[0])
    D.cell(i, 3, s3[0])
    D.cell(i, 5, s5[0])
i = 2#从表格第二行开始写入数据
#把需要提取的票PDF放在一个文件夹,下面开始提取文件名
name = '电子发票'#放待提取发票的文件夹名
targetDir = fr"C:\Users\Administrator\Desktop\{name}"#存放待提取发票的完整路径
#下面三行提取所有发票PDF的文件名
files = []
for (dirpath, dirnames, filenames) in os.walk(targetDir):
    files += filenames
#开始读取每张发票内容,并判断属于什么类型发票
for file in files:
    with pdfplumber.open(fr"C:\Users\Administrator\Desktop\{name}\{file}") as pdf:
        print(f"已轮到{file}")
        A = pdf.pages[0]
        text = A.extract_text()
        search_string1 = "发票代码"
        search_string2 = "票据代码"
        if search_string1 in text:
            write_something(wenjian,text)
            print(f"{file}已打印")
        else:
            if search_string2 in text:
                write_fuckthing(wenjian, text)
                print(f"{file}已打印")
            else:
                write_anotherthing(wenjian,text)
                print(f"{file}已打印")
    i = i + 1
#提取好后保存文件
wenjian.save(fr"C:\Users\Administrator\Desktop\{name}.xlsx")

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值