我想做与 OCR 相反的事情,我不想将图像转换为文本,我想将 PDF 中的所有文本转换为图像,这样就不能随意选择和复制。
在 Acrobat Pro 中没问题,但我真的很想从 Linux 命令行使用一些东西,因为我有很多这样的 PDF 需要处理,而且它们目前都在一个网站上。如果我可以在服务器上进行此更改,那么我就可以节省数小时的下载、在 Acrobat 中处理、重新上传的工作,这些工作需要通过我的 CMS 界面来完成,而我的界面非常慢。
因此,如果有一些 PDF 工具可以轻松地做到这一点,我可以从终端使用,那就太棒了。
答案1
我想你的目标是使它更加困难从 PDF 中选择并复制文本。因为这是你唯一可以实现的目标。(如果有办法在屏幕上看到 PDF 页面,那么就有办法以某种方式访问文本或图像内容,尽管比复制粘贴更困难......我想你知道这一点。)
您有三个选择:
- 将您的 PDF 页面转换为整页像素图像并将这些图像再次包装成多页 PDF。
- 将所有嵌入字体的字形转换为矢量轮廓。
- “加密”您的 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 软件至输出。)
上图显示了使用 ImageMagick 默认分辨率(72 PPI)在 600% 缩放级别下创建的像素化 PDF 页面的屏幕截图。如果您需要更好的分辨率,例如 200 PPI,请-density 200
在命令行中添加参数:
convert \
-density 200 \
pdf-with-fonts.pdf \
pdf-with-images.pdf
上图显示了使用 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 分钟进行转换。
轮廓的优点是页面的文本保持清晰锐利且不像素化,并且您可以在任何级别放大文本而不会失去清晰度。您可以在下一个屏幕截图中看到这一点:
缺点是文件的大小。(顺便说一句,我使用 Adobe 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 查看器没有帮助。它仍然无法解锁以进行复制或打印。
该方法的优点在于执行速度快,文件大小几乎相同。
规避?
当然,再次删除“加密”也同样容易:
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 的东西是編輯但我手头没有确切的语法。