使用python制作一个Pdf解密工具
本地环境
主要代码
- 创建主核心文件
pdf_decryptor_gui.py
import PyPDF2
import os
import tkinter as tk
from tkinter import filedialog, messagebox, ttk
class PDFDecryptor:
def __init__(self, root):
self.root = root
self.root.title("PDF 解密工具")
self.root.geometry("500x300")
self.root.resizable(False, False)
# 设置样式
self.style = ttk.Style()
self.style.configure('TLabel', font=('Arial', 10))
self.style.configure('TButton', font=('Arial', 10))
self.style.configure('TEntry', font=('Arial', 10))
# 创建界面元素
self.create_widgets()
def create_widgets(self):
# 标题
title_label = ttk.Label(self.root, text="PDF 文件解密工具", font=('Arial', 16, 'bold'))
title_label.pack(pady=20)
# 选择PDF文件
file_frame = ttk.Frame(self.root)
file_frame.pack(fill='x', padx=20, pady=10)
ttk.Label(file_frame, text="选择PDF文件:").grid(row=0, column=0, sticky='w', pady=5)
self.file_path = tk.StringVar()
ttk.Entry(file_frame, textvariable=self.file_path, width=40).grid(row=1, column=0, padx=(0, 10))
ttk.Button(file_frame, text="浏览", command=self.browse_file).grid(row=1, column=1)
# 进度条
self.progress = ttk.Progressbar(self.root, orient='horizontal', length=460, mode='determinate')
self.progress.pack(pady=20)
# 解密按钮
self.decrypt_btn = ttk.Button(self.root, text="解密PDF", command=self.decrypt_pdf)
self.decrypt_btn.pack(pady=10)
# 状态标签
self.status_label = ttk.Label(self.root, text="准备就绪", foreground='blue')
self.status_label.pack(pady=5)
def browse_file(self):
filename = filedialog.askopenfilename(
title="选择PDF文件",
filetypes=[("PDF文件", "*.pdf"), ("所有文件", "*.*")]
)
if filename:
self.file_path.set(filename)
def decrypt_pdf(self):
pdf_path = self.file_path.get()
if not pdf_path:
messagebox.showerror("错误", "请选择PDF文件")
return
if not os.path.exists(pdf_path):
messagebox.showerror("错误", "文件不存在")
return
try:
self.status_label.config(text="正在处理...", foreground='blue')
self.progress['value'] = 30
self.root.update_idletasks()
# 读取加密的PDF
with open(pdf_path, 'rb') as file:
pdf_reader = PyPDF2.PdfReader(file)
if not pdf_reader.is_encrypted:
messagebox.showinfo("信息", "该PDF文件未加密")
self.status_label.config(text="PDF未加密", foreground='orange')
self.progress['value'] = 0
return
if pdf_reader.is_encrypted:
pdf_reader.decrypt("")
self.progress['value'] = 60
self.root.update_idletasks()
# 创建新的PDF写入器
pdf_writer = PyPDF2.PdfWriter()
# 遍历PDF中的每一页
for page in range(len(pdf_reader.pages)):
pdf_writer.add_page(pdf_reader.pages[page])
self.progress['value'] = 80
self.root.update_idletasks()
# 保存解密后的PDF
output_path = pdf_path.replace('.pdf', '_decrypted.pdf')
# 保存去签名后的PDF
with open(output_path, 'wb') as out:
pdf_writer.write(out)
self.progress['value'] = 100
self.status_label.config(text=f"解密成功! 文件已保存为: {output_path}", foreground='green')
messagebox.showinfo("成功", f"PDF解密成功!\n保存为: {output_path}")
except Exception as e:
messagebox.showerror("错误", f"解密过程中出现错误: {str(e)}")
self.status_label.config(text=f"错误: {str(e)}", foreground='red')
self.progress['value'] = 0
if __name__ == "__main__":
root = tk.Tk()
app = PDFDecryptor(root)
root.mainloop()
PyPDF2==3.0.1
pyinstaller==6.16.0
pycryptodome==3.23.0
import PyInstaller.__main__
import os
# 定义应用程序名称和入口文件
app_name = "PDFDecryptor"
entry_file = "pdf_decryptor_gui.py" # 假设你的GUI代码保存在这个文件中
# PyInstaller 配置参数
params = [
entry_file, # 主程序文件
'--name=%s' % app_name, # 应用名称
'--onefile', # 打包成单个可执行文件
'--windowed', # 不显示控制台窗口(仅GUI)
'--icon=icon.ico', # 应用图标(如果有)
'--add-data=README.md;.', # 添加额外文件
'--clean', # 清理临时文件
'--noconfirm', # 覆盖输出目录而不确认
]
# 执行打包
PyInstaller.__main__.run(params)
安装所需模块
pip install -r requirements.txt
运行打包命令