You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过循环使用Tabula批量提取多PDF表格至DataFrame

自动化提取多PDF分散表格的解决方案

核心思路

把每个PDF的可变参数(年份、文件路径、每页表格的页码与区域)整理成结构化配置,通过双层循环批量处理:先遍历每个PDF,再遍历该PDF的所有目标页面,提取表格后逐步合并,最终得到完整数据集。

实现代码

import tabula
import pandas as pd

# 1. 定义所有PDF的配置信息
# 每个字典对应一份PDF,page_configs里的每个元组对应一页的(页码, 表格区域)
pdf_configs = [
    {
        "year": 2010,
        "file_path": r"C:\Users\User\Desktop\ReadPDF\2010.pdf",
        "page_configs": [
            (1, (98.303, 71.0, 724.838, 552.185)),
            (2, (105.953, 71.0, 724.838, 552.185)),
            # 补充该PDF剩余18页的(页码, area)配置
        ]
    },
    {
        "year": 2011,
        "file_path": r"C:\Users\User\Desktop\ReadPDF\2011.pdf",
        "page_configs": [
            # 填写2011年PDF每页的(页码, area)配置
        ]
    },
    # 补充剩余18份PDF的配置
]

# 2. 批量处理所有PDF
all_pdf_dfs = []
for config in pdf_configs:
    page_dfs = []
    for page_num, area in config["page_configs"]:
        # 提取当前页的表格(tabula返回列表,取第一个元素,若有多个表格可调整逻辑)
        extracted = tabula.read_pdf(config["file_path"], lattice=True, pages=page_num, area=area)
        if extracted:  # 避免空列表导致报错
            page_dfs.append(extracted[0])
    # 合并当前PDF的所有页面表格
    if page_dfs:
        pdf_total_df = pd.concat(page_dfs, axis=0, ignore_index=True)
        # 可选:添加年份列便于区分数据来源
        pdf_total_df["year"] = config["year"]
        all_pdf_dfs.append(pdf_total_df)

# 3. 合并所有PDF的最终数据集
if all_pdf_dfs:
    MDF = pd.concat(all_pdf_dfs, axis=0, ignore_index=True)
    # 可选:保存结果到Excel
    MDF.to_excel(r"C:\Users\User\Desktop\ReadPDF\all_years_data.xlsx", index=False)

关键说明

  • 配置结构化:把所有可变参数集中在pdf_configs里,后续修改页码、区域或新增PDF只需更新配置,无需改动核心逻辑。
  • 空值处理:添加if extracted:判断,避免某页未提取到表格时出现空DataFrame报错。
  • 索引重置:concat时加ignore_index=True,避免合并后索引重复混乱。
  • 年份标记:可选添加year列,方便后续数据筛选和溯源。

内容的提问来源于stack exchange,提问作者Bluefan22

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 06:00:17