吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 25555|回复: 603
上一主题 下一主题
收起左侧

[原创工具] 【更新v1.3添加界面】PDF权限密码解密

    [复制链接]
跳转到指定楼层
楼主
flt 发表于 2025-7-4 19:19 回帖奖励
本帖最后由 flt 于 2026-2-26 23:03 编辑

PDF权限密码解密

用途

批量或单个对权限加密的PDF进行解密,同时可以去除签名。

权限加密指的是禁止编辑、禁止打印等,无法对打开文件需要密码的情况解密。符合上述情况可无需密码直接解密

下载

v1.3.1
修复了特定PDF书签丢失。部分PDF处理中控制台会输出大量信息,请忽略(通常表明PDF非标)。

制作了界面,简化使用过程。支持书签。修复了一些bug。
v1.3:

[b]制作了安装包,添加了右键菜单启动
v1.1 https://flt.lanzouo.com/idU6e30aav6

v1.0: https://flt.lanzouo.com/iGZvA309qcyf

用法

如果临时使用,建议v1.3版本的界面版。
报毒说明:经反馈,360报毒,好像是因为nuitka打包导致,具体见查毒报告
您可以review 代码,并使用nuitka/pyinstaller和inno setup自行打包使用,或使用同类软件。

界面版

将文件或文件夹拖入界面即可。输出文件在同目录下文件名_decrypt.pdf处。
可以同时拖入多个文件,也可以点击界面打开任意文件。

安装版

  1. 选中PDF文件后右键点击移除权限
    单文件右键
  2. 或者在文件夹空白处右键点击移除PDF权限
  3. 或者右键文件夹移除PDF权限
  4. 或者将文件(多个文件也可以)或文件夹拖到v1.0.exe上即可,将在文件同一目录下生成_decrypt.pdf​文件。
    PixPin_2025-07-04_19-13-58

效果图

image

image

说明

因为代码简略,通过复制文件实现,因此文件较大时速度缓慢。
声明:ui代码由AI生成,经过谨慎的检测和测试,修复了所有发现的bug,并完成了代码的完全review,可以正常运行。
开源地址:https://github.com/flt6/tools/tree/master/pdf_unlock

免费评分

