(1)读取pdf文件并提取信息
参考博客:https://www.jianshu.com/p/65eae86116c9
读取pdf文件,使用到pdfplumber库。读取出的文本内容使用正则匹配来获取信息。使用之前需要使用pip命令安装该库。
pip install pdfplumber
(1) 关于PDF文件的读取:
- pdfplumber.open():打开pdf文件
- pdf.pages[0]:查看第一页的内容
- first_page.extract_text():读取文本信息
(2)正则匹配信息
如果对于正则匹配不了解,可以参考我的另一篇笔记:https://www.jianshu.com/p/584dd02bd621
- 在线测试工具:
【1】:https://c.runoob.com/front-end/854/ - 匹配规则:
【1】:https://www.runoob.com/regexp/regexp-rule.html
【2】:https://www.w3cschool.cn/zhengzebiaodashi/regexp-syntax.html
这里对PDF文件信息的提取使用的是正则匹配,会用到re
库。
关于re库里的函数可以参考:https://blog.csdn.net/qq_39962271/article/details/123884585
(3)关于表格信息
对于表格里面的信息可以使用extract_table
提取.并且将其转化为pandas的datafram结构,方便操作。
import pdfplumber
import re
import os
import pandas
import pandas
# 简单写法
def get_pdf(dir_path):
pdf_file = []
for root, sub_dirs, file_names in os.walk(dir_path): # 返回值:(dirpath, dirnames, filenames)
for name in file_names:
if name.endswith('.pdf'):
filepath = os.path.join(root, name)
pdf_file.append(filepath)
return pdf_file
def read(pdf_dir):
pdfs = []
filenames = get_pdf(pdf_dir) # 修改为自己的文件目录
for filename in filenames:
pdf_f = {}
with pdfplumber.open(filename) as pdf:
first_page = pdf.pages[0]
pdf_text = first_page.extract_text() # 提取文本信息
pdf_table = first_page.extract_table() # 提取表格信息
pdf_table = pandas.DataFrame(pdf_table)
pdf_text = pdf_text.replace(' ', '').replace(' ', '').replace(')', '').replace(')', '').replace(':', ':')
# 正则匹配
pdf_f["t1"] = re.search(r'[\u4e00-\u9fa5]+电子普通发票.*?',pdf_text).group()
t2 = re.match(r'[\u4e00-\u9fa5]+专用发票.*?', pdf_text)
if t2:
pdf_f["t2"] = t2.group()
pdf_f["pro_name"] = pdf_table.loc[1][0].replace("\n","").replace("合 计","")[4:] # 项目名称
pdf_f["code"] = re.findall(r'发票代码:(.*\d+)', pdf_text)[0] # 发票代码
pdf_f["num"] = re.findall(r'发票号码:(.*\d+)', pdf_text)[0] # 发票号码
pdf_f["date"] = re.findall(r'开票日期:(.*)', pdf_text)[0] # 开票日期
pdf_f["year"] = re.findall(r"([0-9]+\.?[0-9]+)",pdf_f["date"])[0]
pdf_f["month"] = re.findall(r"([0-9]+\.?[0-9]+)",pdf_f["date"])[1]
pdf_f["day"] = re.findall(r"([0-9]+\.?[0-9]+)",pdf_f["date"])[2]
pdf_f["client_name"] = re.findall(r'名\s*称\s*[:]\s*([\u4e00-\u9fa5]+)', pdf_text)[0] # 购买方名称
pdf_f["client_itin"] = re.findall(r'纳税人识别号\s*[:]\s*([a-zA-Z0-9]+)', pdf_text)[0] # 购买方税号
pdf_f["seller_name"] = re.findall(re.compile(r'名.*称\s*[:]\s*([\u4e00-\u9fa5]+)'), pdf_text)[-1] # 销售方名称
pdf_f["seller_itin"] = re.findall(r'纳税人识别号\s*[:]\s*([a-zA-Z0-9]+)', pdf_text)[-1] # 购买方税号
pdf_f["car_num"] = pdf_table.loc[1][2].replace("车牌号\n","")
pdf_f["car_type"] = pdf_table.loc[1][3].replace("类型\n","")
pdf_f["total_price"] = re.findall(r"([0-9]+\.?[0-9]+)",pdf_table.loc[2][2])[0]
pdf_f["price"] = re.findall(r"([0-9]+\.?[0-9]+)",pdf_table.loc[1][8])[0]
pdf_f["tax_rate"] = pdf_table.loc[1][9].replace("税率\n","")
pdf_f["tax_price"] = re.findall(r"([0-9]+\.?[0-9]+)",pdf_table.loc[1][10])[0]
pdf_f["dir"] = filename
pdf_f["path"] = pdf_dir
pdf_f["file"] = filename.replace(pdf_dir,"")
pdfs.append(pdf_f)
return pdfs
base_path = '../发票样例/'
dirs = [base_path + file + '/invoice/' for file in os.listdir(base_path) if os.path.isdir(base_path+file)]
pdfs = []
for dir in dirs:
pdfs.extend(read(dir))
print(f"共提取 {len(pdfs)} 张发票的信息.")
网友评论