Python把PDF表格完整转换成Excel的小白教程

 更新时间:2026年04月26日 15:50:43   作者:CoderJoon  
本文通过一个完整的Python示例,详细介绍了如何将多页PDF表格转换为Excel文件,文中包括整体思路、核心代码解析、示例PDF模板及预期处理结果等内容,旨在帮助用户理解和掌握PDF表格处理技巧,需要的朋友可以参考下

很多同学第一次接触 PDF 数据处理时,都会遇到一个问题:

PDF 里的表格能看,不能算,不能统计。

比如:

  • 招聘成绩公示
  • 学校成绩单
  • 名单汇总表

本文将通过一个完整可运行的 Python 示例,一步一步教你:

如何把一个多页 PDF 表格,稳定地转换成 Excel 文件

一、整体思路先说明(很重要)

在正式写代码前,你一定要明白一件事:

PDF ≠ Excel

  • Excel:天然是“行 + 列”
  • PDF:只是“排好版的页面”

所以我们要做的是:

1. 从 PDF 中提取“表格结构”
2. 把每一行数据收集起来
3. 修复列数不一致的问题
4. 再导出为 Excel

二、完整代码(先给结论)

下面是完整、可直接运行的代码,后面我会逐步拆解讲解。

import pdfplumber
import pandas as pd
import os
def pdf_to_excel(pdf_path, excel_path):
    all_rows = []
    # 打开 PDF
    with pdfplumber.open(pdf_path) as pdf:
        print(f"PDF共有 {len(pdf.pages)} 页")
        # 遍历每一页
        for page_num, page in enumerate(pdf.pages, start=1):
            print(f"正在处理第 {page_num} 页...")
            tables = page.extract_tables()
            if not tables:
                continue
            for table in tables:
                for row in table:
                    # 跳过全空行
                    if row and any(cell and cell.strip() for cell in row if isinstance(cell, str)):
                        all_rows.append(row)
    if not all_rows:
        print(" 未提取到任何表格数据")
        return
    # 计算最大列数
    max_cols = max(len(row) for row in all_rows)
    print(f"检测到最大列数:{max_cols}")
    # 统一所有行的列数
    normalized_rows = []
    for row in all_rows:
        if len(row) < max_cols:
            row = row + [None] * (max_cols - len(row))
        elif len(row) > max_cols:
            row = row[:max_cols]
        normalized_rows.append(row)
    # 第一行作为表头
    header = normalized_rows[0]
    data = normalized_rows[1:]
    # 去除重复表头行
    clean_data = []
    for row in data:
        if row != header:
            clean_data.append(row)
    # 构建 DataFrame
    df = pd.DataFrame(clean_data, columns=header)
    # 清理空行、空列
    df = df.dropna(how='all').dropna(axis=1, how='all')
    # 导出 Excel
    df.to_excel(excel_path, index=False, engine='openpyxl')
    print("\n 转换完成")
    print(f"Excel 文件路径:{excel_path}")
    print(f"数据行数:{len(df)}")
    print(f"列数:{len(df.columns)}")
    print("列名:", list(df.columns))
    print("\n前 5 行数据预览:")
    print(df.head())
if __name__ == "__main__":
    pdf_file = "Example.pdf"
    excel_file = "Result.xlsx"
    if not os.path.exists(pdf_file):
        print(f"找不到 PDF 文件:{pdf_file}")
    else:
        pdf_to_excel(pdf_file, excel_file)

三、逐步解析代码(小白重点)

1、导入库

import pdfplumber
import pandas as pd
import os

作用说明:

作用
pdfplumber读取 PDF、提取表格
pandas处理表格数据
os判断文件是否存在

2、定义核心函数

def pdf_to_excel(pdf_path, excel_path):

这个函数只做一件事:

把一个 PDF 表格文件,转换成 Excel

3、收集所有表格行

all_rows = []

为什么要这样做?

因为 PDF 是一页一页的
但 Excel 是一个整体表格

4、打开 PDF 并逐页处理

with pdfplumber.open(pdf_path) as pdf:
  • pdf.pages:PDF 的每一页
  • extract_tables():提取当前页中的表格

5、跳过空行(非常关键)

if row and any(cell and cell.strip() for cell in row if isinstance(cell, str)):

作用:

  • 防止空行进入 Excel
  • 防止生成一堆没用的数据

