python提取pdf表格到excel:拆分、提取、合并

本文介绍使用python提取pdf中的表格到excel中,包含pdf的拆分、pdf提取到excel、合并excel。

一、拆分pdf

将一个大的pdf按页数拆分为多个小的pdf:

# pip install PyPDF2

import os, pdfplumber, PyPDF2

# 分割pdf
def split_pdf(input_pdf_path, num_splits):
    # Create a PDF reader object
    pdf_reader = PyPDF2.PdfReader(open(input_pdf_path, 'rb'))
    total_pages = len(pdf_reader.pages)
 
    # Calculate the number of pages per split
    pages_per_split = total_pages // num_splits
 
    # Get the directory and base name of the input PDF
    base_dir = os.path.dirname(input_pdf_path)
    base_name = os.path.splitext(os.path.basename(input_pdf_path))[0]
 
    for i in range(num_splits):
        pdf_writer = PyPDF2.PdfWriter()
        start_page = i * pages_per_split
        end_page = start_page + pages_per_split
        if i == num_splits - 1:  # Make sure to include remaining pages in the last split
            end_page = total_pages
 
        for page in range(start_page, end_page):
            pdf_writer.add_page(pdf_reader.pages[page])
 
        output_pdf_path = os.path.join(base_dir, f"{base_name}_part_{i}.pdf")
        with open(output_pdf_path, 'wb') as output_pdf:
            pdf_writer.write(output_pdf)
 
    print(f"PDF split into {num_splits} parts successfully.")

二、提取pdf中的表格到excel中

将pdf表格提取到excel表格中:

# pip install pdfplumber
# pip install openpyxl
 
import os, pdfplumber
from openpyxl import Workbook, load_workbook

# pdf转为xlsx
def analysis_table(pdf_file_name):
    # 打开表格
    workbook = Workbook()
    sheet = workbook.active
 
    num = 0

    # 打开pdf
    with pdfplumber.open(pdf_file_name + '.pdf') as pdf:
        # 遍历每页pdf 
        for page in pdf.pages:
            # 提取表格信息
            tables = page.extract_tables()
            
            # 遍历提取到的所有表格
            for table in tables:
                # 格式化表格数据
                for row in table:
                    sheet.append(row)

            num = num + 1
            print("process page: %d"%(num))

        workbook.save(filename=(pdf_file_name + ".xlsx"))

三、合并多个excel表格到一个excel中

# pip install pdfplumber
# pip install openpyxl
 
import os, pdfplumber
from openpyxl import Workbook, load_workbook

# 合并excel文件
def merge_excels(files, output_name):
    # 加载第一个Excel文件
    wb1 = load_workbook(files[0] + '.xlsx')
    sheet1 = wb1.active

    file_list = files[1::1]
    for file in file_list:
        # 加载第二个Excel文件
        wb2 = load_workbook(file + '.xlsx')
        sheet2 = wb2.active
        
        # 合并两个工作表的数据
        for row in sheet2.iter_rows(values_only=True):
            sheet1.append(row)
     
    # 保存合并后的Excel文件
    wb1.save(output_name + '.xlsx')

四、完整代码

完整代码在:使用python实现pdf表格转为excel表格

<think>好的,用户想用Python读取PDF中的表格数据并进行编辑。首先,我需要回忆一下常用的库。根据之前的知识,PyPDF2、pdfminer.six、tabula-py、pandas这些都可能相关。 用户提到的PyPDF2,我记得它主要用于基本操作,比如合并拆分,但提取复杂表格可能不够。示例中的引用[1]提到PyPDF2提取文本,但表格可能需要更高级的处理。这时候可能需要tabula-py,因为它专门处理表格,特别是基于Java的Tabula,能识别表格结构。引用[2]中的示例代码使用tabula读取PDF到DataFrame,然后转为CSV,这应该适用。 另外,pdfplumber也是一个选项,引用[4]指出它适合结构化数据和复杂表格。可能需要比较tabula-py和pdfplumber的优缺点。比如,pdfplumber不需要Java环境,而tabula-py依赖Java,但可能在表格识别上更准确。 用户还提到数据修改,这可能需要pandas处理DataFrame,修改后再导出。然后如何保存回PDF?这里可能需要ReportLab或PyMuPDF来生成新的PDF,但编辑现有PDF表格比较困难,通常的做法是提取数据,修改后生成新PDF。 需要注意的问题包括表格识别的准确性,特别是合并单元格或复杂布局。此外,处理加密或扫描的PDF可能需要OCR,但用户的问题里没提到,暂时忽略。 步骤应该是:1. 使用tabula或pdfplumber提取表格为DataFrame;2. 用pandas修改数据;3. 用库如ReportLab重新生成PDF。但用户可能不知道保存回PDF的复杂性,需要说明。 检查引用内容,引用[4]提到pdfplumber适合复杂表格,所以可能需要优先推荐。同时引用[3]的pdfminer.six可能用于文本提取,但表格处理可能不如前两者。 综上,回答应该分步骤:提取(用tabula-py或pdfplumber)、处理(pandas)、输出(如生成CSV或新PDF)。同时要提到不同库的适用场景,比如简单表格用tabula,复杂用pdfplumber。编辑后的保存可能需要生成新PDF,而直接修改原PDF困难,建议导出为其他格式。</think>以下是Python读取和编辑PDF表格数据的解决方案: ### 一、PDF表格提取技术路线 1. **简单表格推荐使用tabula-py**: - 基于Java的Tabula实现,能识别表格结构 - 输出为pandas DataFrame方便后续处理 ```python import tabula # 读取PDF中的表格(自动识别) dfs = tabula.read_pdf("input.pdf", pages="all", multiple_tables=True) # 查看第一个表格 print(dfs[0].head()) ``` 2. **复杂表格使用pdfplumber**: - 支持精准定位表格边界和合并单元格识别[^4] ```python import pdfplumber with pdfplumber.open("input.pdf") as pdf: page = pdf.pages[0] table = page.extract_table() df = pd.DataFrame(table[1:], columns=table[0]) ``` ### 二、数据修改处理流程 ```python import pandas as pd # 示例:修改表格数据 df = dfs[0] # 获取第一个表格 df["新列"] = df["原列"] * 2 # 新增计算列 df.loc[df["金额"] > 1000, "状态"] = "超标" # 条件修改 # 数据清洗 df = df.dropna() # 删除空值行 df = df.astype({"数量": "int32"}) # 类型转换 ``` ### 三、数据输出方案 | 输出格式 | 推荐方法 | 特点 | |---------|---------|------| | CSV | `df.to_csv()` | 通用数据交换格式 | | Excel | `df.to_excel()` | 保留格式和公式 | | PDF | 使用ReportLab重新生成 | 需要定义完整排版模板 | ### 四、常见问题解决方案 1. **表格识别错位**: - 调整`lattice=True`参数强制使用格线检测 - 指定表格区域:`area=[top, left, bottom, right]` 2. **多页表格拼接**: ```python from tabula import read_pdf dfs = read_pdf("input.pdf", pages="1-3", stream=True) full_table = pd.concat(dfs) ``` 3. **中文乱码处理**: ```python tabula.read_pdf(..., encoding='gbk') # 指定编码 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值