Python 读取电子发票PDF 转成Excel

Python 读取电子发票PDF 转成Excel

目录

0.前提

1.python相关的处理PDF的库

2.实际好用的

3.实际代码        

4.思考


0.前提

        只识别普通电子发票PDF,提取其中某些关键内容到excel中。

1.python相关的处理PDF的库

        如下4个库是经常更新维护的!

        pyPDF/pyPDF2、pdfplumber、PyMuPDF、Camelot等4个库。

2.实际好用的

        个人推荐pdfplumber,它有extract_tables函数

3.实际代码        

import pdfplumber
import re
import os
import pandas as pd
'''
    处理 普通发票电子PDF 提取关键字段内容信息写入excel中
    其它类的发票 自己参考对应规律  更改代码即可
    参考:pdfplumber官网、以及:https://blog.csdn.net/Burannnn/article/details/129393295
'''
def re_text(bt, text):
    # re 搜索正则匹配 包含re.compile包含的文字内容
    m1 = re.search(bt, text)
    if m1 is not None:
        return re_block(m1[0])
    return None

def re_block(text):
    # 去掉空格、中英文小括号、中文冒号变英文冒号;去掉中文全角空格
    return text.replace(' ', '').replace(' ', '').replace(')', '').replace(')', '').replace(':', ':')

def get_pdf(dir_path):
    pdf_file = []
    for root, sub_dirs, file_names in os.walk(dir_path):
        for name in file_names:
            if name.endswith('.pdf'):
                filepath = os.path.join(root, name)
                pdf_file.append(filepath)
    return pdf_file

def read(xlsx_path, pdf_root):
    # 构建excel writer 写入器
    writer = pd.ExcelWriter(xlsx_path)
    # 如果字段不通用 则需要单独拎出来判断,这里我全部拎出来做了if判断
    all_fields = {
        "开票日期": [],
        "名称": [],
        "纳税人识别号": [],
        "价税合计(小写)": [],
        "货物或应税劳务、服务名称": [],
        "规格型号": [],
        "单位": [],
        "数量": [],
        "单价": [],
        "金额": [],
        "税率": [],
        "税额": [],
    }

    filenames = get_pdf(pdf_root)
    for filename in filenames:
        print(f"正在读取:{filename}")
        with pdfplumber.open(filename) as pdf:
            first_page = pdf.pages[0]
            pdf_text = first_page.extract_text()
            # print(pdf_text)
            
            kaipiao = re_text(re.compile(r'开票日期(.*)'), pdf_text)
            if kaipiao:
                all_fields["开票日期"].append(kaipiao.replace("开票日期:", ""))
            mingcheng = re_text(re.compile(r'名\s*称\s*[::]\s*([\u4e00-\u9fa5]+)'), pdf_text)
            if mingcheng:
                all_fields["名称"].append(mingcheng.replace("名称:", ""))
            # nashuiren = re_text(re.compile(r'纳税人识别号\s*[::]\s*([a-zA-Z0-9]+)'), pdf_text)
            # if nashuiren:
            #     all_fields["纳税人识别号"].append(nashuiren.replace("纳税人识别号:", ""))
            jine = re_text(re.compile(r'小写.*(.*[0-9.]+)'), pdf_text)
            if jine:
                all_fields["价税合计(小写)"].append(jine.replace("小写¥", ""))
            table = first_page.extract_tables()[0]
            
            # 纳税人识别号 购买方
            for t in table[0]:
                t_ = str(t).replace(" ", "")
                nashuiren = re_text(re.compile(r'纳税人识别号\s*[::]\s*([a-zA-Z0-9]+)'), t_)
                if nashuiren:
                    all_fields["纳税人识别号"].append(nashuiren.replace("纳税人识别号:", ""))
            
            # 这里根据pdfplumber提取table来依次输出,查看规律(适合普通发票,其它发票打印输出看规律即可)
            for t in table[1]:
                if not t:
                    continue
                t_ = str(t).replace(" ", "") # 去掉空格
                
                ts = t_.split("\n")
                if "货物或应税劳务、服务名称" in t_:
                    if len(ts) > 1:
                        all_fields["货物或应税劳务、服务名称"].append(ts[1])
                    else:
                        all_fields["货物或应税劳务、服务名称"].append("")
                if "规格型号" in t_:
                    if len(ts) > 1:
                        all_fields["规格型号"].append(ts[1])
                    else:
                        all_fields["规格型号"].append("")
                if "单位" in t_:
                    if len(ts) > 1:
                        all_fields["单位"].append(ts[1])
                    else:
                        all_fields["单位"].append("")
                if "数量" in t_:
                    if len(ts) > 1:
                        all_fields["数量"].append(ts[1])
                    else:
                        all_fields["数量"].append("")
                if "单价" in t_:
                    if len(ts) > 1:
                        all_fields["单价"].append(ts[1])
                    else:
                        all_fields["单价"].append("")
                if "税率" in t_:
                    if len(ts) > 1:
                        all_fields["税率"].append(ts[1])
                    else:
                        all_fields["税率"].append("")
                if "金额" in t_:
                    if len(ts) > 1:
                        all_fields["金额"].append(ts[1])
                    else:
                        all_fields["金额"].append("")
                if "税额" in t_:
                    if len(ts) > 1:
                        all_fields["税额"].append(ts[1])
                    else:
                        all_fields["税额"].append("")

            # print('--------------------------------------------------------')
            # print(re_text(re.compile(r'[\u4e00-\u9fa5]+电子普通发票.*?'), pdf_text))
            
            # # print(re_text(re.compile(r'发票代码(.*\d+)'), pdf_text))
            # print(re_text(re.compile(r'发票号码(.*\d+)'), pdf_text))
            # print(re_text(re.compile(r'开票日期(.*)'), pdf_text))
            # print(re_text(re.compile(r'名\s*称\s*[::]\s*([\u4e00-\u9fa5]+)'), pdf_text))
            # print(re_text(re.compile(r'纳税人识别号\s*[::]\s*([a-zA-Z0-9]+)'), pdf_text))
            # price = re_text(re.compile(r'小写.*(.*[0-9.]+)'), pdf_text)
            # print(price)
            # company = re.findall(re.compile(r'名.*称\s*[::]\s*([\u4e00-\u9fa5]+)'), pdf_text)
            # if company:
            #     print(re_block(company[len(company)-1]))
            # print('--------------------------------------------------------')
    print(all_fields)
    df = pd.DataFrame(all_fields)
    df.to_excel(writer)
    writer.save()

    return

