12038陌 发表于 2025-11-2 03:41:01

PDF权限密码解密工具





import os
import tkinter as tk
from tkinter import filedialog, messagebox, ttk
from PyPDF2 import PdfReader, PdfWriter


class 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) + "_解密.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

寒哥Gh61ac8 发表于 2025-11-2 03:41:28

https://wwai.lanzouu.com/in5kp30j7k7c
密码:a4ps

上个蓝奏吧,这毒盘下着难受

寒哥Gh61ac8 发表于 2025-11-2 03:42:08

这个起到个什么作用了,我知道密码不就自己打开了吗?

寒哥Gh61ac8 发表于 2025-11-2 03:43:01

能直接打开的PDF,但是提示未提供密码

寒哥Gh61ac8 发表于 2025-11-2 03:43:39

没作用啊

huoxianghui913 发表于 2025-11-2 03:43:59

谢谢分享作品

风之影赫 发表于 2025-11-2 03:44:12

这个软件是暴破吗?没有密码也可以?

huoxianghui913 发表于 2025-11-2 03:44:26

简单有效,图形界面,很好。今日论坛两人都在发pdf密码解除工具,都很赞!

huoxianghui913 发表于 2025-11-2 03:44:52

遇到一个PDF,有签名加密,用这软件解密时候提示要我输入密码,可是并没有密码。

风之影赫 发表于 2025-11-2 03:45:35

简单有效,感谢分享优秀软件。
页: [1] 2
查看完整版本: PDF权限密码解密工具