ImageMagick 拆分 PDF 输出文件名始终从零开始

ImageMagick Split PDF Output File Name Always Starts at Zero

我 运行 在 ImageMagick 中使用以下命令拆分 PDF:

convert file.pdf[5-10] file.png

生成的输出文件始终以零开头作为后缀。即:

file-0.png, file-1.png, file-2.png...

知道我可能做错了什么吗?文档指出文件的后缀应从 5 开始,与提取页面的页码相匹配。

您看到您描述的结果是因为 ImageMagick 的多页图像格式的页数是 零基:第 1 页将有索引 0,第 2 页将有索引 1,等等

此外,ImageMagick 本身无法处理 PDF 输入文件:它使用 Ghostscript 作为其 'delegate' -- Ghostscript 使用PDF 首先为每个 PDF 页面发出一个光栅文件。 ImageMagick 只处理这些光栅文件。

根据您的确切 ImageMagick 版本和 IM 设置,这可能会导致生成间接 PNG 输出,并且转换链可能如下所示:

PDF --> PPM (portable pixmap) --> PNG
     ^                         ^
     |                         |
     |                         +-- (handled by ImageMagick)
     +-- (handled by Ghostscript)

如果运气不好,结果会很慢,质量也可能达不到预期。

要验证 convert a.pdf a.png 命令中究竟发生了什么,您可以添加 -verbose 参数。这将向您展示 IM 用来处理 PDF 输入的 Ghostscript 命令:

convert -verbose a.pdf a.png

 /var/tmp/magick-15951W3TZ3WRpwIUk1 PNG 612x792 612x792+0+0 8-bit sRGB 3.73KB 0.000u 0:00.000
 a.pdf PDF 612x792 612x792+0+0 16-bit sRGB 3.73KB 0.000u 0:00.000
 a.pdf=>a.png PDF 612x792 612x792+0+0 8-bit sRGB 2c 2.95KB 0.000u 0:00.000

 [ghostscript library] -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT \
   -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=pngalpha" \
   -dTextAlphaBits=4 -dGraphicsAlphaBits=4 "-r72x72" \
  "-sOutputFile=/var/tmp/magick-15951W3TZ3WRpwIUk%d" \
  "-f/var/tmp/magick-15951nJD8-fF8kA7j" \
  "-f/var/tmp/magick-15951JTZDMwtEswHn"

(如您所见,my IM 安装设置为执行 PDF->PNG 转换,无需绕过 PPM...您的里程数可能会有所不同。)

直接使用 Ghostscript 代替 运行 IM convert 命令可能会获得更好的结果。 (如果 ImageMagick 完全适用于 PDF->PNG 转换,那么您肯定安装了一个有效的 Ghostscript。)所以您可以试试这个:

gs                  \
 -o file-%03d.png   \
 -sDEVICE=pngalpha  \
  file.pdf

-%03d文件名后缀会导致Ghostscript输出file-001.png,file-002.png,file-003.png.

但是,如果你运气不好并且安装了旧版本的 Ghostscript,文件名也会以 file-000 开头...

在任何情况下,由于您的示例命令似乎表明您只想从 PDF 文件(而不是 [=51] 转换 页面范围 (5--10) =]所有页),这里是要使用的命令:

gs                  \
 -o file-%03d.png   \
 -sDEVICE=pngalpha  \
 -dFirstPage=5      \
 -dLastPage=10      \
  file.pdf

但这里的坏消息是: Ghostscript 将STILL 从命名输出开始文件为 file-001.png(第 5 页)... file-005.png(第 10 页)。

要解决这个问题,您还必须为前 4 页生成 PNG,然后再次删除它们:

gs                  \
 -o file-%03d.png   \
 -sDEVICE=pngalpha  \
 -dFirstPage=1      \
 -dLastPage=10      \
  file.pdf

rm -rf file-00{1,2,3,4}.png

我最终使用 -scene # 命令行参数解决了这个问题。

这会使输出从所需的索引处开始。为了后代:

convert file.pdf -scene 5 file-%d.png