python使用pypdf2实现pdf文档解密

 更新时间:2023年12月25日 12:09:26   作者:不当王多鱼不改名  
利用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解密的资料请关注脚本之家其它相关文章!

相关文章

  • Python小知识之几种推导式用法示例

    Python小知识之几种推导式用法示例

    Python推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体,下面这篇文章主要给大家介绍了关于Python小知识之几种推导式用法的相关资料,需要的朋友可以参考下
    2023-01-01
  • Python使用xpath对解析内容进行数据提取

    Python使用xpath对解析内容进行数据提取

    XPath 使用路径表达式来选取HTML/ XML 文档中的节点或节点集,节点是通过沿着路径 (path) 或者步 (steps) 来选取的,本文将给大家介绍Python使用xpath对解析内容进行数据提取的方法,需要的朋友可以参考下
    2024-05-05
  • 安装python-docx后,无法在pycharm中导入的解决方案

    安装python-docx后,无法在pycharm中导入的解决方案

    这篇文章主要介绍了安装python-docx后,无法在pycharm中导入的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • pytorch教程resnet.py的实现文件源码分析

    pytorch教程resnet.py的实现文件源码分析

    torchvision.models这个包中包含alexnet、densenet、inception、resnet、squeezenet、vgg等常用的网络结构,并且提供了预训练模型,可以通过简单调用来读取网络结构和预训练模型
    2021-09-09
  • ​​​​​​​如何利用python破解zip加密文件

    ​​​​​​​如何利用python破解zip加密文件

    这篇文章主要介绍了​​​​​​​如何利用python破解zip加密文件,文章基于python的相关资料展开破解zip加密文件的详细内容介绍,需要的小伙伴可以参考一下
    2022-05-05
  • 对python 读取线的shp文件实例详解

    对python 读取线的shp文件实例详解

    今天小编就为大家分享一篇对python 读取线的shp文件实例详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Python YAML文件的读写操作详解

    Python YAML文件的读写操作详解

    这篇文章主要介绍了Python读写yaml文件,yaml 是专门用来写配置文件的语言,非常简洁和强大,之前用ini也能写配置文件,有点类似于json格式,下面关于Python读写yaml文件的详细资料,需要的小伙伴可以参考一下
    2022-08-08
  • 用 Django 开发一个 Python Web API的方法步骤

    用 Django 开发一个 Python Web API的方法步骤

    这篇文章主要介绍了用 Django 开发一个 Python Web API的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • python图片剪裁代码(图片按四个点坐标剪裁)

    python图片剪裁代码(图片按四个点坐标剪裁)

    这篇文章主要介绍了python图片剪裁代码(图片按四个点坐标剪裁),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Python显示进度条的方法

    Python显示进度条的方法

    这篇文章主要介绍了Python显示进度条的方法,以实例的形式进行了详细的分析,是一个非常实用的技巧,需要的朋友可以参考下
    2014-09-09

最新评论