利用 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 小时前
Android Compose展示PDF文件
android·pdf
Aevget1 小时前
界面控件DevExpress WPF v25.1新版亮点:PDF Viewer功能全新升级
pdf·wpf·界面控件·devexpress·ui开发
花开花富贵1 小时前
多语言的爱意告白
python
JaguarJack1 小时前
9 个步骤教你如何安全地迁移数据库或字段
php·服务端
Olafur_zbj2 小时前
【AI】使用OCR处理pdf
数据库·pdf·ocr
百锦再2 小时前
第21章 构建命令行工具
android·java·图像处理·python·计算机视觉·rust·django
蒋星熠2 小时前
常见反爬策略与破解反爬方法:爬虫工程师的攻防实战指南
开发语言·人工智能·爬虫·python·网络安全·网络爬虫
飞梦工作室2 小时前
突破 pandas 瓶颈:实时读写 Excel 与超透视汇总函数的双维解决方案
python·excel·pandas
Jtti3 小时前
PHP项目缓存占用硬盘过大?目录清理与优化
java·缓存·php