0

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

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

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

简单示例 PDF

4

1 回答 1

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 { exch pop }{ //false }ifelse

至:

//错误的

这应该可以防止 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,这可能会导致其他不可接受的质量/大小变化。

于 2019-08-23T19:54:05.800 回答