Python实现PDF加密解密的示例代码详解

原创 2025-08-22 09:48:58编程技术
554

引言

在数字化办公场景中,PDF文件因其跨平台兼容性和内容稳定性成为主流文档格式。然而,敏感信息泄露风险促使企业与个人对PDF文件进行加密保护。Python凭借其丰富的PDF处理库,为开发者提供了灵活高效的加密解密解决方案。本文ZHANID工具网将通过PyPDF2、pikepdf和Spire.PDF三大主流库的代码示例,系统阐述PDF安全操作的技术实现路径。

一、PDF加密解密技术原理

1.1 加密机制

PDF加密通过**用户密码(打开密码)所有者密码(权限密码)**构建双重防护体系:

  • 用户密码:限制文件打开权限,未授权用户无法查看内容

  • 所有者密码:控制编辑、打印、复制等操作权限,即使绕过打开密码仍需此密码修改权限

  • 加密算法:主流算法包括40/128位RC4、128/256位AES,算法强度直接影响破解难度

1.2 解密流程

解密过程需验证密码有效性:

  1. 读取加密文件元数据

  2. 调用解密函数验证密码

  3. 成功验证后解除内容保护

  4. 允许合法用户执行操作

二、PyPDF2库实现基础操作

2.1 单文件加密

from PyPDF2 import PdfReader, PdfWriter

def encrypt_pdf(input_path, output_path, password):
  reader = PdfReader(input_path)
  writer = PdfWriter()
  
  for page in reader.pages:
    writer.add_page(page)
  
  writer.encrypt(password) # 设置用户密码
  with open(output_path, "wb") as f:
    writer.write(f)

# 示例调用
encrypt_pdf("原始文件.pdf", "加密文件.pdf", "user123")

关键参数说明

  • encrypt()方法支持设置用户密码,若需设置所有者密码需结合权限控制

  • 默认使用128位RC4加密算法

2.2 单文件解密

def decrypt_pdf(input_path, output_path, password):
  reader = PdfReader(input_path)
  if reader.is_encrypted:
    if reader.decrypt(password) == 0: # 0表示解密失败
      raise ValueError("密码错误")
  
  writer = PdfWriter()
  for page in reader.pages:
    writer.add_page(page)
  
  with open(output_path, "wb") as f:
    writer.write(f)

# 示例调用
decrypt_pdf("加密文件.pdf", "解密文件.pdf", "user123")

异常处理要点

  • 必须先检查is_encrypted属性避免非加密文件报错

  • 解密返回值0表示失败,1表示成功

2.3 批量处理实现

import os

def batch_encrypt(input_dir, output_dir, password):
  os.makedirs(output_dir, exist_ok=True)
  
  for filename in os.listdir(input_dir):
    if filename.lower().endswith('.pdf'):
      input_path = os.path.join(input_dir, filename)
      output_path = os.path.join(output_dir, filename)
      
      try:
        encrypt_pdf(input_path, output_path, password)
        print(f"成功加密: {filename}")
      except Exception as e:
        print(f"处理失败 {filename}: {str(e)}")

# 示例调用
batch_encrypt("原始文件夹", "加密文件夹", "batch123")

性能优化建议

  • 使用多线程处理大批量文件

  • 添加进度条显示(如tqdm库)

三、pikepdf库高级应用

3.1 增强型加密

import pikepdf
from pikepdf import PdfEncryption

def advanced_encrypt(input_path, output_path, user_pwd, owner_pwd=None):
  with pikepdf.open(input_path) as pdf:
    # 设置加密参数
    encryption = PdfEncryption(
      user_password=user_pwd,
      owner_password=owner_pwd or user_pwd,
      allow=pikepdf.Permissions(
        print_high=True, # 允许高质量打印
        modify_contents=False # 禁止内容修改
      ),
      algorithm=pikepdf.EncryptionAlgorithm.AES256 # 使用AES-256加密
    )
    pdf.save(output_path, encryption=encryption)

# 示例调用
advanced_encrypt("原始文件.pdf", "高级加密.pdf", "user456", "owner456")

