当前位置: 首页 > news >正文

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


总结

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

相关文章:

Python 小程序之PDF文档加解密

PDF文档的加密和解密 文章目录 PDF文档的加密和解密前言一、总体构思二、使用到的库三、PDF文档的加密1.用户输入模块2.打开并读取文档数据3.遍历保存数据到新文档4.新文档进行加密5.新文档命名生成路径6.保存新加密的文档 四、PDF文档的解密1.用户输入模块2.前提准备2.文件解密…...

使用python脚本一个简单的搭建ansible集群

1.环境说明: 角色主机名ip地址控制主机server192.168.174.150受控主机/被管节点client1192.168.174.151受控主机/被管节点client2192.168.174.152 2.安装python和pip包 yum install -y epel-release yum install -y python python-pip 3.pip安装依赖库 pip in…...

【价值几十万的仿抖音直播电商系统源码共享】

当下,传统的图文电商模式已经走向没落,以抖音为首的直播电商模式备受用户追捧,它具有实时直播和强互动的特点,是传统电商所不具备的优势。而且,当前正是直播电商的红利期,很多主播和品牌商都通过直播电商业…...

对于vue3项目中使用shareReward还是shareReward.value的问题

问: // 设置当前有没有分享过 默认是false const shareReward ref(false) // 是否是第一次分享 来判断是否发放抽奖次数 function haveShare() { console.log(进入haveshare) if (userInfo.uid && shareReward.value) { rewardTimes(2).then((res) &…...

利用websockify将websocket通信转换成tcp

文章目录 前言websockifywebsockify 介绍websockify 使用 探索的过程提供基础TCP服务测试可用 实现Websocket客户端开始测试websockify功能再次启动websockify单独实现一个js版本websocket客户端 什么是VNC总结 前言 目前遇到一个问题,原本的服务都是利用tcp通信的…...

【LeetCode刷题】-- 163.缺失的区间

