做财务的小伙伴都知道,像动辄复制几百张发票的发票号等信息这种事遇到不肯给冲会员的抠笔老板多蛋疼,下面我们就用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")