Unlock pdf by shell commands

本文最后更新于:1 年前

解锁 \(\mbox{pdf}\) 密码并替换原始文件

每次解锁 \(\mbox{pdf}\) 中的密码比较麻烦,当然有免费的在线网页资源 smallpdf 不过每次需要上传文件,而且有一定的安全风险。使用 \(\mbox{wsl}\) 安装 \(\mbox{qpdf}\) 加上脚本编辑可以实现解锁 \(\mbox{pdf}\) (在不知道密码的情况下,有暴力解锁的 \(\mbox{linux}\) 安装包,不过现在 \(\mbox{pdf}\) 升级了,貌似不能被暴力破解了……)

\(\mbox{linux/wsl}\) 环境下,安装 \(\mbox{qpdf}\)

1
sudo apt-get install qpdf

输入密码后便自动安装好了。之后,在当前目录下创建一个 \(\mbox{unlockPDF}\) 文件

1
touch unlockPDF

使用 \(\mbox{nano}\) 进行编辑

1
nano unlockPDF

在编辑界面中写入如下代码,其中 \(\#\) 开头的为注释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 第一行代表在哪个 shell 命令下执行,可以修改为 python 成为 python 脚本
# 可以使用命令行 which bash 找到当前控制台命令行所在位置(本质上命令也是一些文件)
#!/usr/bin/bash
# 要求文件名中不能有空格,否则处理时会把文件名分割,其中一个成为命令使得程序运行失败
# pdf名称,存储输入的第一个参数
pdfName=$1
# 密码,存储输入的第二个参数
password=$2
# 解锁 pdf 命令,安装 qpdf (sudo apt-get install qpdf) 便可以使用
qpdf -password=$password --decrypt $pdfName output.pdf
# $? 为 0 代表上条命令执行成功
if [ $? -eq 0 ]; then
# 删除原文件
rm -rf $pdfName
# 将得到的 output.pdf 名称修改为原来 pdf 的名称,达到替换的效果
mv output.pdf $pdfName
# 输出成功结果
echo "解锁成功,原文件被替换"
else
# 输出失败结果
echo "密码错误,或未安装qpdf"
fi

可以看到 \(\mbox{shell}\) 中的参数传递方式、\(\mbox{if}\) 语句的输入、\(=\) 的格式规范(不要在 \(=\) 两侧加空格,加空格就代表分割命令,文件名也不能有空格)等与其他语言有些不同,需要加以熟悉,不过各语言之间的底层逻辑是相通的,只是各有千秋。

编写好之后,由于 \(\mbox{wsl}\)\(\mbox{windows}\) 的分隔机制,不能把写好的脚本直接放在 \(\mbox{wsl}\) 控制台中,就直接放在文件夹中,专门用来处理文件,执行时输入

1
2
# secure.pdf 为需要解锁的 pdf 文件,password 为解锁密码
./unlockPDF secure.pdf password

转换文档的 \(\mbox{Linux}\) 命令行

( wsl 环境下输入下行代码会自动提示安装对应包,由于在命令行中运行,十分简便)

转换 \(\mbox{tex}\) 文件为 \(\mbox{md}\) 文件

1
2
//需要安装 pandoc
pandoc -s OOP_Homework.tex -o OOp_Homework.md

使用 \(\text {linux}\) 环境下合成多个 \(pdf\)(主要用于合成多个爬虫 \(pdf\) 文件)

1
2
//需要安装 pdftk
pdftk $(ls *.pdf) cat output 教材.pdf

多张原始图片合成为 \(pdf\)(主要用于合成手写作业)

1
2
//需要安装 ImageMagick
convert *.jpg 作业.pdf

如果出现安全问题(如下)

1
attempt to perform an operation not allowed by the security policy `PDF' @ error/constitute.c/IsCoderAuthorized/408.

需要使用权限修改 \(policy.xml\) 文件,使用以下命令行进入此文件中,回车后会进入编辑模式

1
sudo nano /etc/ImageMagick-6/policy.xml

其中,\(nano\) 是字符终端的文本编辑器,可以对文件进行修改

1
2
3
4
…………//大概在文件结尾部分
<policy domain="coder" rights="none" pattern="EPS" />
<policy domain="coder" rights="none" pattern="PDF" />
<policy domain="coder" rights="none" pattern="XPS" />

修改 \(\mbox{PDF}\) 对应权限 rights="none" $$ rights="read|write"

1
2
3
<policy domain="coder" rights="none" pattern="EPS" />
<policy domain="coder" rights="read|write" pattern="PDF" />
<policy domain="coder" rights="none" pattern="XPS" />

\(Ctrl+X\) 退出并输入 \(Y\) 保存就可以使用了


Unlock pdf by shell commands
https://lr-tsinghua11.github.io/2022/05/04/%E7%BC%96%E7%A8%8B/Linux%20%E6%96%87%E4%BB%B6%E8%A7%A3%E9%94%81%E5%92%8C%E8%BD%AC%E6%8D%A2/
作者
Learning_rate
发布于
2022年5月4日
许可协议