【问题标题】:What are best parameters to run ImageMagick to convert low quality pdf to images (for OCR)运行 ImageMagick 将低质量 pdf 转换为图像(用于 OCR)的最佳参数是什么
【发布时间】:2025-12-31 00:15:11
【问题描述】:

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

然而 ImageMagick 产生的图像质量非常低,而 Ocropus 几乎无法识别任何东西。我想了解处理低质量 pdf 以向 OCR 提供尽可能高质量的图像的最佳参数是什么。

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

【问题讨论】:

    标签: linux pdf image-processing imagemagick ghostscript


    【解决方案1】:

    您可能需要考虑至少两个其他工具:

    • pdfimagespoppler-utils 软件包一起提供,可以轻松地从 PDF 中提取图像而不会降级。
    • pdfsandwich,只需运行 pdfsandwich inputfile.pdf 即可为您提供 OCR 文件。您可能需要调整选项以获得不错的结果。请参阅the official page 了解更多信息。

    【讨论】:

      【解决方案2】:

      您可以通过键入了解 ImageMagick 的“委托”(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 可以在 one 中执行 PDF => PNG。而且速度更快。而且质量要好得多。

      关于 IM 通过 Ghostscript 委托处理 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)。并使用 Ghostscript 的most recent version 8.71(即将发布:9.01)!以下是示例命令:

      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”标签......

      【讨论】:

        【解决方案3】:

        -density 600 左右应该可以满足您的需求。

        【讨论】:

          最近更新 更多