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
我 运行 在 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