参数详解

  • Permissions对象控制16种操作权限

  • 支持AES-128/256和RC4加密算法

3.2 暴力破解实现

from tqdm import tqdm

def brute_force_decrypt(input_path, wordlist_path):
  with open(wordlist_path) as f:
    passwords = [line.strip() for line in f]
  
  for pwd in tqdm(passwords):
    try:
      with pikepdf.open(input_path, password=pwd):
        print(f"破解成功: {pwd}")
        return pwd
    except pikepdf._qpdf.PasswordError:
      continue
  
  print("破解失败")
  return None

# 示例调用(需准备密码字典)
brute_force_decrypt("加密文件.pdf", "password_list.txt")

破解效率优化

  • 使用GPU加速库(如hashcat集成)

  • 采用分布式计算框架

  • 结合密码规则生成器缩小范围

PDF加密解密.webp

四、Spire.PDF企业级方案

4.1 商业级加密

from spire.pdf import *

def enterprise_encrypt(input_path, output_path, user_pwd, owner_pwd=None):
  doc = PdfDocument()
  doc.load_from_file(input_path)
  
  # 设置加密策略
  security = PdfSecurityPolicy()
  security.encryption_algorithm = PdfEncryptionAlgorithm.AES_256
  security.user_password = user_pwd
  security.owner_password = owner_pwd or user_pwd
  security.document_privilege = PdfDocumentPrivilege.ForbidAll()
  security.document_privilege.allow_print = True # 仅允许打印
  
  doc.encrypt(security)
  doc.save_to_file(output_path)
  doc.close()

# 示例调用
enterprise_encrypt("原始文件.pdf", "企业加密.pdf", "corp789", "admin789")

企业级特性

  • 支持数字签名集成

  • 提供详细的审计日志

  • 符合ISO 32000标准

4.2 权限移除操作

def remove_protection(input_path, output_path, owner_pwd):
  doc = PdfDocument()
  doc.load_from_file(input_path, owner_pwd) # 必须使用所有者密码
  
  # 清空密码设置
  doc.security.encrypt("", "", PdfPermissionsFlags.Default, PdfEncryptionKeySize.Key128Bit)
  doc.save_to_file(output_path)
  doc.close()

# 示例调用
remove_protection("受保护文件.pdf", "无保护文件.pdf", "admin789")

安全注意事项

  • 权限移除操作需严格审计

  • 建议保留原始加密文件备份

  • 操作日志应记录操作者身份

五、跨库综合应用

5.1 加密文件内容提取

import pikepdf
import pdfplumber

def extract_from_encrypted(input_path, output_txt, password):
  # 使用pikepdf解密
  with pikepdf.open(input_path, password=password) as pdf:
    temp_path = "temp_decrypted.pdf"
    pdf.save(temp_path)
    
    # 使用pdfplumber提取文本
    with pdfplumber.open(temp_path) as plumber_pdf:
      with open(output_txt, "w", encoding="utf-8") as f:
        for page in plumber_pdf.pages:
          f.write(page.extract_text() + "\n")
  
  # 清理临时文件
  import os
  os.remove(temp_path)

# 示例调用
extract_from_encrypted("加密报告.pdf", "提取内容.txt", "extract123")

应用场景

  • 自动化文档处理流水线

  • 敏感信息脱敏处理

  • 审计日志生成

5.2 加密状态检测

from spire.pdf import PdfDocument

def check_encryption_status(file_path):
  try:
    doc = PdfDocument()
    doc.load_from_file(file_path) # 自动检测加密状态
    print("文件未加密")
    return False
  except Exception as e:
    if "PDF is password protected" in str(e):
      print("文件已加密")
      return True
    raise e

# 示例调用
check_encryption_status("待检测文件.pdf")

扩展功能

  • 批量检测文件夹内文件

  • 生成加密状态报告

  • 与文件管理系统集成

六、性能对比与选型建议

指标 PyPDF2 pikepdf Spire.PDF
加密速度 ★★☆ ★★★ ★★★★
算法支持 RC4 AES全系列 企业级算法
权限控制 基础 精细 全面
破解难度 中高 极高
商业使用 免费 免费 需授权

