跳转至

使用python制作一个Pdf解密工具

本地环境

  • python 3.10.5

主要代码

  • 创建主核心文件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()
  • 所需依赖模块requirements.txt
PyPDF2==3.0.1
pyinstaller==6.16.0
pycryptodome==3.23.0
  • 创建打包脚本文件build.py
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

运行打包命令

python build.py