参与人数 176吾爱币 +168 热心值 +149 收起 理由
yuren008 + 1 + 1 我很赞同!
and11 + 1 + 1 谢谢@Thanks!
qianj250 + 1 + 1 我很赞同!
bryanh66 + 1 谢谢@Thanks!
rogergun + 1 + 1 好用,谢谢!
barry1204 + 1 + 1 谢谢@Thanks!
PriceXiao + 1 + 1 谢谢@Thanks!
gzodwn + 1 + 1 谢谢@Thanks!
huitailang12366 + 1 谢谢@Thanks!
Riv5663 + 1 + 1 谢谢@Thanks!
wdnmd6668848 + 1 + 1 热心回复!
mf_yanyan + 1 + 1 谢谢@Thanks!
tianxun + 1 + 1 我很赞同!
hao_jack + 1 + 1 谢谢@Thanks!
地缺天残 + 1 + 1 谢谢@Thanks!
luosaihuzi + 1 + 1 谢谢@Thanks!
michael163 + 1 感谢您的宝贵建议,我们会努力争取做得更好!
shaohan142 + 1 + 1 谢谢@Thanks!
Zbuter + 1 + 1 谢谢@Thanks!
liaoguiquan + 1 + 1 谢谢@Thanks!
franky988 + 1 我很赞同!
caqhoqsui + 1 + 1 我很赞同!
weixieyang + 1 + 1 谢谢@Thanks!
rain0997 + 1 用心讨论,共获提升!
xiaoyu942580 + 1 + 1 我很赞同!
haohai118 + 1 + 1 谢谢@Thanks!
AAA爱吃麻辣烫 + 1 + 1 热心回复!
hongye0 + 1 + 1 谢谢@Thanks!
lwd871209 + 1 + 1 我很赞同!
yhrake + 1 + 1 谢谢@Thanks!
jokerswift + 1 + 1 非常好用,谢谢@Thanks!
chenwei670 + 1 我很赞同!
aifhc + 1 + 1 用心讨论,共获提升!
sunny5888 + 1 谢谢@Thanks!
lyhjh + 1 + 1 谢谢@Thanks!
mooncity + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
intbin + 1 + 1 鼓励转贴优秀软件安全工具和文档!
spctiger + 1 + 1 我很赞同!
longfei998 + 1 + 1 谢谢@Thanks!
worldwom + 1 + 1 谢谢@Thanks!
lwkz9600 + 1 谢谢@Thanks!
ri12345 + 1 + 1 谢谢@Thanks!
zyw001 + 1 + 1 谢谢@Thanks!超级好用
sirsunny + 1 + 1 谢谢@Thanks!
yulong0502 + 1 + 1 谢谢@Thanks!
cnngtc + 2 + 1 用心讨论,共获提升!
池塘春草 + 1 谢谢@Thanks!
小师叔 + 1 + 1 用心讨论,共获提升!
Cleverwwh + 1 + 1 我很赞同!
xiaobao3636 + 1 + 1 我很赞同!
tntsnakern + 1 + 1 谢谢@Thanks!
秒针 + 1 + 1 我很赞同!
liujuran00 + 1 谢谢@Thanks!
胡言爱语 + 1 + 1 谢谢@Thanks!
zpzwz + 1 + 1 谢谢@Thanks!
yanshu168 + 1 + 1 用心讨论,共获提升!
litherward + 1 + 1 谢谢@Thanks!
dahan531 + 1 + 1 我很赞同!
掌中剑 + 1 + 1 我很赞同!
enjoylun + 1 + 1 用心讨论,共获提升!
发抖的小喵喵 + 1 + 1 热心回复!
LS888 + 1 我很赞同!
一个97小萌新 + 1 热心回复!
w40735211 + 1 + 1 谢谢@Thanks!
战国 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
midkr + 1 + 1 谢谢@Thanks!
xaibin + 1 + 1 谢谢@Thanks!
xyl52p + 1 用心讨论,共获提升!
AyanamiRei + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
702220068 + 1 + 1 谢谢@Thanks!
agendafailure + 1 + 1 我很赞同!
穿越你的灵魂 + 1 + 1 谢谢@Thanks!
tljwx + 1 + 1 热心回复!
jasonwjx + 1 谢谢@Thanks!
风子09 + 1 + 1 用心讨论,共获提升!
tou15022 + 1 + 1 谢谢@Thanks!
wanfen11 + 1 我很赞同!
jgyuanxuan + 1 + 1 我很赞同!
siaele + 1 + 1 谢谢@Thanks!
默小熙 + 1 + 1 用心讨论,共获提升!
jss0316 + 1 + 1 我很赞同!
moonrabbit + 1 + 1 谢谢@Thanks!
金神主 + 2 + 1 谢谢@Thanks!
q70611208 + 1 + 1 谢谢@Thanks!
AlexDrawn + 1 + 1 谢谢@Thanks!
dkw7546 + 1 + 1 用心讨论,共获提升!
tetrahedro + 1 + 1 感谢分享原理和代码实现
xtmpip + 1 谢谢@Thanks!
wangzhu3366 + 1 支持作者
TonaSmith + 1 热心回复!
ayu1314 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
ybbvtk1021 + 1 + 1 谢谢@Thanks!
清欢渡己 + 1 + 1 用心讨论,共获提升!
jupiter2008 + 1 + 1 谢谢@Thanks!
skjianw + 1 热心回复!
Mark2022 + 1 谢谢@Thanks!
hyeiz + 1 + 1 谢谢@Thanks!
likemememe + 1 谢谢@Thanks!
Issacclark1 + 1 谢谢@Thanks!
Lushness6726 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

来自 #
 楼主| flt 发表于 2025-8-2 23:53 |楼主
tianyu5654 发表于 2025-8-2 22:32
我系统是W11,也是闪退

烦请所有遇到闪退的坛友,先认真阅读帖子内容,确实使用方法正确后,带版本号回帖。
来自 #
symbx 发表于 2025-10-29 17:47
flt 发表于 2025-10-28 23:25
tkinter界面太丑又麻烦,Qt界面能做好看但python打包体积大。这种简单的方法体积大了得不偿失。
况且我 ...

目前这个版本,在我这里已经是极限了。22.3Mb,用的还是Nuitka打包的
https://wwpw.lanzoub.com/iSIyg39mtiif

免费评分

参与人数 1吾爱币 +2 热心值 +1 收起 理由
flt + 2 + 1 感谢制作界面和打包

查看全部评分