选型建议

  • 个人使用:PyPDF2(简单场景)或pikepdf(需要AES加密)

  • 企业应用:Spire.PDF(需完整权限管理)

  • 安全审计:pikepdf(支持密码破解测试)

七、常见问题解决方案

7.1 中文乱码问题

# 在PyPDF2中指定编码
from PyPDF2 import PdfFileReader

def read_chinese_pdf(path):
  with open(path, "rb") as f:
    reader = PdfFileReader(f)
    if reader.is_encrypted:
      reader.decrypt("password")
    
    text = ""
    for page in reader.pages:
      text += page.extract_text()
    
    # 指定编码处理
    return text.encode('latin1').decode('gbk')

7.2 大文件处理优化

# 使用生成器逐页处理
def process_large_pdf(input_path, output_path, password):
  reader = PdfReader(input_path)
  if reader.is_encrypted:
    reader.decrypt(password)
  
  writer = PdfWriter()
  for i, page in enumerate(reader.pages):
    # 这里添加处理逻辑
    writer.add_page(page)
    
    # 每100页保存一次
    if (i+1) % 100 == 0:
      with open(f"{output_path}_part{i//100}.pdf", "wb") as f:
        writer.write(f)
      writer = PdfWriter() # 重置writer

八、安全实践规范

  1. 密码管理

    • 避免使用弱密码(如123456)

    • 推荐使用密码管理器生成16位以上随机密码

    • 定期更换重要文件密码

  2. 存储安全

    • 加密文件与密码分开存储

    • 使用AES-256加密存储密码数据库

    • 限制加密文件访问权限

  3. 操作审计

    • 记录所有加密解密操作

    • 实施双人复核机制

    • 定期审查权限设置

结语

本文系统阐述了Python实现PDF加密解密的完整技术体系,从基础库应用到企业级解决方案,覆盖了90%以上的实际应用场景。开发者可根据具体需求选择合适的技术方案,在保障数据安全的同时提升处理效率。实际项目中建议结合具体业务场景进行功能扩展,如添加水印、数字签名等增强安全措施。

Python
THE END
战地网
频繁记录吧,生活的本意是开心

相关推荐

Python yield 用法大全:轻松掌握生成器与迭代器设计
在Python中,yield关键字是构建生成器的核心工具,它通过状态保存机制实现了高效的内存管理和惰性计算。与传统的迭代器实现相比,yield能将迭代器设计从复杂的类定义简化为直...
2025-09-15 编程技术
575

基于Python的旅游数据分析可视化系统【2026最新】
本研究成功开发了基于Python+Django+Vue+MySQL的旅游数据分析可视化系统,实现了从数据采集到可视化展示的全流程管理。系统采用前后端分离架构,前端通过Vue框架构建响应式界...
2025-09-13 编程技术
600

手把手教你用Python读取txt文件:从基础到实战的完整教程
Python作为数据处理的利器,文件读写是其基础核心功能。掌握txt文件读取不仅能处理日志、配置文件等常见场景,更是理解Python文件I/O的基石。本文ZHANID工具网将从基础语法到...
2025-09-12 编程技术
578

Python Flask 入门指南:从零开始搭建你的第一个 Web 应用
Flask作为 Python 中最轻量级且灵活的 Web 框架之一,特别适合初学者快速上手 Web 应用开发。本文将带你一步步了解如何在本地环境中安装 Flask、创建一个简单的 Web 应用,并...
2025-09-11 编程技术
552

Python 如何调用 MediaPipe?详细安装与使用指南
MediaPipe 是 Google 开发的跨平台机器学习框架,支持实时处理视觉、音频和文本数据。本文脚本之家将系统讲解 Python 环境下 MediaPipe 的安装、配置及核心功能调用方法,涵盖...
2025-09-10 编程技术
594

基于Python开发一个利率计算器的思路及示例代码
利率计算是金融领域的基础需求,涵盖贷款利息、存款收益、投资回报等场景。传统计算依赖手工公式或Excel表格,存在效率低、易出错等问题。Python凭借其简洁的语法和强大的数学...
2025-09-09 编程技术
535