pdf_root = r"G:\PDF"
xlsx_path = r"G:\PDF\all_fields.xlsx"

read(xlsx_path, pdf_root)

4.思考

        对于专用发票,找到对应的规律即可。这里最好用的是extract_tables函数,打印出来,找规律即可!

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 可以使用Python中的pdfplumber和pandas库来读取PDF并将其转换为Excel。以下是示例代码: ``` import pdfplumber import pandas as pd # 读取PDF文件 with pdfplumber.open('example.pdf') as pdf: # 获取PDF中的所有页 pages = pdf.pages # 创建一个空的DataFrame来存储提取的表格数据 df = pd.DataFrame() # 循环遍历每一页并提取表格数据 for page in pages: # 获取该页中的所有表格 tables = page.extract_tables() # 循环遍历每个表格 for table in tables: # 将表格数据转换为DataFrame table_df = pd.DataFrame(table[1:], columns=table[0]) # 将每个表格的DataFrame添加到总的DataFrame中 df = pd.concat([df, table_df]) # 将DataFrame转换为Excel文件并保存 df.to_excel('example.xlsx', index=False) ``` 这段代码将读取名为"example.pdf"的PDF文件中的所有表格,并将其存储到名为"example.xlsx"的Excel文件中。 ### 回答2: Python读取PDF并将其转换为Excel的代码可以使用第三方库来实现。以下是一个例子使用PyPDF2和openpyxl库完这个任务: ```python import PyPDF2 from openpyxl import Workbook # 打开PDF文件 pdf_file = open('example.pdf', 'rb') # 创建一个PDF阅读器对象 pdf_reader = PyPDF2.PdfReader(pdf_file) # 创建一个Excel工作簿对象 excel_file = Workbook() sheet = excel_file.active # 遍历PDF的每一页并将内容存储到Excel工作表中 for page in pdf_reader.pages: # 获取当前页的文本内容 page_text = page.extract_text() # 拆分文本内容为行 lines = page_text.split('\n') # 将每一行内容写入Excel的单元格中 for row_num, line in enumerate(lines, start=1): sheet.cell(row=row_num, column=1).value = line # 保存Excel文件 excel_file.save('converted_excel.xlsx') # 关闭PDFExcel文件 pdf_file.close() excel_file.close() ``` 请注意,这只是一个基本示例,具体的代码可能需要根据PDF的结构和需要转换的内容进行适当的修改。另外,你需要安装PyPDF2和openpyxl库,可以使用pip命令进行安装: ``` pip install PyPDF2 openpyxl ``` ### 回答3: 要使用PythonPDF文件转换Excel,需要安装一些必要的库和工具。首先,我们可以使用`pdfminer.six`库来解析PDF文件,然后使用`openpyxl`库来创建和操作Excel文件。 首先,我们需要安装`pdfminer. six`和`openpyxl`库。你可以使用以下命令来安装它们: ``` pip install pdfminer.six pip install openpyxl ``` 接下来,你可以使用以下代码实现PDF转换Excel的功能: ```python import openpyxl from pdfminer.converter import TextConverter from pdfminer.layout import LAParams from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.pdfpage import PDFPage from io import BytesIO def pdf_to_excel(input_pdf_path, output_excel_path): # 创建一个Excel工作簿 workbook = openpyxl.Workbook() sheet = workbook.active # 创建一个PDF资源管理器 resource_manager = PDFResourceManager() output = BytesIO() # 创建一个PDF设备对象 converter = TextConverter(resource_manager, output, laparams=LAParams()) # 创建一个PDF解释器对象 interpreter = PDFPageInterpreter(resource_manager, converter) # 打开PDF文件并进行解析 with open(input_pdf_path, 'rb') as file: for page in PDFPage.get_pages(file): interpreter.process_page(page) converter.close() # 获取解析的文本内容 text = output.getvalue().decode() # 按行分割文本内容,并将每行内容写入Excel文件的单元格中 lines = text.split('\n') for i, line in enumerate(lines): cells = line.split('\t') for j, cell in enumerate(cells): sheet.cell(row=i+1, column=j+1, value=cell.strip()) # 保存Excel文件 workbook.save(output_excel_path) # 使用示例 pdf_to_excel('input.pdf', 'output.xlsx') ``` 以上代码会读取名为`input.pdf`的PDF文件,并将其转换`output.xlsx`的Excel文件。你可以根据自己的需求进行文件路径的修改。这样,你就可以使用Python读取PDF并将其转换Excel文件了。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值