本帖最后由 三滑稽甲苯 于 2025-4-8 16:49 编辑
前言
在网上下载 PDF 时,偶尔会遇到不允许复制或修改的 PDF:
然而它又没有密码,很显然我们理论上是有办法破解这个限制的。有经验的小伙伴可能已经想到了一个现成的工具:PDFDeSecure,可惜的是:
- 它没有提供命令行接口,在没有 GUI 的服务器上运行就比较麻烦
- 它没有提供预编译的二进制文件,要使用它还得下载 Visual Studio 自己编译
网上也有一些在线服务提供了解除限制的功能,但是上传了 PDF 就有泄密的风险。因此,在搜寻无果后,我决定自己搓一个。为了让它尽可能又快又小又安全,我决定用 Rust 编写,顺便也可以巩固一下新学的芝士。
关键代码
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() {
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(())
}
}
fn set_permissions(
input_path: &str,
output_path: &str,
perm_mod: Option<&str>,
) -> Result<()> {
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 上均经过测试
- 可拓展:不仅可用于解除限制,也可以用于增加限制,以及指定特定的权限
使用
仅用于解除限制
- 从 Releases 下载对应平台的压缩包并解压
- 将
pdf-perm 重命名为 desec (Windows 下的话将 pdf-perm.exe 重命名为 desec.exe )
- 将需要解除限制的文档拖至这个可执行文件上,或使用命令行执行
desec[.exe] your_file.pdf
- 解除限制成功
更高级的用法
从 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 仓库的说明 来获取更多信息。
链接
|