设为首页收藏本站

 找回密码
 立即注册

只需一步,快速开始

搜索
查看: 145|回复: 15

PDF权限密码解密工具

 火.. [复制链接]
累计签到:17 天
连续签到:11 天
灌水成绩
12
22
3004
主题
帖子
积分

等级头衔

ID : 610

初级技术员

积分成就 测量币 : 3004
在线时间 : 0 小时
注册时间 : 2026-4-19
最后登录 : 2026-5-18

勋章
UID勋章测量学徒测量员
发表于 2026-4-14 19:07:57 | 显示全部楼层 |阅读模式 IP:广东东莞



[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
累计签到:14 天
连续签到:8 天
灌水成绩
1
163
12884
主题
帖子
积分

等级头衔

ID : 566

高级技术员

积分成就 测量币 : 12884
在线时间 : 0 小时
注册时间 : 2026-1-23
最后登录 : 2026-5-18

勋章
UID勋章测量学徒测量员
发表于 2026-4-14 21:44:49 | 显示全部楼层 IP:河南郑州
图文搭配很好,理解更快。
回复

使用道具 举报

累计签到:11 天
连续签到:4 天
灌水成绩
2
151
11667
主题
帖子
积分

等级头衔

ID : 555

高级技术员

积分成就 测量币 : 11667
在线时间 : 0 小时
注册时间 : 2025-12-30
最后登录 : 2026-5-19

勋章
UID勋章测量学徒测量员
发表于 2026-4-15 03:45:42 | 显示全部楼层 IP:美国
希望以后多分享这类实战经验。
回复

使用道具 举报

累计签到:17 天
连续签到:11 天
灌水成绩
0
139
9624
主题
帖子
积分

等级头衔

ID : 551

中级技术员

积分成就 测量币 : 9624
在线时间 : 0 小时
注册时间 : 2025-12-17
最后登录 : 2026-4-3

勋章
UID勋章测量学徒测量员
发表于 2026-4-26 10:27:39 | 显示全部楼层 IP:英国
对我帮助很大,解决了卡了很久的问题。
回复

使用道具 举报

累计签到:18 天
连续签到:5 天
灌水成绩
0
161
13278
主题
帖子
积分

等级头衔

ID : 539

高级技术员

积分成就 测量币 : 13278
在线时间 : 0 小时
注册时间 : 2026-2-19
最后登录 : 2026-5-20

勋章
UID勋章测量学徒测量员
发表于 2026-4-27 03:05:12 | 显示全部楼层 IP:美国
看完这篇终于搞懂原理了。
回复

使用道具 举报

累计签到:15 天
连续签到:2 天
灌水成绩
0
166
13066
主题
帖子
积分

等级头衔

ID : 523

高级技术员

积分成就 测量币 : 13066
在线时间 : 0 小时
注册时间 : 2026-2-17
最后登录 : 2026-5-17

勋章
UID勋章测量学徒测量员
发表于 2026-4-30 02:09:19 | 显示全部楼层 IP:广东东莞
内容很前沿,紧跟技术趋势。
回复

使用道具 举报

累计签到:20 天
连续签到:2 天
灌水成绩
0
184
14001
主题
帖子
积分

等级头衔

ID : 590

高级技术员

积分成就 测量币 : 14001
在线时间 : 0 小时
注册时间 : 2026-2-25
最后登录 : 2026-4-5

勋章
UID勋章测量学徒测量员
发表于 2026-4-30 02:09:19 | 显示全部楼层 IP:广东东莞
博主经验丰富,写得很靠谱。
回复

使用道具 举报

累计签到:15 天
连续签到:9 天
灌水成绩
2
178
14484
主题
帖子
积分

等级头衔

ID : 535

高级技术员

积分成就 测量币 : 14484
在线时间 : 0 小时
注册时间 : 2026-2-19
最后登录 : 2026-5-18

勋章
UID勋章测量学徒测量员
发表于 2026-4-30 02:09:19 | 显示全部楼层 IP:广东东莞
对项目实战很有指导意义。
回复

使用道具 举报

累计签到:16 天
连续签到:4 天
灌水成绩
0
136
10145
主题
帖子
积分

等级头衔

ID : 513

高级技术员

积分成就 测量币 : 10145
在线时间 : 0 小时
注册时间 : 2026-1-25
最后登录 : 2026-5-18

勋章
UID勋章测量学徒测量员
发表于 2026-5-1 01:10:33 | 显示全部楼层 IP:广东东莞
内容很扎实,经得起推敲。
回复

使用道具 举报

累计签到:18 天
连续签到:5 天
灌水成绩
1
157
12145
主题
帖子
积分

等级头衔

ID : 508

高级技术员

积分成就 测量币 : 12145
在线时间 : 0 小时
注册时间 : 2026-3-30
最后登录 : 2026-5-19

勋章
UID勋章测量学徒测量员
发表于 2026-5-1 01:10:33 | 显示全部楼层 IP:广东东莞
案例典型,容易理解。
回复

使用道具 举报

快速回复换一批
好贴支持!
路过留名
马克一下
2333333333
楼主好人一生平安
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|精密测量技术论坛 ( 桂ICP备2026007449号-1 )

GMT+8, 2026-5-21 12:48 , Processed in 0.911677 second(s), 31 queries .

快速回复 返回顶部 返回列表