Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PDF:混淆文本编码以防止自动解析和复制+;粘贴_Pdf_Ghostscript_Postscript_Truetype_Qpdf - Fatal编程技术网

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

PDF:混淆文本编码以防止自动解析和复制+;粘贴,pdf,ghostscript,postscript,truetype,qpdf,Pdf,Ghostscript,Postscript,Truetype,Qpdf,我想在我的网站上提供一个PDF,但我想防止机器人自动解析,因为它可能不尊重正常的PDF“安全性”。原因是,这也是商业出版,我可以分享“个人使用”,但不能让它广泛提供这种方式。我最初是从Word创建PDF的 我曾尝试使用带有dNoOutputFonts选项的Ghostscript将文本转换为glyphs,但结果大得离谱(从2.5 MB到180 MB)。扰乱文本编码似乎是一个不错的选择,但我几乎找不到任何讨论这个问题的帖子。似乎存在错误,但我找不到方法来执行此操作,例如使用Ghostscript或q

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

我曾尝试使用带有dNoOutputFonts选项的Ghostscript将文本转换为glyphs,但结果大得离谱(从2.5 MB到180 MB)。扰乱文本编码似乎是一个不错的选择,但我几乎找不到任何讨论这个问题的帖子。似乎存在错误,但我找不到方法来执行此操作,例如使用Ghostscript或qpdf。关于如何实现这一点(或替代解决方案)有何建议

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


嗯,这就是字体的优点,你只需要描述每个字符一次。转换成大纲,你每次都需要描述它,所以是的,要大得多

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

您需要编辑三个位置:

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

/WantsToUnicode /GetDeviceParam .special_op {
  exch pop
}{
  //true
}ifelse
  /WantsToUnicode /GetDeviceParam .special_op {
    exch pop
  }{
    //false
  }ifelse
致:

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

/WantsToUnicode /GetDeviceParam .special_op {
  exch pop
}{
  //true
}ifelse
  /WantsToUnicode /GetDeviceParam .special_op {
    exch pop
  }{
    //false
  }ifelse
致:

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

/WantsToUnicode/GetDeviceParam。特殊操作{ exch pop }{ //假的 }如果有

致:

//假的

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

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

如果你让一个示例文件可用,我可以测试它


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

这就是字体的优点,每个字符只需描述一次。转换成大纲,你每次都需要描述它,所以是的,要大得多

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

您需要编辑三个位置:

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

/WantsToUnicode /GetDeviceParam .special_op {
  exch pop
}{
  //true
}ifelse
  /WantsToUnicode /GetDeviceParam .special_op {
    exch pop
  }{
    //false
  }ifelse
致:

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

/WantsToUnicode /GetDeviceParam .special_op {
  exch pop
}{
  //true
}ifelse
  /WantsToUnicode /GetDeviceParam .special_op {
    exch pop
  }{
    //false
  }ifelse
致:

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

/WantsToUnicode/GetDeviceParam。特殊操作{ exch pop }{ //假的 }如果有

致:

//假的

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

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

如果你让一个示例文件可用,我可以测试它


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

导出PDF,其中只有JPEG图像作为内容。仍然有OCR工具可能会有所帮助,但它们不是100%完美,可能会有格式问题。将带有JPEG图像的PDF作为其唯一内容导出。还有一些OCR工具可能会有所帮助,但它们并不是100%完美,可能会有formattin