linux - 运行 ImageMagick 将低质量 pdf 转换为图像(用于 OCR)的最佳参数是什么

标签 linux pdf image-processing imagemagick ghostscript

我有几个低质量的 pdf。我想使用 OCR——更准确地说 Ocropus从他们那里得到文本。要使用,我先使用 ImageMagick -- 将 pdf 转换为图像的命令行工具 -- 将这些 pdf 转换为 jpg 或 png。

但是 ImageMagick 生成的图像质量非常低,Ocropus 几乎无法识别任何内容。我想了解处理低质量 pdf 以向 OCR 提供尽可能好的质量图像的最佳参数是什么。

我找到了 this page , 但我不知道从哪里开始。

最佳答案

您可以通过键入了解 ImageMagick 的“委托(delegate)”(IM 使用的外部程序,例如 Ghostscript)的详细设置

convert -list delegate

(在我的系统上,这是一个包含 32 个不同命令的列表。)现在要查看哪些命令用于转换为 PNG,请使用:

convert -list delegate | findstr /i png

好的,这是针对 Windows 的。你没有说你使用哪个操作系统。 [*]如果您使用的是 Linux,请尝试以下操作:

convert -list delegate | grep -i png

您会发现 IM 只从 PS 或 EPS 输入中生成 PNG。那么 IM 如何从您的 PDF 中获取 (E)PS 呢?简单:

convert -list delegate | findstr /i PDF
convert -list delegate | grep -i PDF

啊!它使用 Ghostscript 进行 PDF => PS 转换,然后再次使用 Ghostscript 进行 PS => PNG 转换。可行,但不是最有效的方式如果您知道 Ghostscript 可以 一次 处理 PDF => PNG。而且更快。而且质量更好。

关于 IM 通过 Ghostscript 委托(delegate)处理 PDF 到图像的转换,您首先应该了解两件事:

  1. 默认情况下,如果您不提供额外参数,Ghostscript 将输出分辨率为 72dpi 的图像。这就是为什么 Karl 的回答建议添加 -density 600,它告诉 Ghostscript 使用 600 dpi 的分辨率输出图像。
  2. IM 绕道调用 Ghostscript 两次以先转换 PDF => PS 然后 PS => PNG 是一个真正的错误。因为您永远不会赢,并且很难在第一步中保持质量,但经常会失去一些质量。原因:
    • PDF 可以处理透明胶片,而 PostScript 则不能。
    • PDF 可以嵌入 TrueType 字体,而 Ghostscript 不能。等等。 PS => PDF 方向的转换不是那么重要....)

这就是为什么我建议您直接使用 Ghostscript 将 PDF 一次性转换为 PNG(或 JPEG)。并使用 most recent version 8.71 (即将发布:9.01)的 Ghostscript!以下是示例命令:

gswin32c.exe ^
  -sDEVICE=pngalpha ^
  -o output/page_%03d.png ^
  -r600 ^
  d:/path/to/your/input.pdf

(这是 Windows 的命令行。在 Linux 上,使用 gs 代替 gswin32c.exe,使用 \ 代替 ^.) 此命令期望找到一个 output 子目录,它将在其中为每个 PDF 页面存储一个单独的文件。要生成高质量的 JPEG,请尝试

gs \
  -sDEVICE=jpeg \
  -o output/page_%03d.jpeg \
  -r600 \
  -dJPEGQ=95 \
  /path/to/your/input.pdf

(Linux 命令版本)。这种直接转换避免了中间 PostScript 格式,后者可能会丢失原始 PDF 文件中的 TrueType 字体和透明对象信息。


[*] 噢!一开始我没看到你的“linux”标签...

关于linux - 运行 ImageMagick 将低质量 pdf 转换为图像(用于 OCR)的最佳参数是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3613015/

相关文章:

php - dompdf 不渲染来自服务器的图像,而是从外部源渲染

python - 将函数应用于 numpy 中的 3D 数组

linux - 替换 SVG 文档中的变量(在 YAML 中外部定义)

c++ - Linux 中的 Cout 和 Cin - 看不到控制台

linux - 为什么 Linux 内核内存子系统被命名为 slab

Java 循环整个代码 3 次

java - iText 变音符号(例如 D̂、M̂ 等)无法在 PDF 上正确显示

image-processing - 跟踪与人脸检测相关的人体 Blob

matlab - 使用控制点扭曲图像

linux - 如何从 apache 访问日志中分离出日期和时间字段?