PyPDF2 是一个纯 Python 的 PDF 处理库,可以读取、分割、合并、转换和提取 PDF 内容。以下是 PyPDF2 的全面指南,包含最新版本(PyPDF2 3.x)的用法。
安装与版本
pip install PyPDF2 --upgrade
注意:PyPDF2 3.0+ 有重大 API 变化,旧代码可能需要调整
核心功能概览
| 功能 | 类/方法 | 说明 |
|---|---|---|
| 读取PDF | PdfReader | 读取PDF内容和元数据 |
| 写入PDF | PdfWriter | 创建或修改PDF文件 |
| 合并PDF | PdfMerger | 合并多个PDF文件 |
| 提取文本 | .extract_text() | 从PDF提取文本内容 |
| 页面操作 | .add_page(), .pages | 添加/获取PDF页面 |
| 加密/解密 | .encrypt(), .decrypt() | PDF加密和解密操作 |
1. 读取PDF文件
from PyPDF2 import PdfReader
reader = PdfReader("example.pdf")
# 获取PDF信息
print(f"页数: {len(reader.pages)}")
print(f"作者: {reader.metadata.author}")
print(f"标题: {reader.metadata.title}")
# 提取第一页文本
first_page = reader.pages[0]
print(first_page.extract_text())
# 提取所有文本
full_text = ""
for page in reader.pages:
full_text += page.extract_text()
2. 创建和修改PDF
from PyPDF2 import PdfWriter
writer = PdfWriter()
# 添加空白页 (A4尺寸)
writer.add_blank_page(width=595.276, height=841.89) # 单位: 点(1/72英寸)
# 从现有PDF添加页面
reader = PdfReader("source.pdf")
writer.add_page(reader.pages[0]) # 添加第一页
# 保存新PDF
with open("output.pdf", "wb") as f:
writer.write(f)
3. 合并PDF文件
from PyPDF2 import PdfMerger
merger = PdfMerger()
# 方法1: 添加整个文件
merger.append("file1.pdf")
# 方法2: 添加特定页面
merger.append("file2.pdf", pages=(0, 3)) # 前3页 (0,1,2)
# 方法3: 在指定位置插入
merger.merge(2, "insert.pdf") # 在第2页后插入
# 保存合并结果
merger.write("merged.pdf")
merger.close()
4. 分割PDF文件
from PyPDF2 import PdfReader, PdfWriter
reader = PdfReader("large_file.pdf")
# 分割前5页
writer = PdfWriter()
for page in reader.pages[:5]:
writer.add_page(page)
writer.write("first_5_pages.pdf")
# 按页数平均分割
chunk_size = len(reader.pages) // 3
for i in range(3):
writer = PdfWriter()
start = i * chunk_size
end = (i + 1) * chunk_size if i < 2 else len(reader.pages)
for page in reader.pages[start:end]:
writer.add_page(page)
writer.write(f"part_{i+1}.pdf")
5. 加密与解密
from PyPDF2 import PdfReader, PdfWriter
# 加密PDF
reader = PdfReader("unsecured.pdf")
writer = PdfWriter()
for page in reader.pages:
writer.add_page(page)
writer.encrypt(user_password="123", owner_password="admin", algorithm="AES-256")
with open("encrypted.pdf", "wb") as f:
writer.write(f)
# 解密PDF
reader = PdfReader("encrypted.pdf")
if reader.is_encrypted:
reader.decrypt("123") # 或使用owner_password "admin"
print(reader.pages[0].extract_text())
6. 高级功能
提取图片
for page_num, page in enumerate(reader.pages):
for image in page.images:
with open(f"page{page_num}_{image.name}", "wb") as f:
f.write(image.data)
旋转页面
writer = PdfWriter()
page = reader.pages[0]
page.rotate(90) # 顺时针旋转90度
writer.add_page(page)
writer.write("rotated.pdf")
添加水印
from PyPDF2 import PdfReader, PdfWriter
main_pdf = PdfReader("document.pdf")
watermark = PdfReader("watermark.pdf").pages[0]
writer = PdfWriter()
for page in main_pdf.pages:
page.merge_page(watermark)
writer.add_page(page)
writer.write("watermarked.pdf")
性能优化技巧
-
流式处理大文件:
with open("large.pdf", "rb") as f: reader = PdfReader(f) # 处理代码 -
选择性读取:
# 只读取前10页 reader = PdfReader("large.pdf") needed_pages = reader.pages[:10] -
使用内存缓存:
from io import BytesIO with open("doc.pdf", "rb") as f: buffer = BytesIO(f.read()) reader = PdfReader(buffer)
常见问题解决
问题1:PdfReadError: Could not find xref table
-
原因:PDF文件损坏
-
解决:尝试用
pdf = PdfReader(stream, strict=False)
问题2:合并后格式错乱
-
原因:PDF使用特殊编码或字体
-
解决:尝试用
pdfrw或PyMuPDF替代
问题3:中文提取乱码
-
原因:编码问题
-
解决:使用
pdfplumber库提取中文更可靠
替代方案比较
| 库 | 优点 | 缺点 |
|---|---|---|
| PyPDF2 | 纯Python,功能全面 | 对复杂PDF支持有限 |
| pdfrw | 保留更多PDF原格式 | 文档较少 |
| PyMuPDF | 性能极佳,支持高级功能 | 需要编译,API较复杂 |
| pdfplumber | 文本提取准确,表格处理优秀 | 主要专注文本提取 |
PyPDF2 最适合中等复杂度的 PDF 操作任务,对于需要高性能或处理复杂 PDF 的场景,可以考虑 PyMuPDF。
Python的PDF处理库PyPDF2指南
923

被折叠的 条评论
为什么被折叠?