163.缺失的区间 class Solution {public List<List<Integer>> findMissingRanges(int[] nums, int lower, int upper) {List<List<Integer>> res new ArrayList<>();for(int num : nums){if(lower < num){res.add(Arrays.asList(lower,num -…...

ClickHouse为何如此之快

针对ClickHouse为什么很快的问题&#xff0c;基于对ClickHouse的基础概念之上&#xff0c;一般会回答是因为是列式存储数据库&#xff0c;同时也会说是使用了向量化引擎&#xff0c;所以快。上面两方面的解释也都能够站得住脚&#xff0c;但是依然不能够解释真正核心的原因。因…...

Avalonia中如何将View事件映射到ViewModel层

前言 前面的文章里面我们有介绍在Wpf中如何在View层将事件映射到ViewModel层的文章,传送门,既然WPF和Avalonia是两套不同的前端框架,那么WPF里面实现模式肯定在这边就用不了,本篇我们将分享一下如何在Avalonia前端框架下面将事件映射到ViewModel层。本章内容还是在上一节的…...

(第42天)DataGuard 搭建之使用 Duplicate 复制

环境准备 本文讲解 Oracle 19C 环境通过 Duplicate 在线复制搭建单机 Active DataGuard 的完整步骤,以下为测试环境信息: 角色主机名IP地址数据库版本实例名DB名DB_UNIQUE名services名TNS名sys密码主lucifer10.211.55.20019CoradboradboradboradbORADB_PRIoracle备luciferdg…...

LeetCode 0070. 爬楼梯:动态规划(递推)

【LetMeFly】70.爬楼梯&#xff1a;动态规划&#xff08;递推&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/climbing-stairs/ 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#x…...

XMemcached network layout exception java.nio.channels.ClosedChannelException

java.nio.channels.ClosedChannelException 表示尝试在已关闭的通道上进行 I/O 操作&#xff0c;通常发生在网络连接意外关闭后尝试在关闭的通道上执行读取或写入操作。 XMemcached network layout exception 可能是由于 XMemcached 客户端在尝试与 Memcached 服务器通信时发生…...

记录 | vscode pyhton c++调试launch.json配置

下面提供 vscode 中 python 和 c 调试配置的 launch.json (好用&#xff0c;已用好几年&#xff0c;建议收藏) {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息&#xff0c;请访问: https://go.microsoft.com/fwlink/?linkid830387&qu…...

Java入门基础:浅显易懂 死循环

文章目录 一、什么是死循环二、以fo循环示例三、如何避免死循环 一、什么是死循环 死循环就是循环语句的 循环布尔表达式 一直为true&#xff0c;没有终止循环的条件或者终止循环的条件根本不可能达成 二、以fo循环示例 /** 终止循环的条件根本不可能达成* 循环布尔表达式&a…...

LeetCode刷题--- 验证二叉搜索树

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 http://t.csdnimg.cn/ZxuNL个人专栏&#xff1a;力扣递归算法题 http://t.csdnimg.cn/ZxuNL 【C】 http://t.csdnimg.cn/c9twt 前言&#xff1a;这个专栏主要讲述递归递归、搜索与回溯算法&#x…...

go-zero 开发入门-加法客服端示例

定义 RPC 接口文件 接口文件 add.proto 的内容如下&#xff1a; syntax "proto3"; package add;// 当 protoc-gen-go 版本大于 1.4.0 时需加上 go_package&#xff0c;否则编译报错“unable to determine Go import path for” option go_package "./add&qu…...

Python 快速入门——基础语法

python 的语法逻辑完全靠缩进&#xff0c;建议缩进 4 个空格。 如果是顶级代码&#xff0c;那么必须顶格书写&#xff0c;哪怕只有一个空格也会有语法错误。 下面示例中&#xff0c;满足 if 条件要输出两行内容&#xff0c;这两行内容必须都缩进&#xff0c;而且具有相同的缩进…...

EasyRecovery2024苹果电脑mac破解版安装包下载

EasyRecovery是一款操作安全、价格便宜、用户自主操作的非破坏性的只读应用程序&#xff0c;它不会往源驱上写任何东西&#xff0c;也不会对源驱做任何改变。它支持从各种各样的存储介质恢复删除或者丢失的文件&#xff0c;其支持的媒体介质包括&#xff1a;硬盘驱动器、光驱、…...

Git常用命令大全

1.强制推送&#xff08;慎用&#xff0c;除非你认为其他冲突等可以丢弃 或者不是很重要&#xff09; git push -- force2.创建文件等小命令 touch a // 创建一个a文件 echo 1234 >> a // 把1234这个内容放入a文件 cat a // 打开a文件 读取出a文件中的内容 mkdir test /…...

vue项目本地正常运行,打包到线上时无法访问js等资源

nginx配置错误&#xff0c;如&#xff1a; location /aaa/ {gzip on;gzip_static on;try_files $uri $uri/ /aaa/index.html;alias /home/ec2-user/data/aaa/;#这里必须以斜杆结束&#xff0c;否则就会报错}前端配置文件错误&#xff0c;如&#xff1a; config/index.js文件的b…...

计网Lesson10 - 网络层之IP协议分析

文章目录 网络层协议IPv4 数据报格式IPv4 数据报首部格式版本&#xff08;Version&#xff09;首部长度&#xff08;Header Length&#xff09;区分服务&#xff08;Differentiated Services Field&#xff09;可选字段填充总长度&#xff08;Total Length&#xff09;标识、标…...

DLSS Swapper终极指南:三大智能矩阵,重新定义游戏性能优化

DLSS Swapper终极指南&#xff1a;三大智能矩阵&#xff0c;重新定义游戏性能优化 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否曾为游戏卡顿而烦恼&#xff1f;当最新的3A大作在4K分辨率下帧率骤降&#xff0…...

RAG集成:如何让你的企业知识库成为AI的“长期记忆”

核心命题&#xff1a;AI没有记忆&#xff0c;但你的知识库可以成为它的“外脑”。RAG&#xff08;检索增强生成&#xff09;是GEO的终极形态&#xff1a;让企业私有数据成为AI生成答案的唯一信源。引言&#xff1a;老陈的新困境——当AI“看见”了你的店&#xff0c;却“看不见…...

利用Qwen3-14B-AWQ优化数据库课程设计:智能ER图生成与SQL语句优化

利用Qwen3-14B-AWQ优化数据库课程设计&#xff1a;智能ER图生成与SQL语句优化 1. 课程设计的痛点与解决方案 每到数据库课程设计阶段&#xff0c;学生们总会遇到相似的困扰&#xff1a;面对一个模糊的业务需求&#xff0c;如何准确识别实体和关系&#xff1f;如何设计规范的数…...

选AI面试软件,为何一定要看中防作弊、可解释、全场景?

想象一下&#xff1a;你花了半个月筛选简历&#xff0c;终于确定了100个面试候选人&#xff0c;却发现一半人在用AI生成器写答案、用提词器念稿&#xff0c;甚至找人替考&#xff1b;好不容易拿到AI评分&#xff0c;却看不懂分数怎么来的&#xff0c;候选人质疑时你根本没法解释…...

PlugY终极指南:暗黑破坏神2单机模式完全解放方案

PlugY终极指南&#xff1a;暗黑破坏神2单机模式完全解放方案 【免费下载链接】PlugY PlugY, The Survival Kit - Plug-in for Diablo II Lord of Destruction 项目地址: https://gitcode.com/gh_mirrors/pl/PlugY 还在为暗黑破坏神2单机模式的储物箱空间不足而烦恼吗&am…...

OpenClaw+Qwen3-14b_int4_awq自动化写作:从资料收集到排版发布

OpenClawQwen3-14b_int4_awq自动化写作&#xff1a;从资料收集到排版发布 1. 为什么需要自动化写作工作流 作为一个技术博主&#xff0c;我经常面临这样的困境&#xff1a;明明有大量想分享的内容&#xff0c;却总被繁琐的写作流程拖累。从资料收集、大纲梳理到内容生成和格式…...

深求·墨鉴(DeepSeek-OCR-2)惊艳效果:书法题跋+钤印位置+行气关系可视化还原

深求墨鉴&#xff08;DeepSeek-OCR-2&#xff09;惊艳效果&#xff1a;书法题跋钤印位置行气关系可视化还原 1. 引言&#xff1a;当OCR遇见水墨美学 你有没有遇到过这样的场景&#xff1f;面对一幅珍贵的书法作品或古籍文献&#xff0c;想要将其中的文字内容数字化&#xff0…...

从洛伦兹吸引子到三体问题:用Python RK45方法探索混沌与天体物理的奇妙世界

从洛伦兹吸引子到三体问题&#xff1a;用Python RK45方法探索混沌与天体物理的奇妙世界 混沌系统与天体运动看似毫不相关&#xff0c;却共享着对初始条件极度敏感的数学本质。1963年&#xff0c;气象学家爱德华洛伦兹在简化大气对流模型时&#xff0c;意外发现了"蝴蝶效应…...

视频SEO软件对网站流量有什么影响

视频SEO软件对网站流量有什么影响 在当今数字化时代&#xff0c;网站流量的获取和管理是每一个网站运营者关注的重点。而视频SEO软件作为一种现代化的工具&#xff0c;在提升网站流量方面扮演着重要角色。视频SEO软件究竟对网站流量有什么影响呢&#xff1f;我们将从问题分析、…...

雪花算法:分布式世界的“身份证号”

嘿&#xff0c;朋友&#xff01;想象一下&#xff0c;你是一家拥有几千台服务器的互联网大厂架构师。现在有个小麻烦&#xff1a;你的订单系统每秒钟要生成几万个订单号。如果让数据库自己搞&#xff08;自增ID&#xff09;&#xff0c;几台数据库凑在一起&#xff0c;肯定会出…...