推荐
ljq0527 发表于 2025-7-4 22:45
我记得有两款软件分别是PDF Shaper和Advanced PDF Password Recovery可以破解加密且可以正常查看的PDF文件的。
推荐
 楼主| flt 发表于 2025-7-5 08:42 |楼主
Wodajunge666 发表于 2025-7-5 03:02
不需要跑字典破解密码,这是啥原理

PDF中维护了一个表,记录权限、权限密码、所有者密码。如果设置所有者密码,文件内容就被对等加密了,所以不可能解密。而如果只设置权限密码,那直接删除权限密码并将权限设为全部允许就可以了。
这种权限密码是靠软件自觉遵守ISO规范实现的。

免费评分

参与人数 6吾爱币 +7 热心值 +5 收起 理由
zpzwz + 1 + 1 谢谢@Thanks!
zw19901015 + 1 + 1 用心讨论,共获提升!
lep52 + 1 + 1 谢谢@Thanks!
huaihuai + 1 + 1 用心讨论,共获提升!
2658026667 + 2 谢谢@Thanks!
Wodajunge666 + 1 + 1 我很赞同!

查看全部评分

推荐
LDVE 发表于 2025-7-4 21:06
本帖最后由 LDVE 于 2025-7-4 21:08 编辑


实测 能够去掉了密码和签名。

增加2个bat文件实现程序右键菜单调用!


①用来添加右键菜单的bat,名称随意,我这里是【00_Add右键.bat
[Asm] 纯文本查看 复制代码
@Echo Off

rem HJ合集A名称设置,可修改
set "HJ=Max小工具"


set "np=PDF移除密码签名"
set "p=%cd%\%np%.bat"

Reg.exe add "HKEY_CLASSES_ROOT\*\shell\%HJ%" /f /v "SubCommands" /t REG_SZ /d ""
Reg.exe add "HKEY_CLASSES_ROOT\*\shell\%HJ%" /f /v "Icon" /t REG_SZ /d "imageres.dll,-5310"
Reg.exe add "HKEY_CLASSES_ROOT\*\shell\%HJ%" /v "Position" /t REG_SZ /d "Top" /f
Reg.exe add "HKEY_CLASSES_ROOT\*\shell\%HJ%\shell\%np%\command" /ve /t REG_SZ /d "cmd /c \"\"%p%\" \"%%V\"\"" /f

Reg.exe add "HKCR\Directory\shell\%HJ%" /f /v "SubCommands" /t REG_SZ /d ""
Reg.exe add "HKCR\Directory\shell\%HJ%" /f /v "Icon" /t REG_SZ /d "imageres.dll,-5310"
Reg.exe add "HKCR\Directory\shell\%HJ%" /v "Position" /t REG_SZ /d "Top" /f
Reg.exe add "HKCR\Directory\shell\%HJ%\shell\%np%\command" /ve /t REG_SZ /d "cmd /c \"\"%p%\" \"%%V\"\"" /f




② 【PDF移除密码签名.bat】名称不要改,否则要改上面代码第7行set "np=PDF移除密码签名"
[Asm] 纯文本查看 复制代码
@echo off

"%~dp0PDF权限密码解密v1.0.exe" "%~nx1"



我这里程序名称由【v1.0.exe】改为【PDF权限密码解密v1.0.exe】


功能:文件夹上右键,可调用;PDF文件右键可调用
弄不明白的,可以下载成品 ↓↓↓

链接:https://pan.quark.cn/s/d5b84a3b3249


免费评分

参与人数 4吾爱币 +3 热心值 +3 收起 理由
changgesujiao + 1 + 1 我很赞同!
beibianyu + 1 谢谢@Thanks!
huaihuai + 1 + 1 用心讨论,共获提升!
leskady + 1 热心回复!

查看全部评分

推荐
 楼主| flt 发表于 2025-7-9 10:42 |楼主
LDVE 发表于 2025-7-9 10:14
蓝奏没账号!
百度的吧 链接: https://pan.baidu.com/s/1kyxuLmXfvaOQVPxxD3zPng?pwd=52pj 提取码: 52pj ...

你这里逻辑不对
```
HKEY_CLASSES_ROOT\*\shell\
```
是向所有文件右键菜单加选项,应该只向pdf后缀加。

```
HKEY_CLASSES_ROOT\SystemFileAssociations\.pdf\shell
```
或者
```
HKEY_CLASSES_ROOT\.pdf\shell
```

