PDF:混淆文本编码以防止自动解析和复制+粘贴

时间:2019-08-23 17:16:20

标签: pdf ghostscript postscript true-type-fonts qpdf

我想在我的网站上提供PDF,但想防止可能不尊重正常PDF“安全性”的漫游器自动解析。原因是它也是商业发行的,我可以分享给“个人使用”,但不能以这种方式广泛使用。我最初是从Word创建PDF的。

我尝试将Ghostscript与dNoOutputFonts选项一起使用,以将文本转换为字形,但是结果却非常大(从2.5 MB到180 MB)。扰乱文本编码似乎是一个不错的选择,但是我几乎找不到任何讨论此问题的帖子。似乎有一个commercial solution,但我找不到解决办法,例如使用Ghostscript或qpdf。关于如何实现此目标(或替代解决方案)的任何建议?

操作系统:Windows 10 64bit Ghostscript的可用版本:9.18、9.27

Simple example PDF

1 个答案:

答案 0 :(得分:2)

好吧,这就是字体的优点,您只需描述每个字符一次。转换为轮廓,您每次都需要对其进行描述,是的,更大。

Ghostscript的pdfwrite设备竭尽全力试图使文本可搜索,因为通常人们会在“可搜索”文件变为“不可搜索”时对我们大喊大叫。因此(除其他事项外)它在输入文件中保留了所有ToUnicode CMap。为了避免简单的索引编制,您需要避免这种情况。您尚未链接到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 {     流行音乐   } {     //假   }不容易

收件人:

// false

那应该防止inptu文件中的任何ToUnicode信息传递到输出文件。根据您使用的操作系统以及Ghostscript的构建方式(您未说),您可能需要告诉Ghostscript在该目录的搜索路径中包含该目录,您可以使用-I / ghostpdl / Resource /初始化。

您还应该设置-dSubsetFonts=true,它将所有字体作为子集发出,我认为这是默认设置,但是我不能立即回想,设置它也没有害处。这意味着遇到的第一个字形在索引1处进行编码,第二个在索引2等处进行编码。因此Hello World变为0x01、0x02、0x03、0x03、0x04、0x05、0x06、0x04、0x07、0x03、0x08。整个文件的顺序(显然)是一致的,但是文件中的每个字体和每个文件的顺序都不同。我以为那应该足够混乱了。当然,不可能简单地搜索/复制/粘贴。

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

哦,对我而言,您还可以通过使用ps2write设备创建PostScript文件,然后使用pdfwrite设备将其转换回PDF来获得相同的效果。 ps2write设备无法嵌入ToUnicode CMap,因为PostScript中对此没有标准支持。当然,这也意味着内容会回退到PostScript,这可能会导致其他不可接受的质量/尺寸变化。