PDF:对文本编码进行模糊处理,以防止自动解析和复制+粘贴



我想在我的网站上提供PDF,但希望防止机器人自动解析可能不尊重正常的PDF"安全性"。原因是这也是商业出版的,我可以分享"个人使用",但不能以这种方式广泛提供。我最初从Word创建了PDF。

我尝试使用带有dNoOutputFonts选项的Ghostscript将文本转换为字形,但结果大得离谱(从2.5 MB到180 MB)。打乱文本编码似乎是一个不错的选择,但我几乎没有找到任何讨论这个问题的帖子。似乎有一个商业解决方案,但我无法找到一种方法来做到这一点,例如使用 Ghostscript 或 qpdf。关于如何实现这一目标(或替代解决方案)的任何建议?

操作系统: 视窗 10 64 位 Ghostscript 的可用版本:9.18、9.27

简单示例 PDF

嗯,这就是字体的优势,你只需要描述每个字符一次。转换为轮廓,您每次都需要描述它,所以是的,要大得多。

Ghostscript的pdfwrite设备付出了相当大的努力来尝试使文本可搜索,因为一般来说,当"可搜索"文件变成"不可搜索"时,人们会对我们大喊大叫。因此(除其他外)它在输入文件中保留了任何ToUnicode CMaps。为了防止简单的索引,您需要避免这种情况。您尚未链接到PDF文件,所以我无法对此进行测试,但是....

您需要编辑三个位置:

/ghostpdl/Resource/Init/gs_pdfwr.ps,第 642 行,更改:

/WantsToUnicode /GetDeviceParam .special_op {
exch pop
}{
//true
}ifelse

自:

//false

在同一文件中,在第 982 行,更改:

/WantsToUnicode /GetDeviceParam .special_op {
exch pop
}{
//false
}ifelse

自:

//false

然后在/ghostpdl/Resource/Init/pdf_font.ps 的第 614 行中,更改:

/WantsToUnicode/GetDeviceParam .special_op { 啪啪啪啪�� }{ 假 }ifelse

自:

//假

这应该会阻止 inptu 文件中的任何 ToUnicode 信息进入输出文件。根据你使用的操作系统,以及Ghostscript的构建方式(你还没有说),你可能需要告诉Ghostscript在其搜索路径中包含该目录,你可以使用-I/ghostpdl/Resource/Init。

您还应该设置-dSubsetFonts=true,这会将所有字体作为子集发出,我认为这是默认设置,但我无法立即回忆起来,设置它没有坏处。这意味着遇到的第一个字形在索引 1 处编码,第二个字形在索引 2 处编码,依此类推。因此,Hello World变成了0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x04,0x07,0x03,0x08。排序在整个文件中是一致的(显然),但对于文件中的每种字体和每个文件都是不同的。我想这应该被充分打乱。当然不可能简单地搜索/复制/粘贴。

如果您提供一个示例文件,我可以对其进行测试。

哦,我也刚刚想到,通过使用ps2write设备创建一个PostScript文件,然后使用pdfwrite设备将其转换回PDF,你可以获得相同的效果。ps2write设备无法嵌入ToUnicode CMaps,因为PostScript中没有对此的标准支持。当然,这也意味着内容会回落到 PostScript,这可能会导致其他不可接受的质量/大小更改。

最新更新