利用 Python 解密 / 加密 PDF 文件

文章目录

  • [Part.I Introduction](#Part.I Introduction)
  • [Part.II 破除编辑密码](#Part.II 破除编辑密码)
    • [Chap.I 准备工作](#Chap.I 准备工作)
    • [Chap.II 源码](#Chap.II 源码)
    • [Chap.III 调用实例](#Chap.III 调用实例)
  • [Part.III 破除打开密码](#Part.III 破除打开密码)
    • [Chap.I 准备工作](#Chap.I 准备工作)
    • [Chap.II 源码](#Chap.II 源码)
    • [Chap.III 调用实例](#Chap.III 调用实例)
  • [Part.IV 添加打开密码](#Part.IV 添加打开密码)
    • [Chap.I 准备工作](#Chap.I 准备工作)
    • [Chap.II 源码](#Chap.II 源码)
    • [Chap.III 调用实例](#Chap.III 调用实例)
  • [Part.X 其他](#Part.X 其他)
  • Reference

Part.I Introduction

一般遇到的 PDF 有两种加密类型:一是打开加密,二是编辑加密。本文介绍了针对此两种加密类型的解密方法。另外,还介绍了如何给 PDF 文件添加打开密码。(已附所有源码,内容均来源于网络。)

Part.II 破除编辑密码

就是要达到下面的效果

Chap.I 准备工作

首先安装几个包

python 复制代码
pip install pypdf2
pip install pycryptodome

Chap.II 源码

python 复制代码
from PyPDF2 import PdfReader #pdf的读取方法
from PyPDF2 import PdfWriter #pdf的写入方法
"""
如果是python2的将上面的PdfReader和PdfWriter改为
PdfFileReader和PDFfileWriter即可
"""
from Crypto.Cipher import AES #高加密的方法,要引入不然会报错



def get_reader(filename, password): #读取pdf的方法(自定义函数)
    try:
        old_file = open(filename, 'rb')
        print('解密开始...')
    except Exception as err:
        return print('文件打开失败!' + str(err))

    """如果是python2将PdfReader改为PdfFileReader"""
    pdf_reader = PdfReader(old_file, strict=False) #读取pdf文件

    """如果是python2将is_encrypted改为isEncrypted"""
    if pdf_reader.is_encrypted: #解密操作(以下操作是自适应,不会展示在终端中)
        if password is None:
            return print('文件被加密,需要密码!--{}'.format(filename))
        else:
            if pdf_reader.decrypt(password) != 1:
                return print('密码不正确!--{}'.format(filename))
    elif old_file in locals():
        old_file.close() #如果pdf文件已经在本地了就关闭
    return pdf_reader #返回读出pdf的值


def deception_pdf(filename, password, decrypted_filename=None): #生成新pdf的方法(自定义函数)
    print('正在生成解密...')
    #得到传入的文件名和密码(这里不用做修改)
    pdf_reader = get_reader(filename, password) 
    if pdf_reader is None:
        return print("无内容读取")
    """如果是python2将is_encrypted改为isEncrypted"""
    if not pdf_reader.is_encrypted:
        return print('文件没有被加密,无需操作')

    """如果是python2将PdfWriter改为PdfFileWriter"""
    pdf_writer = PdfWriter() #写pdf(记录pdf内容)

    """如果是python2将append_pages_from_reader改为appendPagesFromReader"""
    pdf_writer.append_pages_from_reader(pdf_reader)

    if decrypted_filename is None: #创建解密后的pdf文件和展示文件的路径
        decrypted_filename = "".join(filename.split('.')[:-1]) + '_' + '已解密' + '.pdf'
        print("解密文件已生成:{}".format(decrypted_filename))
    # 写入新文件
    pdf_writer.write(open(decrypted_filename, 'wb'))
    return

Chap.III 调用实例

python 复制代码
deception_pdf(r'A:\documnets\b.pdf','')

调用之后会在目录A:\documnets下生成没有编辑密码的b_已解密.pdf文件

Part.III 破除打开密码

声明:下面的代码是针对"你有现成的密码集,但不确定哪个密码是正确的"情况!!!

Chap.I 准备工作

安装下面几个包

python 复制代码
pip install pypdf2
pip install pikepdf
pip install tqdm

准备一个密码集rockyou.txt,戳我可下载一个准备好的密码集。(里面有1400万个密码)

Chap.II 源码

python 复制代码
from PyPDF2 import PdfReader #pdf的读取方法
from PyPDF2 import PdfWriter #pdf的写入方法
import pikepdf #是用来读取pdf文件
from tqdm import tqdm # 用来读取进度条

def userCrak(filePathName, wordPathList):
    filename = filePathName  # pdf文件路径
    wordlist = wordPathList  # 密码字典路径
    n_words = len(list(open(wordlist, 'rb')))
    fp = open(filename, "rb+")
    pdfFile = PdfReader(fp)  # python2用PdfFileReader
    with open(wordlist, "rb") as wordlist:
        if pdfFile.is_encrypted: # python2为getIsEncrypted
            for word in tqdm(wordlist, total=n_words, unit="word"): # 显示进度条
                try:
                    pikepdf.open(filename, password=word.strip()) #打开文件查看是否能打开
                except:
                    continue
                else:
                    passwords = word.decode().strip() # 得到的密码
                    print(f"已经查找到密码为:{passwords}")
                    return passwords
            return print("!密码没有找到, 请尝试使用其他的密码词典!")

def decrypt(filePathName, userPasswordName):
    """如果是Python2用PdfFileReader"""
    pdf_reader = PdfReader(fr'{filePathName}')  # 输入你想要操作的pdf加密的文档的位置/名称
    pdf_reader.decrypt(f'{userPasswordName}') # 加入解密的密码
    """如果是Python2用PdfFileWriter"""
    pdf_writer = PdfWriter()
    """如果是python2将append_pages_from_reader改为appendPagesFromReader"""
    pdf_writer.append_pages_from_reader(pdf_reader)

    pdf_writer.write(open(filePathName, 'wb')) # 写文件
    print("!!!原PDF文件打开密码已去除!!!")
    return

Chap.III 调用实例

python 复制代码
filenamePath = r"D:\a.pdf"  # pdf文件路径
wordlistPath = r"D:\rockyou.txt"  # 密码字典路径
userPassword = userCrak(filenamePath, wordlistPath) # 得到解密的密码
decrypt(filenamePath, userPassword) # 将解密的密码和文件路径填入,会覆盖掉原文件

Part.IV 添加打开密码

Chap.I 准备工作

安装下面的包(若已安装则忽略)

python 复制代码
pip install pypdf2

想一个密码,比如123456

Chap.II 源码

python 复制代码
from PyPDF2 import PdfReader #pdf的读取方法
from PyPDF2 import PdfWriter #pdf的写入方法

def encrypt_pdf(input_pdf, output_pdf, password):
    pdf_reader = PdfReader(input_pdf)
    pdf_writer = PdfWriter()
    for page in range(len(pdf_reader.pages)):
        pdf_writer.add_page(pdf_reader.pages[page])
    pdf_writer.encrypt(password)
    with open(output_pdf, 'wb') as f:
        pdf_writer.write(f)
    return

Chap.III 调用实例

python 复制代码
inPath=r'A:\c.pdf'
outPath=r'A:\c_已加密.pdf'
pwd='123456'
encrypt_pdf(inPath,outPath,pwd)

Part.X 其他

  • 想要减少 pdf 的大小可以用 adobe acrobat 在另存的时候勾选『减小文件大小』。
  • 想要添加编辑 pdf 的密码可以用adobe acrobat 在另存的时候勾选『限制编辑』

Reference

相关推荐
应用市场1 小时前
用本机跑的开源音乐模型,给安卓小游戏做 20 秒无缝循环背景音乐
android·python·游戏开发·soundpool·音频处理
小lo想吃棒棒糖1 小时前
把 启元机器人Q1 的训练搬到昇腾 910B:从 MuJoCo 到 PPO 的一次完整迁移
人工智能·python·机器人·昇腾·具身智能
weixin_307779131 小时前
RAG 级联失效分析——面试中的错误归因艺术
人工智能·python·面试·职场和发展
AI创界者1 小时前
Python 进阶实战(十八):API 网关安全与异步鉴权中间件 —— 基于 AsyncIO 的 JWT 零拷贝验权与动态黑名单过滤
人工智能·python·aigc
前端精髓1 小时前
学会调用Qwen3.7-通用文本向量
python
OxYGC1 小时前
[工程] PHP2Shell 漏洞解析:两条 PHP 内核 RCE,为什么应用层的防护全部失效
android·开发语言·php
李纲明2 小时前
WordPress 媒体库上传失败或一直转圈:先核 PHP 上传限制与目录权限,再查安全插件与对象存储
运维·开发语言·安全·php·wordpress·媒体库·devdiy
第九序言T10 小时前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
Java后端的Ai之路10 小时前
CAS并发控制-从CPU指令到企业级乐观锁
vue.js·人工智能·python·cas·乐观锁
qq_4260039610 小时前
UI自动化高频次登录login限流解决方案
python·ui·自动化