我如何以编程方式更改/保护 PDF 中的文本内容以使其不再是可复制的文本?

我如何以编程方式更改/保护 PDF 中的文本内容以使其不再是可复制的文本?

我想做与 OCR 相反的事情,我不想将图像转换为文本,我想将 PDF 中的所有文本转换为图像,这样就不能随意选择和复制。

在 Acrobat Pro 中没问题,但我真的很想从 Linux 命令行使用一些东西,因为我有很多这样的 PDF 需要处理,而且它们目前都在一个网站上。如果我可以在服务器上进行此更改,那么我就可以节省数小时的下载、在 Acrobat 中处理、重新上传的工作,这些工作需要通过我的 CMS 界面来完成,而我的界面非常慢。

因此,如果有一些 PDF 工具可以轻松地做到这一点,我可以从终端使用,那就太棒了。

答案1

我想你的目标是使它更加困难从 PDF 中选择并复制文本。因为这是你唯一可以实现的目标。(如果有办法在屏幕上看到 PDF 页面,那么就有办法以某种方式访问​​文本或图像内容,尽管比复制粘贴更困难......我想你知道这一点。)

您有三个选择:

  1. 将您的 PDF 页面转换为整页像素图像并将这些图像再次包装成多页 PDF。
  2. 将所有嵌入字体的字形转换为矢量轮廓
  3. “加密”您的 PDF用户密码

只要使用正确的工具,这 3 种方法都非常容易应用。:-)

对于每种方法,您都可以在命令行上使用免费的开源软件工具。 (这些工具均适用于 Linux、Mac OSX、Unix 或 Windows。)

请参阅下面有关每种方法的更详细讨论。

