There's an echo in my head

日々のメモ。

ImageMagickのconvertで複数ページのPDFを複数の画像ファイルに変換できないとき

たとえば複数ページのPDFをJPGの複数ファイルに変換するときは次のようにする。

$ convert foo.pdf foo.jpg

うまくいくとfoo-0.jpg, foo-1.jpg, ... というように展開される。 *1

ただこれがうまくいかないことがあって、複数ページなのに最初のページしか出力されないことがある。これはAdobe系のツールで生成されたPDFとGhostscriptが出力に使うpngalphaの相性が悪いために起こるらしく、詳しくはpossible bug converting acrobat pdf to other formatsに書いてある。

対応としては、pngalphaの代わりにpnmrawを使うようにdelegates.xmlを設定してやればよい。

homebrewで入れた場合delegates.xml/usr/local/opt/imagemagick/etc/ImageMagick/delegates.xmlにあるので、これを書き換える。

cp /usr/local/opt/imagemagick/etc/ImageMagick/delegates.xml{,.org}
vim /usr/local/opt/imagemagick/etc/ImageMagick/delegates.xml
diff /usr/local/opt/imagemagick/etc/ImageMagick/delegates.xml{.org,} 

pngalphadecode="ps:alpha"の行にだけ存在するので、その一箇所だけを書き換えれば良い。

--- /usr/local/opt/imagemagick/etc/ImageMagick/delegates.xml.org   2013-05-28 20:14:47.000000000 +0900
+++ /usr/local/opt/imagemagick/etc/ImageMagick/delegates.xml  2013-05-28 20:11:30.000000000 +0900
@@ -102,7 +102,7 @@
   <delegate decode="ps" encode="eps" mode="bi" command="&quot;gs&quot; -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=epswrite&quot; &quot;-sOutputFile=%o&quot; &quot;-f%i&quot;"/>
   <delegate decode="ps" encode="pdf" mode="bi" command="&quot;gs&quot; -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=pdfwrite&quot; &quot;-sOutputFile=%o&quot; &quot;-f%i&quot;"/>
   <delegate decode="ps" encode="print" mode="encode" command="lpr &quot;%i&quot;"/>
-  <delegate decode="ps:alpha" stealth="True" command="&quot;gs&quot; -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=pngalpha&quot; -dTextAlphaBits=%u -dGraphicsAlphaBits=%u &quot;-r%s&quot; %s &quot;-sOutputFile=%s&quot; &quot;-f%s&quot; &quot;-f%s&quot;"/>
+  <delegate decode="ps:alpha" stealth="True" command="&quot;gs&quot; -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=pnmraw&quot; -dTextAlphaBits=%u -dGraphicsAlphaBits=%u &quot;-r%s&quot; %s &quot;-sOutputFile=%s&quot; &quot;-f%s&quot; &quot;-f%s&quot;"/>
   <delegate decode="ps:cmyk" stealth="True" command="&quot;gs&quot; -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=pam&quot; -dTextAlphaBits=%u -dGraphicsAlphaBits=%u &quot;-r%s&quot; %s &quot;-sOutputFile=%s&quot; &quot;-f%s&quot; &quot;-f%s&quot;"/>
   <delegate decode="ps:color" stealth="True" command="&quot;gs&quot; -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=pnmraw&quot; -dTextAlphaBits=%u -dGraphicsAlphaBits=%u &quot;-r%s&quot; %s &quot;-sOutputFile=%s&quot; &quot;-f%s&quot; &quot;-f%s&quot;"/>
   <delegate decode="ps:mono" stealth="True" command="&quot;gs&quot; -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=pbmraw&quot; -dTextAlphaBits=%u -dGraphicsAlphaBits=%u &quot;-r%s&quot; %s &quot;-sOutputFile=%s&quot; &quot;-f%s&quot; &quot;-f%s&quot;"/>

追記

delegates.xmlのパスはconvert -list delegateで表示される。

$ convert -list delegate

Path: /usr/local/Cellar/imagemagick/6.8.0-10/etc/ImageMagick/delegates.xml
(snip)

homebrewで入れた場合、/usr/local/opt/imagemagick/usr/local/Cellar/imagemagick/{version}へのエイリアスになっているので、ImageMagickを入れるたびに上記の修正が必要になるかもしれない。

*1:単一ページの場合にはfoo.jpgになる

このブログに出てくるコードスニペッツは、引用あるいは断りがない限りMITライセンスです。