Python编程实战 - Python实用工具与库 - 操作PDF:pdfplumber、PyPDF2

PDF 是办公场景中最常见的文档格式之一。无论是发票、报告、电子合同还是扫描件,我们经常需要对 PDF 进行 读取、提取文本、拆分、合并 等操作。 幸运的是,Python 提供了多种优秀的库来完成这些任务,其中 pdfplumberPyPDF2 是最常用的两种。

本文将带你掌握它们的使用方法与实战技巧。


一、两大PDF库的区别

功能 pdfplumber PyPDF2
提取文本 ✅ 支持文字与表格结构 ✅ 支持,但格式较乱
提取表格 ✅ 强大,结构清晰 ❌ 不支持
拆分/合并PDF ❌ 不支持 ✅ 支持
加密/解密 ✅ 支持
生成新PDF ✅ 可简单生成
适合场景 数据提取、内容分析 文件操作、批处理管理

在实战中,通常两者 配合使用

  • pdfplumber 提取文本或表格内容;
  • PyPDF2 拆分、合并或修改 PDF 文件结构。

二、pdfplumber:精准提取PDF文本与表格

1. 安装

bash 复制代码
pip install pdfplumber

2. 提取全部文本

python 复制代码
import pdfplumber

with pdfplumber.open("example.pdf") as pdf:
    all_text = ""
    for page in pdf.pages:
        all_text += page.extract_text() + "\n"
print(all_text)

输出示例:

复制代码
Python 实战报告
作者:张三
日期:2025-11-10
内容:这是一个示例PDF文件。

pdfplumber 能准确识别文字位置,输出比 PyPDF2 更整齐。


3. 提取单页文本

python 复制代码
with pdfplumber.open("example.pdf") as pdf:
    page = pdf.pages[0]
    text = page.extract_text()
    print(text)

可以用 page.extract_words() 获取每个单词的位置信息,非常适合文字坐标分析。


4. 提取表格内容

pdfplumber 对表格提取特别强大,它能直接将表格结构转为 Python 列表。

python 复制代码
import pdfplumber
import pandas as pd

with pdfplumber.open("report.pdf") as pdf:
    page = pdf.pages[1]
    table = page.extract_table()
    df = pd.DataFrame(table[1:], columns=table[0])  # 第一行为表头
    print(df)

输出结果:

markdown 复制代码
     姓名   部门   分数
0   张三   销售部   90
1   李四   技术部   85
2   王五   市场部   88

5. 提取图片

python 复制代码
with pdfplumber.open("example.pdf") as pdf:
    page = pdf.pages[0]
    for img in page.images:
        print(img)

可结合 Pillow 等库进一步保存图片。


三、PyPDF2:拆分、合并与加密PDF

1. 安装

bash 复制代码
pip install PyPDF2

2. 读取PDF信息

python 复制代码
from PyPDF2 import PdfReader

reader = PdfReader("example.pdf")
print("总页数:", len(reader.pages))
print("标题:", reader.metadata.title)

3. 拆分PDF文件

python 复制代码
from PyPDF2 import PdfReader, PdfWriter

reader = PdfReader("report.pdf")

for i, page in enumerate(reader.pages):
    writer = PdfWriter()
    writer.add_page(page)
    output_name = f"page_{i+1}.pdf"
    with open(output_name, "wb") as f:
        writer.write(f)
    print(f"已生成: {output_name}")

每页会被拆分为独立的 PDF 文件。


4. 合并多个PDF

python 复制代码
from PyPDF2 import PdfMerger

merger = PdfMerger()
files = ["page_1.pdf", "page_2.pdf", "page_3.pdf"]

for f in files:
    merger.append(f)

merger.write("merged.pdf")
merger.close()
print("合并完成:merged.pdf")

5. 加密与解密PDF

加密PDF

python 复制代码
from PyPDF2 import PdfReader, PdfWriter

reader = PdfReader("secret.pdf")
writer = PdfWriter()

for page in reader.pages:
    writer.add_page(page)

writer.encrypt("mypassword")

with open("encrypted.pdf", "wb") as f:
    writer.write(f)

print("PDF已加密。")

解密PDF

python 复制代码
reader = PdfReader("encrypted.pdf")
reader.decrypt("mypassword")

print(reader.pages[0].extract_text())

四、实战案例:批量提取PDF文本并保存到Excel

下面的例子演示如何结合 pdfplumberpandas,提取多个 PDF 文件中的文字内容并保存为 Excel 表格。

python 复制代码
import pdfplumber
import pandas as pd
import os

data = []

for file in os.listdir("pdfs"):
    if file.endswith(".pdf"):
        path = os.path.join("pdfs", file)
        with pdfplumber.open(path) as pdf:
            text = ""
            for page in pdf.pages:
                text += page.extract_text() or ""
        data.append({"文件名": file, "内容": text[:200]})  # 取前200字预览

df = pd.DataFrame(data)
df.to_excel("PDF文本提取结果.xlsx", index=False)
print("已导出 PDF 文本提取结果。")

五、常见问题与技巧

问题 解决方案
提取文本为空 PDF 为扫描件,可使用 OCR 工具(如 pytesseract)识别
表格列对齐不准确 使用 pdfplumber 的 extract_table() 或尝试指定表格边界参数
合并后的PDF打开乱码 确认源文件编码正确,避免跨标准 PDF 版本混用
大量文件处理超时 分批执行、加入延时或使用异步处理

六、总结

通过本文的学习,你掌握了:

  • 使用 pdfplumber 提取 PDF 文本、表格、图片等数据;
  • 使用 PyPDF2 进行 PDF 拆分、合并、加密、解密;
  • 结合 pandas 进行 PDF 批量分析与结果导出。

这两个库搭配使用,能解决大多数企业、数据分析与文档自动化中的 PDF 处理需求。


相关推荐
Python私教2 小时前
什么是爬虫
后端
啾啾啾6662 小时前
连接一个新的服务器时,打开PyCharm时报错:报错内容是服务器磁盘或配额满了
python·pycharm
Python私教2 小时前
Python爬虫怎么学
后端
长不大的蜡笔小新2 小时前
掌握NumPy:ndarray核心特性与创建
开发语言·python·numpy
欧阳码农2 小时前
盘点这两年我接触过的副业赚钱赛道,对于你来说可能是信息差
前端·人工智能·后端
luoganttcc2 小时前
已知 空间 三个 A,B C 点 ,求 顺序 经过 A B C 三点 圆弧 轨迹 ,给出 python 代码 并且 画出图像
c语言·开发语言·python
武子康2 小时前
大数据-151 Apache Druid 集群落地 [上篇] MySQL 元数据 + HDFS 深存与低配调优
大数据·后端·nosql
小何开发3 小时前
Springboot-WebService 服务端发布与客户端调用
java·spring boot·后端
绝无仅有3 小时前
Redis 面试题解析:某度互联网大厂
后端·面试·架构