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 处理需求。


相关推荐
小二·15 分钟前
Spring框架入门:深入理解Spring DI的注入方式
java·后端·spring
毕设源码-钟学长24 分钟前
【开题答辩全过程】以 基于springboot和协同过滤算法的线上点餐系统为例,包含答辩的问题和答案
java·spring boot·后端
计算机毕设小月哥1 小时前
【Hadoop+Spark+python毕设】中风患者数据可视化分析系统、计算机毕业设计、包括数据爬取、Spark、数据分析、数据可视化、Hadoop
后端·python·mysql
Keep_Trying_Go1 小时前
基于Zero-Shot的目标计数算法详解(Open-world Text-specified Object Counting)
人工智能·pytorch·python·算法·多模态·目标统计
q***44151 小时前
Spring Security 新版本配置
java·后端·spring
计算机毕设匠心工作室1 小时前
【python大数据毕设实战】强迫症特征与影响因素数据分析系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习、实战教学
后端·python·mysql
o***74171 小时前
Springboot中SLF4J详解
java·spring boot·后端
雨中散步撒哈拉1 小时前
18、做中学 | 初升高 | 考场一 | 面向过程-家庭收支记账软件
开发语言·后端·golang
韩立学长2 小时前
【开题答辩实录分享】以《智慧物业管理系统的设计与实现》为例进行答辩实录分享
java·后端·mysql