Python编程:PDF 处理库

PyPDF2 是一个纯 Python 的 PDF 处理库,可以读取、分割、合并、转换和提取 PDF 内容。以下是 PyPDF2 的全面指南,包含最新版本(PyPDF2 3.x)的用法。

安装与版本

pip install PyPDF2 --upgrade

注意:PyPDF2 3.0+ 有重大 API 变化,旧代码可能需要调整

核心功能概览

功能类/方法说明
读取PDFPdfReader读取PDF内容和元数据
写入PDFPdfWriter创建或修改PDF文件
合并PDFPdfMerger合并多个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")

性能优化技巧

  1. 流式处理大文件

    with open("large.pdf", "rb") as f:
        reader = PdfReader(f)
        # 处理代码
  2. 选择性读取

    # 只读取前10页
    reader = PdfReader("large.pdf")
    needed_pages = reader.pages[:10]
  3. 使用内存缓存

    from io import BytesIO
    
    with open("doc.pdf", "rb") as f:
        buffer = BytesIO(f.read())
    reader = PdfReader(buffer)

常见问题解决

问题1PdfReadError: Could not find xref table

  • 原因:PDF文件损坏

  • 解决:尝试用pdf = PdfReader(stream, strict=False)

问题2:合并后格式错乱

  • 原因:PDF使用特殊编码或字体

  • 解决:尝试用pdfrwPyMuPDF替代

问题3:中文提取乱码

  • 原因:编码问题

  • 解决:使用pdfplumber库提取中文更可靠

替代方案比较

优点缺点
PyPDF2纯Python,功能全面对复杂PDF支持有限
pdfrw保留更多PDF原格式文档较少
PyMuPDF性能极佳,支持高级功能需要编译,API较复杂
pdfplumber文本提取准确,表格处理优秀主要专注文本提取

PyPDF2 最适合中等复杂度的 PDF 操作任务,对于需要高性能或处理复杂 PDF 的场景,可以考虑 PyMuPDF。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值