1. 创建全页像素图像(使用 ImageMagick 的convert

您可以使用图像魔术师命令convert简单如下:

 convert              \
   pdf-with-fonts.pdf \
   pdf-with-images.pdf

ImageMagick 可以直接与光栅图像,而不是任何其他格式。由于它不能直接处理 PDF,因此它将自动使用Ghostscript就像它一样代表。因此 Ghostscript 也需要安装!Ghostscript 将创建 ImageMagick 所需的光栅图像作为输入。

-verbose您可以通过在命令行中添加开关来观察使用 Ghostscript 作为后台进程的 ImageMagick 进程。

默认情况下,convert将使用 72ppi 的分辨率。这可能不足以很好地阅读(但通过使用OCR 软件至输出。)

像素化 PDF 页面,分辨率为 72 PPI,缩放比例为 600%

上图显示了使用 ImageMagick 默认分辨率(72 PPI)在 600% 缩放级别下创建的像素化 PDF 页面的屏幕截图。如果您需要更好的分辨率,例如 200 PPI,请-density 200在命令行中添加参数:

 convert              \
  -density 200        \
   pdf-with-fonts.pdf \
   pdf-with-images.pdf

像素化 PDF 页面,分辨率为 200 PPI,缩放比例为 600%

上图显示了使用 ImageMagick 创建的像素化 PDF 页面的截图(也是缩放级别为 600%),分辨率更高达 200 PPI。

请注意,当我使用默认分辨率 72 PPI 测试上述命令时,包含所有文本且大小为 1 MB 的 219 页 PDF 会产生 23 MB 的输出文件。在 MacBook 上生成大约需要 2 分钟。200ppi 的 PDF 会产生 110 MB 的输出文件,需要 11 分钟才能准备好……

规避?

如果分辨率足够好,很容易避免页面像素化:OCR 可以正常工作。分辨率低时,人类可能仍可读(并可猜测),但机器很难得出良好的 OCR 结果。

2. 将所有字形转换为矢量轮廓(使用 Ghostscript)

您可以使用 Ghostscript 的最新和最新和最好的版本。也就是说版本 v9.15. 使用 检查您安装的版本gs -version

最新版本 v9.15 包含一个新的命令行参数,--dNoOutputFonts。此参数将把所有字形转换为轮廓,并删除所有嵌入的字体:

gs                        \
 -o pdf-with-outlines.pdf \
 -sDEVICE=pdfwrite        \
  pdf-with-fonts.pdf

在我的测试中,同样的 219 页 PDF(大小为 1 MByte)转换成 186 MByte 的输出文件,花费了 6 分钟进行转换。

轮廓的优点是页面的文本保持清晰锐利且不像素化,并且您可以在任何级别放大文本而不会失去清晰度。您可以在下一个屏幕截图中看到这一点:

PDF 页面上的矢量化文本缩放至 600%

缺点是文件的大小。(顺便说一句,我使用 Adob​​e Acrobat Pro XI 测试了相同的方法,将文本转换为轮廓,生成的文件大小为 61 MByte,处理需要 15 分钟。)

规避?

规避这一措施很容易:OCR 就能正常工作。

3. 通过“加密”保护 PDF(使用qpdf

不太为人所知的是,你可以使用以下方法“保护”或(“加密”)PDF空密码(“用户”和“所有者”密码)。这允许所有 PDF 阅读器/查看器软件打开文件而不要求输入密码,仅在尝试从页面复制文本或尝试打印文件时弹出密码对话框。

定量PDF对此有相当好的支持:

qpdf                    \
  --encrypt  ""  ""  40 \
  --print=n             \
  --modify=n            \
  --extract=n           \
  --                    \
    uncrypted.pdf       \
    crypted.pdf

所有这些命令选项是什么意思?

  • --encrypt "" "" 40
       这将两个密码(用户和所有者)都设置为空字符串,并将密钥长度设置为 40 位。

  • --print=n
       这将禁用 PDF 打印。

  • --modify=n
       这将禁止修改 PDF。

  • --extract=n
       这将禁用 PDF 的文本和图像提取。

  • --
       这是表示加密选项结束所必需的。

如果您使用 128 或 256 位密钥长度,QPDF 会提供更多(和不同)的详细选项。其他可用选项包括--modify=[annotate|form|assembly]允许填写表格、添加注释或将文档与其他 PDF 组合在一起(同时仍不允许复制粘贴或打印)。

此命令

 qpdf --show-encryption crypt.pdf 

将显示有关任何文件的“加密”设置的详细信息。示例:

 extract for accessibility: not allowed
 extract for any purpose: not allowed
 print low resolution: not allowed
 print high resolution: not allowed
 modify document assembly: not allowed
 modify forms: allowed
 modify annotations: allowed
 modify other: not allowed
 modify anything: not allowed

已选择单词的“受保护”PDF。左下:禁止复制。右下:禁止打印。

顺便说一句:在上面显示的两个对话框中将密码留空对(大多数?或所有?尚未测试……)PDF 查看器没有帮助。它仍然无法解锁以进行复制或打印。

该方法的优点在于执行速度快,文件大小几乎相同。

规避?

当然,再次删除“加密”也同样容易:

qpdf --decrypt crypted.pdf decrypted.pdf

4. 总结

为了快速获得结果、相同的文件大小以及易于删除的保护'随意的' 选择和复制文本,使用“保护”/“加密”并使用空密码。

对于结果较慢、文件大小可能较大(但页面并不总是好看)且需要更多工作才能删除保护的情况,请使用像素化所有页面。

如果想要更慢的结果(但页面看起来更好),并且需要做更多的工作来删除保护,请使用矢量轮廓所有文本的方法。

请务必注意,所有这些方法都不能完全保护 PDF 页面的内容。它们只会使提取变得更加不方便。

答案2

看来你最好的选择是使用图像魔术师从命令行将 PDF 转换为几乎任何类型的图像。该网站提供了一些不错的详细信息如何使用 PHP 和 ImageMagick 自动执行此任务。但从最基本的层面上讲,这个网站解释了基础知识从终端命令行执行此操作:

convert my_great_file.pdf my_great_file.png

要将输出格式从 PNG 更改为 JPEG,只需更改目标文件名的文件扩展名,如下所示:

convert my_great_file.pdf my_great_file.jpg

您的情况需要注意的一点是,您需要确保您的托管服务已安装 ImageMagick。如果没有,他们是否愿意安装它。根据我的经验,ImageMagick 是一种非常常用的工具,应该安装在那里。唯一可能的“陷阱”是安装时没有内置 PDF 支持。但这是您需要弄清楚和处理的问题。

另外,如果您从 PDF 创建单独的图像文件,则很容易只使用这些图像文件创建一个新的 PDF,如下所示:

convert *.jpg my_new_great_file.pdf

此外,似乎convert可以直接进行 PDF 到 PDF 的转换,最终产品只需通过以下步骤进行栅格化:

convert my_great_file.pdf my_new_great_file.pdf

这将生成一个分辨率为 72 dpi 的光栅化输出 PDF。如有必要,您可以使用-density以下选项进行调整:

convert -density 144 my_great_file.pdf my_new_great_file.pdf

这将创建一个由 144 dpi 的光栅化图像组成的新 PDF。

答案3

您可以使用pdftk

pdftk input.pdf output protected.pdf owner_pw "secret" allow ScreenReaders

这将设置一个密码,禁用修改内容和复制内容但允许屏幕阅读器。

不依赖于 Java 的东西是編輯但我手头没有确切的语法。

相关内容