找了好久,突然发现了则篇文章,但现在不知道出处了,原谅我,作者。
使用 LaTeX 撰写文档并生成 PDF
文件时,可以通过 Knuth 在 TeX 里留的一个后门:\special
命令来让后面的驱动完成这些工作(牛人就是牛)。这条命令一般放在 \documentclass
之前,对于文档加密来说,命令的格式为:
1 | \special{pdf:encrypt userpw (<userpassword>) ownerpw (<ownerpassword>) length <num1> perm <num2>} |
简单解释一下几个参数:
<userpassword>
填写用户密码,提供打开阅读权限,一般可以留空,文章写了总是给人看的,除非是特别机密的文件,才有设置的必要;<userpassword>
填写拥有者密码,用于提供权限解除其他限制;<num1>
加密键长度,必须为 40~128 之间的 8 的倍数或 256,默认为 40;<num2>
加密标识,这是一个 32 位无符号整数转化的十进制数;各数位含义为:
数位 | 含义 |
---|---|
3 |
允许打印文档 |
4 |
允许除 6 、9 、11 位控制的其他修改操作 |
5 |
允许从文档中复制文字和图形 |
6 |
允许添加修改文字注释,创建和填写表单(表单操作 4 位也可以控制) |
9 |
允许填写现有的表单字段(包括签名字段) |
10 |
支持文字和图形的提取(针对有障碍用户的可访问性或用于其他目的)PDF 2.0 中已弃用 |
11 |
允许重组文件,如插入页面、删除页面、旋转页面、提取页面等。不受 4 位的控制。 |
12 |
允许高质量打印,如果此位清除,仅设置 3 位,将以低质量方式打印。 |
如果希望文档仅仅允许高质量打印,则 12
位与 3
位应设置为 1
,其余位设置为 0
,即 100000000100
,该数值转化为十进制数即为:2052
;假定加密键长度为 128,用户密码留空,所有者密码为 mypassword
,则编译文档中这条命令应写成为:
1 | \special{pdf:encrypt userpw () ownerpw (mypassword) length 128 perm 2052} |
文件加密也可以通过 xdvipdfmx
(或 dvipdfm(x)
) 命令参数实现,编译命令为:
1 | xdvipdfmx -S -K <num1> -P <0xNUM2> file.xdv |
这里 <num1>
与前相同,<0xNUM2>
则需要将 <num2>
转换为 16 进制表示,并且,该命令只能对 dvi
或 xdv
文件使用,命令使用时需要在命令行交互输入用户和拥有者密码,相对比较麻烦。
对既有 pdf
文件进行加密
上述方法是在撰写文档时对文档进行加密的方法。大多数情况下,我们是面对一个既有 pdf
文件希望对其进行加密处理,这时可以借用 pdfpages
宏包重新生成文档的方式,在编译中对其进行加密。假定加密语句同上,对于一个既有 file.pdf
文档,可以编写如下 tex
源代码:
1 | \special{pdf:encrypt userpw () ownerpw (mypassword) length 128 perm 2052} |
编译此文档后,将生成一个加密后的文件,间接实现了加密。
评论
WalineValine