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
オプションの脆弱性に対する回避策として、関連ファイルの処理をしないように制限されていることが分かりました。
- VU#332928 - Ghostscript contains multiple -dSAFER sandbox bypass vulnerabilities
- ImageMagick security policy 'PDF' blocking conversion - Stack Overflow
- 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