6、为什么要“统一列数”(核心思想)

max_cols = max(len(row) for row in all_rows)

现实中的 PDF 表格:

  • 有的页 8 列
  • 有的页 9 列
  • 有的页 10 列

如果不统一,pandas 会直接报错

所以我们要:

不足的补 None,多的截断

7、第一行作为表头

header = normalized_rows[0]

PDF 表格通常每一页都有表头,
我们只保留第一行作为最终列名。

8、去掉重复表头行

if row != header:
    clean_data.append(row)

否则 Excel 会变成:

职位代码 | 职位名称 | ...
职位代码 | 职位名称 | ...
职位代码 | 职位名称 | ...

9、导出 Excel

df.to_excel(excel_path, index=False, engine='openpyxl')

这一步就是真正生成 Excel 文件。

四、示例 PDF 模板(示意)

假设你的 PDF 表格内容长这样(每一页类似):

职位代码职位名称准考证号考场号座位号成绩
00001A001A000102012178.25
00001A001A000101011182.50

五、预期 Excel 处理结果

最终生成的 Excel 表格应为:

职位代码职位名称准考证号考场号座位号成绩
00001A001A000102012178.25
00001A001A000101011182.50

一人一行,可直接统计、排序、筛选

六、这个程序能做什么 / 不能做什么

能处理

  • 多页 PDF 表格
  • 列数不一致
  • 招聘、公示、成绩类 PDF

不能处理

  • 扫描版 PDF(图片)
  • 完全靠空格排版的“假表格”

七、总结一句话

PDF → Excel 的难点不在“读取”,而在“结构修复”。

这份代码已经解决了:

  • 多页
  • 表头重复
  • 列数不一致

以上就是Python把PDF表格完整转换成Excel的小白教程的详细内容,更多关于Python PDF表格转成Excel的资料请关注脚本之家其它相关文章!

相关文章

  • python 实现交换两个列表元素的位置示例

    python 实现交换两个列表元素的位置示例

    今天小编就为大家分享一篇python 实现交换两个列表元素的位置示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • 使用Python绘制动态爱心并表白的代码详解

    使用Python绘制动态爱心并表白的代码详解

    在这个充满浪漫的季节,如何用代码表达你的爱意呢?今天我们将使用 Python 的 matplotlib 和 numpy 库绘制一个动态的爱心,并且在爱心上添加表白的文字,这将是一个独特而浪漫的方式来表达你的心声,感兴趣的小伙伴跟着小编来看看吧
    2025-04-04
  • python事件驱动event实现详解

    python事件驱动event实现详解

    这篇文章主要为大家详细介绍了python事件驱动event实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • LangChain简化ChatGPT工程复杂度使用详解

    LangChain简化ChatGPT工程复杂度使用详解

    这篇文章主要为大家介绍了LangChain简化ChatGPT工程复杂度使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • numpy 对矩阵中Nan的处理:采用平均值的方法

    numpy 对矩阵中Nan的处理:采用平均值的方法

    今天小编就为大家分享一篇numpy 对矩阵中Nan的处理:采用平均值的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • python中b=a和b=a[:]区别小结

    python中b=a和b=a[:]区别小结

    Python中b = a和b = a[:]有显著区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-03-03
  • Python中函数参数匹配模型详解

    Python中函数参数匹配模型详解

    这篇文章主要介绍了Python函数参数匹配模型,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-06-06
  • Python利用字典和列表实现学生信息管理系统

    Python利用字典和列表实现学生信息管理系统

    这篇文章主要为大家详细介绍了Python如何利用字典和列表实现一个简易的学生信息管理系统,文中详细注释,方便理解,需要的可以参考一下
    2022-06-06
  • Mac PyCharm中的.gitignore 安装设置教程

    Mac PyCharm中的.gitignore 安装设置教程

    这篇文章主要介绍了Mac PyCharm中的.gitignore 安装设置教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • 基于PyQt5完成的PDF拆分功能

    基于PyQt5完成的PDF拆分功能

    这篇文章主要介绍了基于PyQt5完成的PDF拆分功能,本文介绍的pdf拆分功能还有一些待完善地方,例如可增加预览功能,实现每页预览,以及如何实现多条件拆分,需要的朋友可以参考下
    2022-06-06

最新评论