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

Use*_*er0 7 pdf

我想做OCR的反面,我不想把图片转成文字,我想把PDF中的所有文字都转成图片,这样就不能随便选择和复制了。

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

因此,如果有一些可以轻松完成此操作的 PDF 工具,我可以从终端使用,那将非常棒。

Kur*_*fle 7

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

您有三个选择:

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

如果使用正确的工具,这 3 种方法中的每一种都非常容易应用。:-)

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

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

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

您可以像这样使用ImageMagickconvert命令:

 convert              \
   pdf-with-fonts.pdf \
   pdf-with-images.pdf
Run Code Online (Sandbox Code Playgroud)

ImageMagick 只能直接处理光栅图像,不能处理任何其他格式。由于它不能直接处理 PDF,它会自动使用Ghostscript作为其委托。因此也需要安装 Ghostscript!Ghostscript 将创建所需的光栅图像作为 ImageMagick 的输入。

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

默认情况下,convert将使用 72ppi 的分辨率。这可能不足以很好地阅读(但通过将OCR 软件应用于输出来规避您的“保护”会困难得多。)

像素化 PDF 页面,72 PPI,600% 缩放

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

 convert              \
  -density 200        \
   pdf-with-fonts.pdf \
   pdf-with-images.pdf
Run Code Online (Sandbox Code Playgroud)

像素化 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
Run Code Online (Sandbox Code Playgroud)

在我的测试中,同样的 219 页 PDF(大小为 1 MByte)转换为 186 MByte 的输出文件,转换需要 6 分钟。

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

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

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

规避?

绕过这个措施很容易:OCR 会很好地工作。

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

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

QPDF 对此有很好的支持:

qpdf                    \
  --encrypt  ""  ""  40 \
  --print=n             \
  --modify=n            \
  --extract=n           \
  --                    \
    uncrypted.pdf       \
    crypted.pdf
Run Code Online (Sandbox Code Playgroud)

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

  • --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 
Run Code Online (Sandbox Code Playgroud)

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

 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
Run Code Online (Sandbox Code Playgroud)

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

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

这种方法的优点在于它的快速执行和几乎相同的文件大小。

规避?

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

qpdf --decrypt crypted.pdf decrypted.pdf
Run Code Online (Sandbox Code Playgroud)

4. 总结

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

对于缓慢的结果,以及潜在的巨大文件大小(但并不总是好看的页面)和更多移除保护的工作,请对所有页面使用像素化

对于更慢的结果(但总是更好看的页面)以及更多的工作来移除保护,请使用所有文本的矢量轮廓方法。

请始终注意,所有这些方法都不能绝对保护您的 PDF 页面的内容。它们只会使提取更加不便。


Gia*_*968 6

似乎您最好的选择是使用ImageMagick从命令行将 PDF 转换为大多数类型的图像。这个站点提供了一些关于如何使用 PHP 和 ImageMagick 来自动化这个任务的不错的细节。但在最基本的层面上,该站点解释了从终端命令行执行此操作的基础知识

convert my_great_file.pdf my_great_file.png
Run Code Online (Sandbox Code Playgroud)

要将输出格式从 PNG 更改为 JPEG,只需像这样更改目标文件名的文件扩展名:

convert my_great_file.pdf my_great_file.jpg
Run Code Online (Sandbox Code Playgroud)

您的情况的诀窍是您需要确保您的托管服务已安装 ImageMagick。如果没有,他们是否愿意安装它。根据我的经验,ImageMagick 是一个非常常用的工具,它应该在那里。唯一潜在的“问题”是安装不是通过内置的 PDF 支持完成的。但那是你要弄清楚和处理的。

此外,如果您从 PDF 创建单独的图像文件,则可以很容易地使用这些图像文件创建新的 PDF,如下所示:

convert *.jpg my_new_great_file.pdf
Run Code Online (Sandbox Code Playgroud)

此外,似乎convert可以通过简单地将最终产品光栅化来直接将 PDF 转换为 PDF:

convert my_great_file.pdf my_new_great_file.pdf
Run Code Online (Sandbox Code Playgroud)

这将生成具有 72 dpi 光栅化输出的 PDF。如果需要,您可以使用如下-density选项进行调整:

convert -density 144 my_great_file.pdf my_new_great_file.pdf
Run Code Online (Sandbox Code Playgroud)

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

  • @JakeGould:您的回答有效,但方法过于复杂。最好使用 ImageMagick 的 `convert`(无论如何都使用 *Ghostscript 委托*进行 PDF 解释)进行 **直接 PDF 到 PDF 转换**:`convert vector.pdf rasterized.pdf` 将输出所有输入页面 * vector.pdf* as *rasterized.pdf* 其中所有页面均由默认分辨率为 72 PPI 的图像组成。要在 200 PPI 的输出中获得更高的分辨率,只需添加“-密度 200”... (2认同)