吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1904|回复: 42
上一主题 下一主题
收起左侧

[其他原创] [Rust] PDF 权限管理 / 解除限制

  [复制链接]
跳转到指定楼层
楼主
三滑稽甲苯 发表于 2025-4-7 22:55 回帖奖励
本帖最后由 三滑稽甲苯 于 2025-4-8 16:49 编辑

前言

在网上下载 PDF 时,偶尔会遇到不允许复制或修改的 PDF:

然而它又没有密码,很显然我们理论上是有办法破解这个限制的。有经验的小伙伴可能已经想到了一个现成的工具:PDFDeSecure,可惜的是:

  1. 它没有提供命令行接口,在没有 GUI 的服务器上运行就比较麻烦
  2. 它没有提供预编译的二进制文件,要使用它还得下载 Visual Studio 自己编译

网上也有一些在线服务提供了解除限制的功能,但是上传了 PDF 就有泄密的风险。因此,在搜寻无果后,我决定自己搓一个。为了让它尽可能又快又小又安全,我决定用 Rust 编写,顺便也可以巩固一下新学的芝士。

关键代码

// lib.rs
impl PdfPerm for Document {
    fn permissions(&self) -> Permissions { // 读取文件的权限信息
        self.encryption_state
            .as_ref()
            .map(EncryptionState::permissions)
            .unwrap_or_default() // 若无,则使用默认值代替
    }
    fn set_permissions(&mut self, permissions: Permissions) -> PdfResult<()> {
        if self.is_encrypted() { // 目前仅支持没有密码的 PDF
            error!("Does not support setting permissions on encrypted documents");
            return Err(Error::AlreadyEncrypted);
        }
        let version = EncryptionVersion::V1 { // 固定使用最老的版本,保证兼容性
            document: self,
            owner_password: "", // 使用空密钥
            user_password: "", // 使用空密钥
            permissions,
        };
        let state: EncryptionState = version.try_into()?;
        debug!("Encryption state: {state:?}");
        self.encrypt(&state)?; // 对文档进行加密,更新权限信息

        Ok(())
    }
}
// main.rs
fn set_permissions(
    input_path: &str, // 输入
    output_path: &str, // 输出
    perm_mod: Option<&str>, // 对权限的更改,例如 `+c`, `-m`, `=pma`, `+*`
) -> Result<()> {
    // 打开 PDF
    info!("Reading document: {input_path}");
    let mut doc = Document::load(input_path)?;
    debug!("Encryption state: {:?}", doc.encryption_state);

    // 读取原权限
    let mut perm = doc.permissions();
    info!("Original permissions: {}", perm.summary());

    // 没什么要干的事
    let Some(perm_mod) = perm_mod else {
        info!("No modifications specified, exiting");
        return Ok(());
    };

    // 修改权限
    perm.apply_modification(perm_mod);
    info!("Modified permissions: {}", perm.summary());

    doc.set_permissions(perm)
        .with_context(|| format!("Failed to set permissions for given document: {input_path}"))?;

    // 保存
    info!("Saving document to {output_path}");
    doc.save(output_path)
        .with_context(|| format!("Failed to save document: {output_path}"))?;

    Ok(())
}

特点

  • 小而快:可执行文件压缩后甚至不到 1M
  • 预构建:直接下载就能用
  • 跨平台:在 MacOS, Windows 和 Linux 上均经过测试
  • 可拓展:不仅可用于解除限制,也可以用于增加限制,以及指定特定的权限

使用

仅用于解除限制

  1. Releases 下载对应平台的压缩包并解压

  1. pdf-perm 重命名为 desec (Windows 下的话将 pdf-perm.exe 重命名为 desec.exe)

  1. 将需要解除限制的文档拖至这个可执行文件上,或使用命令行执行 desec[.exe] your_file.pdf

  1. 解除限制成功

更高级的用法

Releases 下载对应平台的压缩包并解压。命令行的操作和 chmod 十分相似。

查看权限
./pdf-perm your_file.pdf
授予权限
./pdf-perm +c your_file.pdf
驳回权限
./pdf-perm -c your_file.pdf
指定权限
./pdf-perm =pma your_file.pdf
授予所有权限 / 解除所有限制
./pdf-perm +* your_file.pdf
支持的权限
# Short Flag Constant
3 p PRINTABLE
4 m MODIFIABLE
5 c COPYABLE
6 a ANNOTABLE
9 f FILLABLE
10 x COPYABLE_FOR_ACCESSIBILITY
11 s ASSEMBLABLE
12 q PRINTABLE_INHIGHQUALITY
/ * All permissions

查看 GitHub 仓库的说明 来获取更多信息。

链接

免费评分

参与人数 7吾爱币 +12 热心值 +6 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
610100 + 1 + 1 感谢分享!qpdf也不错
18and02 + 1 + 1 谢谢@Thanks!
yanglinman + 1 谢谢@Thanks!
freckle + 1 + 1 谢谢@Thanks!
daoye9988 + 1 + 1 谢谢@Thanks!
Hameel + 1 我很赞同!

查看全部评分

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

推荐
hbsz 发表于 2025-4-7 23:56
有个最简单的方法,用浏览器把PDF打开,然后ctrl+P打印为PDF文档,新的文档里所有权限全部可以解除

点评

有的文档也会同时禁止打印  发表于 2025-4-8 08:47

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
weimeicn + 1 + 1 用心讨论,共获提升!

查看全部评分

推荐
 楼主| 三滑稽甲苯 发表于 2025-4-8 08:49 |楼主
推荐
 楼主| 三滑稽甲苯 发表于 2025-4-8 10:11 |楼主
nonfree 发表于 2025-4-8 09:46
win11 PDF设置的打开和其它密码 按步骤操作 后 没效果 不知什么情况

暂时不支持有密码的 pdf 呢,可以考虑用 pdfrip 暴力破解

推荐
reficulx 发表于 2025-4-8 08:03
hbsz 发表于 2025-4-7 23:56
有个最简单的方法,用浏览器把PDF打开,然后ctrl+P打印为PDF文档,新的文档里所有权限全部可以解除

你真是个大聪明!
4#
Elaineliu 发表于 2025-4-7 23:04
用PDFCommander就可以
5#
deniol 发表于 2025-4-7 23:21
PassFab也可以的
6#
manglang 发表于 2025-4-7 23:26
PDFPatcher就可以
7#
chuoba 发表于 2025-4-8 00:10
需要密码打开的pdf呢
8#
liu50663 发表于 2025-4-8 00:18
好家伙~我先学学看~~
9#
daoye9988 发表于 2025-4-8 07:26
过程非常详细,感谢
10#
heshuiqingqing 发表于 2025-4-8 08:09
说的很详细,有帮助。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2025-4-23 12:58

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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