Python中操作PDF文件的常用方法与工具选型

小石头
小石头
发布时间:2026-10-11 | 3人浏览过
原创

本文详解如何使用Python主流库处理PDF文件。涵盖PyPDF2执行合并拆分与加解密、pdfminer.six与PyMuPDF精准提取文档文本、ReportLab动态创建页面及嵌入图片。提供完整代码示例、依赖安装步骤与安全操作规范,助您快速掌握自动化文档处理全流程。

Python处理PDF的核心目标与依赖环境

日常办公与数据流转中,常需对PDF执行批量整合、页面拆解、内容抽取、格式生成及安全管控。本文按照真实操作链路梳理四大核心任务,直接给出可运行的代码骨架与关键参数说明。

首次使用前需在终端执行依赖安装:

pip install PyPDF2
pip install pdfminer.six
pip install reportlab

第1步:使用PyPDF2合并与拆分文档

目的:批量整合多个独立文件或按页拆解大型报表。
入口:Python脚本或交互式环境。
动作:实例化合并器或读写器,遍历路径列表进行IO操作。
重要参数:源文件数组(如['file1.pdf','file2.pdf'])与目标输出路径。
完成状态:控制台输出执行成功提示,工作目录生成对应的新文件。

import PyPDF2

# 创建一个 PDF 合并器对象
pdf_merger = PyPDF2.PdfMerger()

# 需要合并的 PDF 文件列表
pdf_files = ['file1.pdf', 'file2.pdf', 'file3.pdf']

# 合并 PDF 文件
for pdf in pdf_files:
    pdf_merger.append(pdf)

# 输出合并后的 PDF 文件
pdf_merger.write('merged_output.pdf')
pdf_merger.close()

print("PDF 文件合并完成!")

拆分实现逻辑

拆分依赖PdfReader获取总页数,循环内逐页追加至PdfWriter并定向写入。注意每次循环内新开文件流避免句柄冲突,最终生成page_1.pdf至page_N.pdf序列即为拆分闭环。

第2步:调用第三方引擎精准提取文本

目的:获取PDF内的纯文本内容,适用于归档、检索或二次建模预处理。
入口:模块化函数调用。
动作:通过专用解析接口或页面对象逐行读取。
重要参数:待解析文件路径。
完成状态:日志区打印完整段落,内存变量接收结构化字符串。

import PyPDF2

# 打开 PDF 文件
with open('sample.pdf', 'rb') as file:
    reader = PyPDF2.PdfReader(file)
    text = ""
    
    # 提取所有页的文本
    for page_num in range(len(reader.pages)):
        page = reader.pages[page_num]
        text += page.extract_text()

print("PDF 文件内容:")
print(text)

高阶替代方案:pdfminer.six内置更完善的版面分析算法,对表格型或混排复杂的文档还原度更高,调用极简:from pdfminer.high_level import extract_text; text = extract_text('sample.pdf')。PyMuPDF(fitz)则侧重底层渲染树解析,提取速度最快,适合海量文档流水线作业。

第3步:基于ReportLab创建并渲染内容

目的:从零构建符合企业规范的PDF票据、报表或宣传页。
入口:canvas.Canvas上下文初始化。
动作:设定纸张规格后,通过坐标映射绘制文本串、几何图形或外部媒体资源。
重要参数:pageszie定义画幅,drawString(x,y,text)定位文字,drawImage(path,w,h)绑定图像尺寸。
完成状态:调用c.save()提交绘制指令,生成离线文档。

from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas

def create_pdf_with_image(output_filename):
    c = canvas.Canvas(output_filename, pagesize=letter)
    c.drawString(100, 750, "Here is an image below:")
    
    # 添加图像
    c.drawImage("image.jpg", 100, 500, width=200, height=150)  # 图像位置和大小
    
    c.save()

crate_pdf_with_image("pdf_with_image.pdf")
print("PDF 文件(带图像)创建完成!")

第4步:为文档配置访问权限控制

⚠️ 风险提醒:加密操作会改变文件校验结构,务必在执行覆盖前备份原始凭证与源文件,防止遗忘密钥导致永久无法读取。

目的:限制未授权查阅或篡改敏感数据。
入口:读写混合模式下的安全接口。
动作:将原文档页队列注入写入器,挂载加密算法并写入密文副本;解密则反向校验口令流。

import PyPDF2

# 加密演示
with open('sample.pdf', 'rb') as file:
    reader = PyPDF2.PdfReader(file)
    writer = PyPDF2.PdfWriter()
    for page in reader.pages:
        writer.add_page(page)
    
    password = "your_password"
    writer.encrypt(password)
    
    with open('encrypted_sample.pdf', 'wb') as encrypted_file:
        writer.write(encrypted_file)
print("PDF 文件加密完成!")
# 解密演示
with open('encrypted_sample.pdf', 'rb') as file:
    reader = PyPDF2.PdfReader(file)
    password = "your_password"
    if reader.is_encrypted:
        reader.decrypt(password)
    
    writer = PyPDF2.PdfWriter()
    for page in reader.pages:
        writer.add_page(page)
    
    with open('decrypted_sample.pdf', 'wb') as decrypted_file:
        writer.write(decrypted_file)
print("PDF 文件解密完成!")

运行验证排错与交付确认

执行时若抛出ModuleNotFoundError,请核对当前Python环境与pip安装的版本空间是否一致。部分底层解析组件在纯Linux容器内可能缺失C扩展,建议优先采用预编译轮子或切换Conda虚拟环境。操作落盘后,比对输出文件的页数标记与实际业务量是否吻合,且能正常被常规阅读器打开,即判定为流程完结。

工具链适用场景对照

  • PyPDF2:轻量级元数据处理,适合常规合并、分页切割、基础口令保护。
  • pdfminer.six:专注版面还原与深度文本挖掘,应对复杂排版与表格抽取。
  • reportlab:完全可控的渲染引擎,用于定制化单据、证书或带图排版输出。
  • PyMuPDF:底层直读架构,追求极高吞吐量的批量化文本/图像收割。

以上就是Python中操作PDF文件的常用方法的详细内容,更多关于Python操作PDF文件的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表