还是推荐用我发的1.1版本安装包,避免卸载残留:lol
推荐
top777 发表于 2025-8-11 16:05
增加个图形界面的代码:
[Python] 纯文本查看 复制代码
import tkinter as tk
from tkinter import ttk, filedialog, messagebox
import PyPDF2
from pathlib import Path
import threading

class PDFUnlockerGUI:
    def __init__(self, root):
        self.root = root
        self.root.title("PDF解锁工具")
        self.root.geometry("600x400")
        self.root.resizable(True, True)
        
        # 创建界面
        self.create_widgets()
        
        # 处理状态
        self.is_processing = False
        
    def create_widgets(self):
        """
        创建界面组件
        """
        # 主框架
        main_frame = ttk.Frame(self.root, padding="10")
        main_frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
        
        # 配置网格权重
        self.root.columnconfigure(0, weight=1)
        self.root.rowconfigure(0, weight=1)
        main_frame.columnconfigure(1, weight=1)
        
        # 输入文件/目录选择
        ttk.Label(main_frame, text="选择文件或目录:").grid(row=0, column=0, sticky=tk.W, pady=5)
        
        self.path_var = tk.StringVar()
        self.path_entry = ttk.Entry(main_frame, textvariable=self.path_var)
        self.path_entry.grid(row=0, column=1, sticky=(tk.W, tk.E), padx=(5, 5), pady=5)
        
        self.browse_button = ttk.Button(main_frame, text="浏览...", command=self.browse_path)
        self.browse_button.grid(row=0, column=2, padx=(5, 0), pady=5)
        
        # 进度条
        self.progress_var = tk.DoubleVar()
        self.progress_bar = ttk.Progressbar(main_frame, variable=self.progress_var, maximum=100)
        self.progress_bar.grid(row=1, column=0, columnspan=3, sticky=(tk.W, tk.E), pady=10)
        
        # 状态标签
        self.status_var = tk.StringVar(value="就绪")
        self.status_label = ttk.Label(main_frame, textvariable=self.status_var)
        self.status_label.grid(row=2, column=0, columnspan=3, sticky=tk.W, pady=5)
        
        # 结果文本框
        self.result_text = tk.Text(main_frame, height=15, width=70)
        self.result_text.grid(row=3, column=0, columnspan=3, sticky=(tk.W, tk.E, tk.N, tk.S), pady=10)
        
        # 滚动条
        scrollbar = ttk.Scrollbar(main_frame, orient=tk.VERTICAL, command=self.result_text.yview)
        scrollbar.grid(row=3, column=3, sticky=(tk.N, tk.S))
        self.result_text.configure(yscrollcommand=scrollbar.set)
        
        # 开始按钮
        self.start_button = ttk.Button(main_frame, text="开始处理", command=self.start_processing)
        self.start_button.grid(row=4, column=1, pady=10)
        
        # 配置结果文本框的网格权重
        main_frame.rowconfigure(3, weight=1)
        
    def browse_path(self):
        """
        浏览文件或目录
        """
        # 创建一个选择对话框
        file_path = filedialog.askopenfilename(
            title="选择PDF文件",
            filetypes=[("PDF files", "*.pdf"), ("All files", "*.*")]
        )
        
        if not file_path:
            # 如果没有选择文件,则尝试选择目录
            dir_path = filedialog.askdirectory(title="选择包含PDF文件的目录")
            if dir_path:
                self.path_var.set(dir_path)
        else:
            self.path_var.set(file_path)
            
    def copy_pdf_pages(self, input_path: str, output_path: str) -> bool:
        """
        移除PDF文件的所有限制
        
        Args:
            input_path: 输入PDF文件路径
            output_path: 输出PDF文件路径
            
        Returns:
            是否成功移除限制
        """
        try:
            with open(input_path, 'rb') as input_file:
                reader = PyPDF2.PdfReader(input_file)
                
                writer = PyPDF2.PdfWriter()
                
                # 复制所有页面
                for page in reader.pages:
                    writer.add_page(page)
                
                # 写入新文件(不设置任何加密或限制)
                with open(output_path, 'wb') as output_file:
                    writer.write(output_file)
                
                return True
                
        except Exception as e:
            self.result_text.insert(tk.END, f"处理文件 '{input_path}' 时发生错误: {e}\n")
            return False
    
    def process_files(self):
        """
        在后台线程中处理文件
        """
        input_path = self.path_var.get().strip()
        
        if not input_path:
            messagebox.showerror("错误", "请选择要处理的文件或目录")
            self.is_processing = False
            return
            
        path_obj = Path(input_path)
        
        if not path_obj.exists():
            messagebox.showerror("错误", "指定的文件或目录不存在")
            self.is_processing = False
            return
            
        try:
            if path_obj.is_dir():
                files = list(path_obj.glob("**/*.pdf"))
            else:
                files = [path_obj]
                
            total = len(files)
            if total == 0:
                self.result_text.insert(tk.END, "未找到PDF文件\n")
                self.status_var.set("未找到PDF文件")
                self.is_processing = False
                return
                
            self.result_text.insert(tk.END, f"找到 {total} 个PDF文件\n")
            self.result_text.insert(tk.END, "=" * 50 + "\n")
            
            success_count = 0
            for i, pdf_file in enumerate(files, start=1):
                if not self.is_processing:  # 用户取消操作
                    break
                    
                # 更新进度
                progress = (i / total) * 100
                self.progress_var.set(progress)
                self.status_var.set(f"正在处理: {pdf_file.name} ({i}/{total})")
                self.root.update_idletasks()
                
                if not pdf_file.is_file():
                    self.result_text.insert(tk.END, f"跳过非PDF文件: {pdf_file}\n")
                    continue
                    
                output_file = pdf_file.with_name(f"{pdf_file.stem}_decrypt.pdf")
                success = self.copy_pdf_pages(pdf_file, output_file)
                
                if success:
                    success_count += 1
                    self.result_text.insert(tk.END, f"✓ {pdf_file.name} 处理成功\n")
                else:
                    self.result_text.insert(tk.END, f"✗ {pdf_file.name} 处理失败\n")
                    
                self.result_text.see(tk.END)
                self.root.update_idletasks()
                
            # 处理完成
            self.progress_var.set(100)
            self.status_var.set(f"处理完成: {success_count}/{total} 个文件成功处理")
            self.result_text.insert(tk.END, "=" * 50 + "\n")
            self.result_text.insert(tk.END, f"处理完成: {success_count}/{total} 个文件成功处理\n")
            
        except Exception as e:
            self.result_text.insert(tk.END, f"处理过程中发生错误: {e}\n")
            self.status_var.set("处理出错")
            
        finally:
            self.is_processing = False
            self.start_button.config(text="开始处理", state=tk.NORMAL)
            
    def start_processing(self):
        """
        开始或停止处理
        """
        if self.is_processing:
            # 停止处理
            self.is_processing = False
            self.start_button.config(text="开始处理", state=tk.NORMAL)
            self.status_var.set("处理已停止")
        else:
            # 开始处理
            self.is_processing = True
            self.start_button.config(text="停止处理", state=tk.NORMAL)
            self.result_text.delete(1.0, tk.END)
            self.progress_var.set(0)
            
            # 在新线程中处理文件,避免阻塞GUI
            thread = threading.Thread(target=self.process_files)
            thread.daemon = True
            thread.start()

