ImageMagick で PS や PDF を扱えないわけは脆弱性対策でした

作成

ImageMagick を用いて PDF ファイルを PNG に変換しようとしたところ、以下のエラーが出ました。

% convert sample.pdf sample.png
convert: attempt to perform an operation not allowed by the security policy `PDF' @ error/constitute.c/IsCoderAuthorized/408.
convert: no images defined `sample.png' @ error/convert.c/ConvertImageCommand/3273.

ImageMagick のバージョンは次の通り。

% convert -version
Version: ImageMagick 7.0.8-49 Q16 x86_64 2019-06-09 https://imagemagick.org
Copyright: © 1999-2019 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI Modules OpenCL OpenMP(4.5) 
Delegates (built-in): bzlib cairo fontconfig freetype gslib heic jbig jng jp2 jpeg lcms lqr ltdl lzma openexr pangocairo png ps raqm raw rsvg tiff webp wmf x xml zlib

エラー内容で検索すると、 Ghostscript の -dSAFER オプションの脆弱性に対する回避策として、関連ファイルの処理をしないように制限されていることが分かりました。

具体的には、ImageMagick の policy.xml の以下の行によって、 PS, PS2, PS3, EPS, PDF, XPS ファイルの処理が制限されています。

<policy domain="coder" rights="none" pattern="{PS,PS2,PS3,EPS,PDF,XPS}" />

この行をコメントアウトすることで、制限はなくなり処理できるようになります(Ghostscript が対策済みであることを確認しましょう)。

しかし毎度 policy.xml を編集するのも億劫なので、別のツールを使うのが楽です。例えば、 PDF を PNG に変換するのであれば、 poppler パッケージに含まれる pdftoppm コマンドを用いて次のように行なえます。

% pdftoppm -png sample.pdf

オプション無しでは PPM 画像が生成されます。

% pdftoppm sample.pdf

JPEG など他のフォーマットでの出力にも対応しています。

% pdftoppm -jpeg sample.pdf