使用 wxPython 和 pymupdf进行 PDF 加密
PDF 文件是一种常见的文档格式,但有时候我们希望对敏感信息进行保护,以防止未经授权的访问。在本文中,我们将使用 Python 和 wxPython 库创建一个简单的图形用户界面(GUI)应用程序,用于对 PDF 文件进行加密。
C:\pythoncode\new\PDFEncrypt.py


准备工作
在开始之前,请确保已经安装了以下库:
- wxPython:在命令行中运行
pip install wxPython进行安装 - PyMuPDF(也称为 fitz):在命令行中运行
pip install PyMuPDF进行安装
创建 GUI 应用程序
我们将使用 wxPython 库创建 GUI 应用程序。首先,导入必要的库:
import wx
import fitz
接下来,创建一个主窗口类 MainFrame,继承自 wx.Frame 类:
class MainFrame(wx.Frame):def __init__(self):super().__init__(None, title="PDF Encryption", size=(400, 200))panel = wx.Panel(self)# 创建文件选择器self.file_picker = wx.FilePickerCtrl(panel, message="Select a PDF file", style=wx.FLP_USE_TEXTCTRL)# 创建密码输入框self.password_text = wx.TextCtrl(panel, style=wx.TE_PASSWORD)# 创建加密按钮encrypt_button = wx.Button(panel, label="Encrypt")encrypt_button.Bind(wx.EVT_BUTTON, self.on_encrypt_button)# 使用布局管理器设置组件的位置和大小sizer = wx.BoxSizer(wx.VERTICAL)sizer.Add(wx.StaticText(panel, label="PDF File:"), 0, wx.ALL, 5)sizer.Add(self.file_picker, 0, wx.EXPAND | wx.ALL, 5)sizer.Add(wx.StaticText(panel, label="Password:"), 0, wx.ALL, 5)sizer.Add(self.password_text, 0, wx.EXPAND | wx.ALL, 5)sizer.Add(encrypt_button, 0, wx.ALIGN_CENTER | wx.ALL, 5)panel.SetSizerAndFit(sizer)
以上代码创建了一个带有文件选择器、密码输入框和加密按钮的主窗口。
接下来,添加处理加密按钮点击事件的方法 on_encrypt_button:
class MainFrame(wx.Frame):# ...def on_encrypt_button(self, event):filepath = self.file_picker.GetPath()password = self.password_text.GetValue()if filepath and password:try:doc = fitz.open(filepath)doc.encrypt(password)encrypted_filepath = filepath.replace(".pdf", "_encrypted.pdf")doc.save(encrypted_filepath)doc.close()wx.MessageBox("PDF file encrypted successfully!", "Success", wx.OK | wx.ICON_INFORMATION)except Exception as e:wx.MessageBox(f"An error occurred: {str(e)}", "Error", wx.OK | wx.ICON_ERROR)else:wx.MessageBox("Please select a PDF file and enter a password.", "Error", wx.OK | wx.ICON_ERROR)
在 on_encrypt_button 方法中,我们获取用户选择的 PDF 文件路径和输入的密码。然后,使用 PyMuPDF 库打开 PDF 文件,对其进行加密并保存加密后的文件。
最后,创建一个应用程序类 App,并运行主循环:
class App(wx.App):def OnInit(self):frame = MainFrame()frame.Show()return Trueif __name__ == "__main__":app = App()app.MainLoop()
以上代码创建了一个应用程序类 App,并在 if __name__ == "__main__": 代码块中运行应用程序的主循环。
运行应用程序
保存上述代码为 pdf_encryption.py 文件,然后在命令行中运行 python pdf_encryption.py。应用程序窗口将打开,您可以选择一个 PDF 文件并输入密码来加密它。
全部代码
import wx
import fitzclass MainFrame(wx.Frame):def __init__(self):super().__init__(None, title="PDF Encryption", size=(400, 200))panel = wx.Panel(self)self.file_picker = wx.FilePickerCtrl(panel, message="Select a PDF file", style=wx.FLP_USE_TEXTCTRL)self.password_text = wx.TextCtrl(panel, style=wx.TE_PASSWORD)encrypt_button = wx.Button(panel, label="Encrypt")encrypt_button.Bind(wx.EVT_BUTTON, self.on_encrypt_button)sizer = wx.BoxSizer(wx.VERTICAL)sizer.Add(wx.StaticText(panel, label="PDF File:"), 0, wx.ALL, 5)sizer.Add(self.file_picker, 0, wx.EXPAND | wx.ALL, 5)sizer.Add(wx.StaticText(panel, label="Password:"), 0, wx.ALL, 5)sizer.Add(self.password_text, 0, wx.EXPAND | wx.ALL, 5)sizer.Add(encrypt_button, 0, wx.ALIGN_CENTER | wx.ALL, 5)panel.SetSizerAndFit(sizer)def on_encrypt_button(self, event):filepath = self.file_picker.GetPath()password = self.password_text.GetValue()if filepath and password:try:doc = fitz.open(filepath)# doc.encrypt(password)perm = int(fitz.PDF_PERM_ACCESSIBILITY # always use this| fitz.PDF_PERM_PRINT # permit printing| fitz.PDF_PERM_COPY # permit copying| fitz.PDF_PERM_ANNOTATE # permit annotations) # 可以打印,复制,添加注释 owner_pass = "owner" # owner passworduser_pass = password # "user" # user passwordencrypt_meth = fitz.PDF_ENCRYPT_AES_256 # strongest algorithmencrypted_filepath = filepath.replace(".pdf", "_encrypted.pdf")# doc.save(encrypted_filepath)doc.save(encrypted_filepath,encryption=encrypt_meth,owner_pw=owner_pass,permissions=perm,user_pw=user_pass) # doc.save(encrypted_filepath)doc.close()wx.MessageBox("PDF file encrypted successfully!", "Success", wx.OK | wx.ICON_INFORMATION)except Exception as e:wx.MessageBox(f"An error occurred: {str(e)}", "Error", wx.OK | wx.ICON_ERROR)else:wx.MessageBox("Please select a PDF file and enter a password.", "Error", wx.OK | wx.ICON_ERROR)class App(wx.App):def OnInit(self):frame = MainFrame()frame.Show()return Trueif __name__ == "__main__":app = App()app.MainLoop()
总结
本文介绍了如何使用 Python 和 wxPython 库创建一个简单的图形用户界面应用程序,用于对 PDF 文件进行加密。通过选择 PDF 文件和输入密码,您可以加密 PDF 文件以保护其内容的安全性。
相关文章:
使用 wxPython 和 pymupdf进行 PDF 加密
PDF 文件是一种常见的文档格式,但有时候我们希望对敏感信息进行保护,以防止未经授权的访问。在本文中,我们将使用 Python 和 wxPython 库创建一个简单的图形用户界面(GUI)应用程序,用于对 PDF 文件进行加密…...
Mysql性能优化:什么是索引下推?
导读 索引下推(index condition pushdown )简称ICP,在Mysql5.6的版本上推出,用于优化查询。 在不使用ICP的情况下,在使用非主键索引(又叫普通索引或者二级索引)进行查询时,存储引擎…...
Pytorch建立MyDataLoader过程详解
简介 torch.utils.data.DataLoader(dataset, batch_size1, shuffleNone, samplerNone, batch_samplerNone, num_workers0, collate_fnNone, pin_memoryFalse, drop_lastFalse, timeout0, worker_init_fnNone, multiprocessing_contextNone, generatorNone, *, prefetch_factorN…...
十问华为云 Toolkit:开发插件如何提升云上开发效能
众所周知,桌面集成开发环境(IDE)已经融入到开发的各个环节,对开发者的重要性和广泛度是不言而喻的,而开发插件更是建立在IDE基础上的功能Buff。 Huawei Cloud ToolKit作为华为云围绕其产品能力向开发者桌面上的延伸&a…...
NO.06 自定义映射resultMap
1、前言 在之前的博客中,实体类的属性名和数据库表的字段名是一致的,因此能正确地查询出所需要的数据。当实体类的属性名与数据库表的字段名不一致时,会导致查询出来的数据为空指针。要解决这个问题就需要使用resultMap自定义映射。 使用的…...
国产精品:讯飞星火最新大模型V2.0
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…...
网络综合布线实训室方案(2023版)
综合布线实训室概述 随着智慧城市的蓬勃发展,人工智能、物联网、云计算、大数据等新兴行业也随之崛起,网络布线系统作为现代智慧城市、智慧社区、智能建筑、智能家居、智能工厂和现代服务业的基础设施和神经网络,发挥着重要作用。实践表明,网络系统故障的70%发生在布线系统,直接…...
Qt应用开发(基础篇)——文本编辑窗口 QTextEdit
一、前言 QTextEdit类继承于QAbstractScrollArea,QAbstractScrollArea继承于QFrame,用来显示富文本和纯文本的窗口部件。 框架类 QFramehttps://blog.csdn.net/u014491932/article/details/132188655滚屏区域基类 QAbstractScrollAreahttps://blog.csdn…...
NineData中标移动云数据库传输项目(2023)
近日,玖章算术NineData智能数据管理平台成功中标《2023年移动云数据库传输服务软件项目》,中标金额为406万。这标志着玖章算术NineData平台已成功落地顶级运营商行业,并在数据管理方面实现了大规模应用实践。 NineData中标2023移动云数据库传…...
Java面向对象三大特性之多态及综合练习
1.1 多态的形式 多态是继封装、继承之后,面向对象的第三大特性。 多态是出现在继承或者实现关系中的。 多态体现的格式: 父类类型 变量名 new 子类/实现类构造器; 变量名.方法名(); 多态的前提:有继承关系,子类对象是可以赋…...
HTTPS 握手过程
HTTPS 握手过程 HTTP 通信的缺点 通信使用明文,内容可能被窃听(重要密码泄露)不验证通信方身份,有可能遭遇伪装(跨站点请求伪造)无法证明报文的完整性,有可能已遭篡改(运营商劫持) HTTPS 握手过程 客户端发起 HTTPS 请求 用户在浏览器里…...
docker之Consul环境的部署
目录 一.Docker consul的介绍 1.1template模板(更新) 1.2registrator(自动发现) 1.3agent(代理) 二.consul的工作原理 三.Consul的特性 四.Consul的使用场景 五.搭建Consul的集群 5.1需求 5.2部署consul 5.3主服务器[192.168.40.20] 5.4client部署&…...
服务机器人,正走向星辰大海
大数据产业创新服务媒体 ——聚焦数据 改变商业 国内机器人联盟(IFR)将机器人划分为工作机器人、服务机器人、特种机器人三类。服务机器人广泛应用于餐饮场景、酒店场景,早已构成一道靓丽的风景。行业数据显示, 作为服务机器人发…...
SciencePub学术 | 计算机及交叉类重点SCIE征稿中
SciencePub学术 刊源推荐: 计算机及交叉类重点SCIE征稿中!信息如下,录满为止: 一、期刊概况: 计算机土地类重点SCIE 【期刊简介】IF:1.0-1.5,JCR4区,中科院4区; 【版面类型】正刊…...
Java面试题--SpringCloud篇
一、Spring Cloud 1. 什么是微服务架构? 微服务架构就是将单体的应用程序分成多 个应用程序,这多个应用程序就成为微服 务,每个微服务运行在自己的进程中,并 使用轻量级的机制通信 这些服务围绕业务能力来分,并通过自…...
【linux】常用的互斥手段及实例简述
文章目录 10. 原子变量(atomic_t)20. 自旋锁(spinlock_t)21. 读写锁(rwlock_t)22. 顺序锁(seqlock_t) 10. 原子变量(atomic_t) 头文件 #include <linux/types.h> // -> <linuc/atomic.h> // -> <asm-generic/atomic64.h>结构体 /* 32bit */ typedef …...
STM32 F103C8T6学习笔记12:红外遥控—红外解码-位带操作
今日学习一下红外遥控的解码使用,红外遥控在日常生活必不可少,它的解码与使用也是学习单片机的一个小过程,我们将通过实践来实现它。 文章提供源码、测试工程下载、测试效果图。 目录 红外遥控原理: 红外遥控特点: …...
linux 环境收集core文件步骤
Linux环境下进程发生异常而挂掉,通常很难查找原因,但是一般Linux内核给我们提供的核心文件,记录了进程在崩溃时候的信息,在C语言类的大型项目中,有助于深入定位。其配置流程如下: 1 查看生成core文件开关是…...
Git企业开发控制理论和实操-从入门到深入(一)|为什么需要Git|Git的安装
前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。 高质量博客汇总https://blog.csdn.net/yu_cblog/cate…...
上篇——税收大数据应用研究
财税是国家治理的基础和重要支柱,税收是国家治理体系的重要组成部分。我们如何利用税收数据深入挖掘包含的数据价值,在进行数据分析,提升税收治理效能,推进税收现代化。 1. 定义与特点 对于“大数据”(Big data&#…...
Cesium使用
Cesium官网:https://cesiumjs.org 官方API文档:https://cesium.com/learn/ion-sdk/ref-doc 中文API文档:https://cesium.xin/cesium/cn/Documentation1.95 https://cesium.xin Cesium中文社区:http://cesiumcn.org …...
达摩院PALM春联模型多场景落地:政务大厅自助春联机解决方案
达摩院PALM春联模型多场景落地:政务大厅自助春联机解决方案 春节贴春联,是咱们中国人传承千年的文化习俗。一副好春联,不仅承载着对新年的美好祝愿,也体现着家庭的品味和格调。但你知道吗?现在写春联这件事࿰…...
c++ 字符大小写转化
#include <iostream> using namespace std;int main() {char a;cin >> a;//a-z-97-122//A-Z-65-90//差32//小写转大写 if(97<(int)a && (int)a<122){a(int)a-32;cout << a; return 0; }//大写转小写 if(65<(int)a && (int)a<90)…...
屠龙刀法35--使用SQL查询器批量生成insert语句
很多网友认为SQL查询器的语句不都是人工输入或者从外面粘贴进去的吗?用查询器批量生成Insert语句感觉有点魔幻哦。的确听起来不太科学,但是对于DBCS来说这个功能的确非常好用。下面我们就举例一步步告诉大家,如何使用这个功能。 第一步&…...
探索粗糙表面波动模型生成:打造不规则之美
粗糙表面,波动模型生成,用于在物体表面生成不规则的粗糙表面,或面表面的波动边界等,可自定义波动分布与赋值。在图形学和模拟领域,生成物体表面的粗糙质感或是波动边界常常是一个有趣又具有挑战性的任务。今天咱们就聊…...
如何实现精准歌词同步?KRC格式全解析与应用实践
如何实现精准歌词同步?KRC格式全解析与应用实践 【免费下载链接】KuGouMusicApi 酷狗音乐 Node.js API service 项目地址: https://gitcode.com/gh_mirrors/ku/KuGouMusicApi 在音乐应用开发中,歌词显示功能看似简单,实则隐藏着诸多技…...
OpenClaw技能开发入门:为百川2-13B量化模型定制自动化模块
OpenClaw技能开发入门:为百川2-13B量化模型定制自动化模块 1. 为什么选择OpenClaw开发技能? 去年冬天,我为了给团队搭建一个内部天气查询助手,尝试过至少三种不同的自动化方案。要么是API调用太复杂,要么是自然语言处…...
TinyMCE 5插件开发实战:手把手教你定制首行缩进功能(Vue版)
TinyMCE 5插件开发实战:手把手教你定制首行缩进功能(Vue版) 在内容创作领域,富文本编辑器的灵活性和扩展性往往决定了最终的用户体验。TinyMCE作为一款广受欢迎的富文本编辑器,其插件系统为开发者提供了无限可能。本文…...
2-1爬取豆瓣电影数据
数据来源网站:https://movie.douban.com/chart import requests import json import timedef fetch_douban():all_movies []start 0limit 20print("开始爬取豆瓣电影榜单")headers {"User-Agent": "Mozilla/5.0","Referer&…...
The Dark Art of Low-Light Enhancement: Why Retinex Models Don’t Need Handcrafted Priors Anymore
无先验约束的Retinex模型:PairLIE如何重塑低光增强技术范式 1. 低光增强的技术演进与当前挑战 在计算摄影领域,低光图像增强(Low-light Image Enhancement, LIE)一直是核心难题之一。传统方法主要依赖手工设计的先验知识ÿ…...
