Python 小程序之PDF文档加解密

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


总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/216511.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css 纯样式实现绘出进度条

效果: css代码: .bar{height: 14px;width: 100%;font-size: 10px;margin-top: 5px;background-color: #f5f5f5;}.bar::before{display: block;counter-reset: progress var(--precent); content: ;width: calc(1% * var(--precent));color: #fff;height:…

无公网IP环境Windows系统使用VNC远程连接Deepin桌面

🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,…

【C++11】右值引用与移动语义

一.左值与右值 左值:可以取地址的表示数据的表达式,左值可以出现在赋值符号左边 右值:不能取地址的表示数据的表达式,右值不能出现在赋值符号左边 int fun() {return 0; } int main() {int a 0;//a->左值const int b 1;//b-&…

把 Windows 11 装进移动硬盘:Windows 11 To Go

本篇文章聊聊如何制作一个可以“说带走就带走”的 Windows 操作系统,将 Windows11 做成能够放在 U 盘或者移动硬盘里的 WinToGo “绿色软件”。 写在前面 在《开源的全能维护 U 盘工具:Ventoy》这篇文章的最后,我提到了一个关键词 “WinToG…

【计算机网络】HTTP响应报文Cookie原理

目录 HTTP响应报文格式 一. 状态行 状态码与状态码描述 二. 响应头 Cookie原理 一. 前因 二. Cookie的状态管理 结束语 HTTP响应报文格式 HTTP响应报文分为四部分 状态行:包含三部分:协议版本,状态码,状态码描述响应头&a…

第三届《我们的世界》---2023 国际当代艺术展在广州沙面隆重启幕

开幕快讯 2023年12月10日下午,由法国表现主义画院与东方荟萃艺术学院 联合主办的,由法中艺术交流协会、香港博物馆世界、让米歇尔艺术空 间共同协办,法国驻广州总领事馆支持的第三届《我们的世界》---2023 国际当代艺术展在广州沙面隆重启幕! 嘉宾签到现场 本次展览集合了30位活…

多平台展示预约的服装小程序效果如何

线下实体服装店非常多,主要以同城生意为主,但随着电商经济增长,传统线下自然流量变少,商家们会选择线上入驻平台开店获得更多线上用户,包括自建私域小程序等。 而除了直接卖货外,线上展示预约在服装行业也…

第16章 网络io与io多路复用select/pool/epool

第16.1节 写一个服务端代码 服务端代码 #include <stdio.h> #include <errno.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h>#include <fcntl.h>int main() {//openint sockfd sock…

C语言指针基础题(二)

目录 例题一题目解析及答案 例题二题目解析及答案 例题三题目解析及答案 例题四题目解析及答案 例题五题目解析及答案 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412; 个人主页 &#x1f978;&#x1f978;&#x1f…

Tomcat头上有个叉叉

问题原因&#xff1a; 这是因为它就是个空的tomcat,并没有导入项目运行 解决方案&#xff1a; war模式&#xff1a;发布模式&#xff0c;正式发布时用&#xff0c;将WEB工程以war包的形式上传到服务器 war exploded模式&#xff1a;开发时用&#xff0c;将WEB工程的文件夹直接…

虚拟现实三维电子沙盘数字沙盘开发教程第5课

虚拟现实三维电子沙盘数字沙盘无人机倾斜摄影全景建模开发教程第5课 设置system.ini 如下内容 Server122.112.229.220 userGisTest Passwordchinamtouch.com 该数据库中只提供 成都市火车南站附近的数据请注意&#xff0c;104.0648,30.61658 在鼠标指定的位置增加自己的UI对象&…

Qt 5.15.2 三维显示功能

Qt 5.15.2 三维显示功能 三维显示效果&#xff1a; .pro项目文件 QT core gui opengl 3dcore 3drender 3dinput 3dextrasgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compile if it uses deprecated APIs. # In ord…

虚幻学习笔记10—C++函数与蓝图的通信

一、前言 除了上一章C变量与蓝图通信讲的变量能与蓝图通信外&#xff0c;还有函数和枚举也可以和蓝图通信。函数的关键字为”UFUNCTION“、枚举的关键字为”UENUM“。 二、实现 2.1、BlueprintCallable蓝图中调用 该函数时带执行的&#xff0c;带入如下。编译成功后在蓝图中输…

Android 11 适配——整理总结篇

背景 > 经过检测&#xff0c;我们识别到您的应用&#xff0c;目前未适配安卓11&#xff08;API30&#xff09;&#xff0c;请您关注适配截止时间&#xff0c;尽快开展适配工作&#xff0c;避免影响应用正常发布和经营。 > targetSdkVersion30 升级适配工作参考文档&am…

【算法】递归、搜索与回溯算法

文章目录 一. 名词解释1. 递归1.1 什么是递归&#xff1f;1.2 为什么会用到递归&#xff1f;1.3 如何理解递归&#xff1f;1.4 如何写好一个递归&#xff1f; 2. 遍历和搜索3. 回溯和剪枝 二. 递归系列专题1. 汉诺塔问题2. 合并两个有序链表3. 反转链表4. 两两交换链表中的节点…

git自动更新功能

确认权限 因为一般Linux系统网页用的www 或 www-data用户和用户组&#xff0c;所以要实现自动来去&#xff0c;首先要在www用户权限下生成ssh密钥&#xff0c;不然没有权限&#xff0c;其次就是&#xff0c;要把用root用户拉去的代码&#xff0c;批量改成www用户 1. 给www权…

Unity | 渡鸦避难所-2 | 搭建场景并添加碰撞器

1 规范项目结构 上期中在导入一系列的商店资源包后&#xff0c;Assets 目录已经变的混乱不堪 开发过程中&#xff0c;随着资源不断更新&#xff0c;遵循一定的项目结构和设计规范是非常必要的。这可以增加项目的可读性、维护性、扩展性以及提高团队协作效率 这里先做下简单的…

最新鸿蒙HarmonyOS4.0开发登陆的界面1

下载deveco-studio 说明一下&#xff0c;本人只是学习中&#xff0c;现在只是拿着vue及uniapp的经验在一点一点的折腾&#xff0c;不过现在看来&#xff0c;鸿蒙入门并不是很难。也许是自己没有深入下去。 https://developer.harmonyos.com/cn/develop/deveco-studio#download…

Ubuntu 20.04 安装 mysql8 LTS

Ubuntu 20.04 安装 mysql8 LTS sudo apt-get update sudo apt-get install mysql-server -y mysql --version mysql Ver 8.0.35-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu)) Ubuntu20.04 是自带了 MySQL8. 几版本的&#xff0c;低于 20.04 则默认安装是 MySQL5.7.33…

基于Java8构建Docke镜像

基于Java8构建Docke镜像 搜索java8安装包 docker search java8 --no-trunc &#xff0c; --no-trunc展开描述信息 选择拉取 docker pull docker.io/mykro/java8-jre&#xff0c;为了减少磁盘占用&#xff0c;选择jre版本基础镜像 在宿主机创建文件夹iot&#xff0c;并把所需…