python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python pypdf2实现pdf解密

python使用pypdf2实现pdf文档解密

作者:不当王多鱼不改名

利用pypdf2完成pdf的解密,这里的事例是python3环境下的,当然python2下也可以运行,只需要修改名称即可,文中通过代码示例给大家介绍的非常详细,需要的朋友可以参考下

用python完成PDF的解密!!!(!代码直接可以运行!)

用python的库函数pypdf2完成解密,如果不会用python的小伙伴别担心,直接点总结看最暴力最直接的办法(在线解密)

前言

利用pypdf2完成pdf的解密,这里的事例是python3环境下的,当然python2下也可以运行,只需要修改名称即可,在代码中有修改的地方,笔者也会指出,看完这篇你不会解密pdf的话!!!那我就再写一篇。

一、导入库函数

这里用到的模块有pypdf2、pycryptodome,如果没有模块的需要在对应的虚拟环境中执行以下的pip安装命令

pip install pypdf2
pip install pycryptodome

二、主要函数解读

1.引入库

如果是python2的在引入函数方法的时候需要改一下,如果是python3的就直接复制下面代码就好

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

2.自定义pdf读取函数

python2需要修改的地方在代码中已经标注,python3的直接复制下面代码即可

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的值

3.自定义pdf生成函数

将加密的文件及逆行解密,并生成一个无需密码pdf文件,下面是生成函数deception_pdf的基本参数

filename: 原先加密的pdf文件名称

password: 原文件对应的密码

decrypted_filename: 解密之后的文件名

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"""
    elif 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'))

三、完整源代码

from PyPDF2 import PdfReader #pdf的读取方法
from PyPDF2 import PdfWriter #pdf的写入方法
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
    elif 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'))

if __name__ == '__main__':
    # 逗号前面的为需要解密的pdf文件路径,后面的''里面为密码,如果不知道就用不填
    deception_pdf(r'E:\考研\301数学一\数学书\数学书\2024kaoyanmath1.pdf', '')

使用方法:
 

我们要先得到需要解密的文件路径,如下看到我们的文件路径为(‪E:\考研\301数学一\数学书\数学书\2024kaoyanmath1.pdf)复制后,再黏贴到代码中的指定位置即可

在这里插入图片描述

在这里插入图片描述

为了看到直观效果,我们看到这里的原文件是被加密的,接下来我们运行上面的代码然后再来看看效果

在这里插入图片描述

我们接着运行代码,接着指向的地址看

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

我们看到解密后的文件因为取消了加密权限,文件的大小也小了点

在这里插入图片描述

总结

以上就是python使用pypdf2实现pdf文档解密的详细内容,更多关于python pypdf2实现pdf解密的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文