累计签到:1 天 连续签到:1 天
|

[Python] 纯文本查看 复制代码import osimport tkinter as tkfrom tkinter import filedialog, messagebox, ttkfrom PyPDF2 import PdfReader, PdfWriterclass PDFDecrypterApp: def __init__(self, root): self.root = root self.root.title("PDF权限密码解密工具") self.root.geometry("600x400") self.root.resizable(True, True) # 设置中文字体支持 self.root.option_add("*Font", "SimHei 10") # 创建主框架 main_frame = ttk.Frame(root, padding="20") main_frame.pack(fill=tk.BOTH, expand=True) # 文件选择区域 ttk.Label(main_frame, text="源文件:").grid(row=0, column=0, sticky=tk.W, pady=5) self.source_file_var = tk.StringVar() ttk.Entry(main_frame, textvariable=self.source_file_var, width=50).grid(row=0, column=1, pady=5) ttk.Button(main_frame, text="浏览...", command=self.browse_source_file).grid(row=0, column=2, padx=5, pady=5) ttk.Label(main_frame, text="输出文件:").grid(row=1, column=0, sticky=tk.W, pady=5) self.output_file_var = tk.StringVar() ttk.Entry(main_frame, textvariable=self.output_file_var, width=50).grid(row=1, column=1, pady=5) ttk.Button(main_frame, text="浏览...", command=self.browse_output_file).grid(row=1, column=2, padx=5, pady=5) # 密码区域 ttk.Label(main_frame, text="打开密码(如果有):").grid(row=2, column=0, sticky=tk.W, pady=5) self.password_var = tk.StringVar() ttk.Entry(main_frame, textvariable=self.password_var, show="*", width=50).grid(row=2, column=1, pady=5) # 解密按钮 self.decrypt_button = ttk.Button(main_frame, text="开始解密", command=self.decrypt_pdf) self.decrypt_button.grid(row=3, column=1, pady=20) # 状态区域 ttk.Label(main_frame, text="状态:").grid(row=4, column=0, sticky=tk.W, pady=5) self.status_var = tk.StringVar() self.status_var.set("就绪") ttk.Label(main_frame, textvariable=self.status_var, anchor=tk.W).grid(row=4, column=1, sticky=tk.W, pady=5) # 进度条 self.progress_var = tk.DoubleVar() self.progress_bar = ttk.Progressbar(main_frame, variable=self.progress_var, length=100, mode='indeterminate') self.progress_bar.grid(row=5, column=1, sticky=tk.W + tk.E, pady=5) # 日志区域 ttk.Label(main_frame, text="操作日志:").grid(row=6, column=0, sticky=tk.NW, pady=5) self.log_text = tk.Text(main_frame, height=10, width=70) self.log_text.grid(row=6, column=1, pady=5) scrollbar = ttk.Scrollbar(main_frame, command=self.log_text.yview) scrollbar.grid(row=6, column=2, sticky=tk.N + tk.S) self.log_text.config(yscrollcommand=scrollbar.set) # 配置网格权重,使界面可伸缩 main_frame.columnconfigure(1, weight=1) main_frame.rowconfigure(6, weight=1) # 日志记录 self.log("欢迎使用PDF权限密码解密工具") self.log("请选择需要解密的PDF文件并设置输出路径") def browse_source_file(self): filename = filedialog.askopenfilename( title="选择PDF文件", filetypes=[("PDF文件", "*.pdf"), ("所有文件", "*.*")] ) if filename: self.source_file_var.set(filename) # 自动填充输出文件名 if not self.output_file_var.get(): output_file = os.path.splitext(filename)[0] + "_解密.pdf" self.output_file_var.set(output_file) def browse_output_file(self): filename = filedialog.asksaveasfilename( title="保存解密后的PDF文件", defaultextension=".pdf", filetypes=[("PDF文件", "*.pdf"), ("所有文件", "*.*")] ) if filename: self.output_file_var.set(filename) def log(self, message): """添加日志信息到日志区域""" self.log_text.insert(tk.END, message + "\n") self.log_text.see(tk.END) def decrypt_pdf(self): """执行PDF解密操作""" source_file = self.source_file_var.get() output_file = self.output_file_var.get() password = self.password_var.get() # 验证输入 if not source_file: messagebox.showerror("错误", "请选择源PDF文件") return if not output_file: messagebox.showerror("错误", "请设置输出文件路径") return if not os.path.exists(source_file): messagebox.showerror("错误", f"源文件不存在: {source_file}") return try: # 更新状态 self.status_var.set("正在解密...") self.progress_bar.start() self.decrypt_button.config(state=tk.DISABLED) self.root.update() self.log(f"开始处理: {source_file}") self.log(f"输出文件: {output_file}") # 执行解密 with open(source_file, 'rb') as file: reader = PdfReader(file) # 检查是否加密 if reader.is_encrypted: self.log("检测到PDF已加密") if password: self.log("使用提供的密码尝试解密...") if not reader.decrypt(password): self.log("错误: 提供的密码不正确") messagebox.showerror("错误", "提供的密码不正确") return else: self.log("错误: PDF需要密码才能打开,但未提供密码") messagebox.showerror("错误", "PDF需要密码才能打开,但未提供密码") return # 创建写入器 writer = PdfWriter() # 获取总页数 total_pages = len(reader.pages) self.log(f"PDF总页数: {total_pages}") # 添加所有页面到写入器 for i, page in enumerate(reader.pages): writer.add_page(page) # 更新进度 progress = (i + 1) / total_pages * 100 self.progress_var.set(progress) self.root.update() # 移除权限限制 writer.encrypt("", use_128bit=True) # 写入新文件 with open(output_file, 'wb') as output_file_obj: writer.write(output_file_obj) self.log("成功: PDF权限已解除") self.status_var.set("解密完成") messagebox.showinfo("成功", f"PDF权限已解除\n文件已保存至: {output_file}") except Exception as e: self.log(f"错误: 处理PDF时发生异常 - {str(e)}") self.status_var.set("处理失败") messagebox.showerror("错误", f"处理PDF时发生异常:\n{str(e)}") finally: self.progress_bar.stop() self.decrypt_button.config(state=tk.NORMAL)if __name__ == "__main__": root = tk.Tk() app = PDFDecrypterApp(root) root.mainloop()
通过网盘分享的文件:PDF权限密码解密工具.exe
链接: https://pan.Baidu.com/s/1PXujLuPGcH4bONhv_FJjmQ?pwd=52pj 提取码: 52pj |
测量协会论坛免责声明
重要声明:以上内容仅代表该作者观点,不代表本站测量协会论坛立场。
如有涉及侵权请尽快告知,我们将会在第一时间处理。作者原创内容未经允许不得转载!
站长联系邮箱:1339305021@qq.com
站长联系微信:dddnnbbb
|