python 读取pdf并提取发票信息

(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)} 张发票的信息.")

你可能感兴趣的:(python 读取pdf并提取发票信息)