PDF 是办公场景中最常见的文档格式之一。无论是发票、报告、电子合同还是扫描件,我们经常需要对 PDF 进行 读取、提取文本、拆分、合并 等操作。 幸运的是,Python 提供了多种优秀的库来完成这些任务,其中
pdfplumber和PyPDF2是最常用的两种。
本文将带你掌握它们的使用方法与实战技巧。
一、两大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
下面的例子演示如何结合 pdfplumber 与 pandas,提取多个 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 处理需求。