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解密的资料请关注脚本之家其它相关文章!