Python 小程序之PDF文档加解密

2023-12-13 05:45:46

PDF文档的加密和解密



前言

这篇我没有放到专栏《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 += 1
    for 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:
            # 当出现类型的错误时执行这里的代码
            pass
    else:
        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


总结

大致就是这些东西,东西不多,希望对大家有所帮助吧。
在这里插入图片描述

文章来源:https://blog.csdn.net/weixin_57061292/article/details/134843357
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。