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。