def main():
    root = tk.Tk()
    app = PDFUnlockerGUI(root)
    root.mainloop()

if __name__ == "__main__":
    main()
3#
zhangtian325 发表于 2025-7-4 19:35
非常感谢
4#
WORSONG178 发表于 2025-7-4 20:21
还是挺需要这种小工具的。
5#
magiclyan 发表于 2025-7-4 20:28
Win10运行直接闪退!
疑似需要运行环境或者框架
6#
 楼主| flt 发表于 2025-7-4 20:32 |楼主
magiclyan 发表于 2025-7-4 20:28
Win10运行直接闪退!
疑似需要运行环境或者框架

本地测试环境win10 22H2,请确定用法正确。
本软件无UI界面,直接将文件拖入即可。
如问题依旧,麻烦cmd给一下报错。
7#
ljq5946 发表于 2025-7-4 21:04
很好的小工具,谢谢咯
8#
xcaoyi520 发表于 2025-7-4 21:31
感谢分享,好用
9#
LDVE 发表于 2025-7-4 21:35
大佬的软件   名称都只有一个版本号啊      批量压缩视频也是如此

免费评分

参与人数 1热心值 +1 收起 理由
flt + 1 确实 懒得起英文简写

查看全部评分

10#
吾爱007 发表于 2025-7-4 21:37
谢谢提供分享!!!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-7-13 09:03

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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