PDF文档的加密和解密
文章目录
- PDF文档的加密和解密
- 前言
- 一、总体构思
- 二、使用到的库
- 三、PDF文档的加密
- 1.用户输入模块
- 2.打开并读取文档数据
- 3.遍历保存数据到新文档
- 4.新文档进行加密
- 5.新文档命名+生成路径
- 6.保存新加密的文档
- 四、PDF文档的解密
- 1.用户输入模块
- 2.前提准备
- 2.文件解密与保存
- 总结
前言
这篇我没有放到专栏《Python 自动化》。因为市面上文档的加解密功能几乎是免费的,而且功能很全面。
所以,这个关于Python的PDF文档加解密看着一乐就行,日常工作用不到也不会用这个去搞。
建议各位看这个之前先去看一下我之前写的两篇,要不然下面的可能会看的云里雾里。
https://blog.csdn.net/weixin_57061292/article/details/134790966?spm=1001.2014.3001.5502
https://blog.csdn.net/weixin_57061292/article/details/134817121?spm=1001.2014.3001.5502
一、总体构思
下面我会分成两部分进行编写,先是加密文档,后是解密文档。
二、使用到的库
代码如下:
import sys
import PyPDF2
import itertools
import time
加解密总共需要引入这些库,这是前提。
三、PDF文档的加密
1.用户输入模块
代码如下:
# 用户输入要加密的PDF文件
print('请输入pdf文档完整路径(例子:E:\BaiduNetdiskDownload\你好.pdf):', end='')
pdf_path = input())
这里提示用户输入要加密的PDF文档。
2.打开并读取文档数据
代码如下:
#以二进制形式打开文档
open_pdf = open(pdf_path, 'rb')#读取文档的数据
read_pdf = PyPDF2.PdfReader(open_pdf)#获取文档的总页数
get_pdf_pages = len(read_pdf.pages)
PDF文档操作之前经常要准备的三件套哈。
3.遍历保存数据到新文档
代码如下:
# 创建一个新的PDF文件以保存加密后的文档
pdf_out = PyPDF2.PdfWriter()# 遍历源PDF的每一页,并将它们添加到新的PDF中
for get_pdf_page in range(get_pdf_pages):page = read_pdf.pages[get_pdf_page]pdf_out.add_page(page)
代码注释写的很清楚了,我就不赘述了
4.新文档进行加密
代码如下:
#提示用户输入密码
print('请输入密码:', end='')
password = str(input())# 应用加密
pdf_out.encrypt(password)
这就是这个的加密过程。。。
5.新文档命名+生成路径
代码如下:
# 获取用户输入的文件名,不包括路径
pdf_file_name = pdf_path.split('\\')[-1] # 使用 \\
pdf_base_name = pdf_file_name.split('.')[0] # 去掉扩展名# 指定保存 .pdf 文件的完整路径和名称
output_dir = "D:/" # 替换为您的实际输出目录
output_file_name = f"{pdf_base_name}_加密.pdf"
output_path = output_dir + output_file_name
第一块代码是保留下来源文件的名称。
第二块代码是给新文件指明要保存到哪个路径。
6.保存新加密的文档
代码如下:
#保存文档
pdf_out.write(output_path)#结束函数的调用
pdf_out.close()print('加密好了,快去看一下吧。')
最后程序会print一下,这个出来了就表明加密成功了。
加密文档到这里就结束了,下面是解密文档。
四、PDF文档的解密
这个解密文档,我稍微添加了一些自己的想法。
除了让用户输入要解密的文档,还有要求输入要解密到几位数的密码(比如用户输入5,程序会把从1位数到5位数的密码都试一遍)。
1.用户输入模块
代码如下:
# 用户输入加密的PDF文件
print('请输入pdf文档完整路径(例子:E:\BaiduNetdiskDownload\你好.pdf):', end='')
pdf_path = input()# 输入密码可能最大的长度
print('请输入输入密码可能最大的长度:', end='')
len_passwd = int(input())# 用于破解密码的密码库
passwd_bank = '1111111'
最后一行是密码库,大家可以自行添加进行测试。
2.前提准备
代码如下:
with open(pdf_path, 'rb') as fh:pdf = PyPDF2.PdfReader(fh)
这里要先声明好用法,下面会用上。
2.文件解密与保存
代码如下:
start_time = time.time()
for i in range(len_passwd):i += 1for passwd in itertools.permutations(passwd_bank, r=i):guess_passwd = ''.join(passwd)pdf.decrypt(guess_passwd)try:# 这里是可能会出错的代码,密码不对会报错page = pdf.pages[0]if page.extractText() == '1':print(f"密码正确,这是{i}位数的: {guess_passwd}")stop_time = time.time()print(f'共用时{stop_time - start_time}秒。')#保存文档到与加密文档一样的目录with open('passwords.txt', 'w') as f:f.write(guess_passwd)#退出整个程序 sys.exit()except Exception:# 当出现类型的错误时执行这里的代码passelse:print(f"{i}位数的密码已试完。")
简单给大家说一下吧。
首先,最外层的for循环的作用是让密码从1位数跑到用户设置的X位数。
其次,中间那层for循环就是密码是1位数的时候,全部1位数的密码都跑一遍,直至跑到用户设置的X位数。
然后,最里层的try—except结构作用是保证程序在报错的时候也可以持续试密码。因为密码不对的时候程序会报错。
最后,剩下的就是把文件保存与加密文档一样的目录,打印一条信息告诉你搞定了。
这块要是还不怎么懂,可以先看一下我这篇博客,关于破解密码小程序的东西。
https://blog.csdn.net/weixin_57061292/article/details/134719727?spm=1001.2014.3001.5502
总结
大致就是这些东西,东西不多,希望对大家有所帮助吧。