MAMPでImageMagickを使えるようにするのは結構大変でした。
今回、自分がやりたかったことは、MAMP上で動いているウェブアプリで、pdfファイルからpng画像を作り出すというやつでした。
しかし、phpコマンドやpeclコマンドが、MAMPのものではなく、HomeBrewでインストールしたphpになっていたため、難儀しました。
参考にさせてもらったサイトは以下の通り。
- MAMP2.0.5のPHPにImageMagickをインストール
ImageMagickのPDF変換用gsコマンドを差し替える
Issue with Imagick and also with phmagick: Postscript delegate failed / No such file or directory
とりあえず、まずHomeBrewで入れているphpを削除します。
brew uninstall php54
次に、MAMPで使うphpにパスを通します。~/.bash_profileを修正します。
cd vi .bash_profile
以下を追加します。brewで入れたphpへのパスはコメントアウトします(あれば)。
#PATH="$(brew --prefix josegonzalez/php/php54)/bin:$PATH" PATH=/Applications/MAMP/bin/php/php5.4.10/bin:/Applications/MAMP/Library/bin:$PATH export PATH
.bash_profileを再読み込みします。
source .bash_profile
そして、MAMPのダウンロードサイトから、MAMP_components_2.1.2.zipをダウンロード・解凍します。
中にあるphp-5.4.10.tar.gzを解凍し、MAMPのphpのバージョンの規定位置のincludeフォルダの中にphpフォルダとして配置し、configureします。
tar zxvf ~/Download/MAMP_components.2.1.2/php-5.4.10.tar.gz mkdir /Applications/MAMP/bin/php/php5.4.10/include mv php-5.4.10 /Applications/MAMP/bin/php/php5.4.10/include/php cd /Applications/MAMP/bin/php/php5.4.10/include/php ./configure
そして、peclのimagickをインストールします。まだimagemagickが入ってない場合はbrewで入れてください。
brew install imagemagick pecl install imagick
imagickでエラーになるようだったら、imagick-betaにしてみましょう。
PDFを画像に変換しようと思ったら、GhostScriptが必要でした。入ってない人はbrewで入れましょう。
brew install ghostscript
これで動くかと思いきや、GhostScriptの位置をImageMagickがわかってなくてエラーがでました。
教えてやりましょう。
cd /usr/local/Cellar/imagemagick/6.7.7-6/etc/ImageMagick cp delegates.xml delegates.xml.org # バックアップ vi delegates.xml
ImageMagickは処理を他のライブラリに委譲(delegate)していることが結構あります。PDF->画像もその一つです。
gsの位置を教えてやりましょう。command="gs"という文字列のgsを、/usr/local/bin/gsにすればいいはず…。
<delegate decode="eps" encode="pdf" mode="bi" command=""/usr/local/bin/gs" -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 "-sDEVICE=pdfwrite" "-sOutputFile=%o" "-f%i""/> <delegate decode="eps" encode="ps" mode="bi" command=""/usr/local/bin/gs" -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=pswrite" "-sOutputFile=%o" "-f%i""/>
これでいけるかと思ったけどまだダメだったので、ぐぐったところ、やはりgsの位置がわかってないということだったので、以下をやってみました。
ここから下はコピペしないでください!
[root@din ~]# convert -list configure | grep -i delegates DELEGATES bzlib fontconfig freetype jpeg jng png tiff x11 xml zlib [root@din ~]# ls -l /usr/bin/gs -rwxr-xr-x 1 root root 6024 Sep 30 2010 /usr/bin/gs [root@din ~]# ls -l /usr/local/bin/gs -rwxrwxr-x 1 root root 19758147 May 3 16:12 /usr/local/bin/gs [root@din ~]# mv /usr/bin/gs /usr/bin/gs.orig [root@din ~]# ln -s /usr/local/bin/gs /usr/bin [root@din ~]#
私の場合は、/usr/bin/gsが存在しなかったので、オリジナルのバックアップはせずに、/usr/local/bin/gsのシンボリックリンクを/usr/bin以下に置きました。
その後、phpでImagickを使ってpdfからpngファイルを作ることに成功。長かった…。
ちなみにそのコードはこちら。
// CodeIgniter使ってます。 class Hoges extends CI_Controller { // ... 略 private function _pdf_to_png($data) { $imagick = new Imagick(); $delete_files_if_exception = array($data['full_path']); // アップロードされたpdfのパス try { $imagick->readimage($data['full_path']); // pdfを読み込み for($i = 0; $i <= $imagick->getimagescene(); $i++) { $imagick->setimageindex($i); // ページを指定 // 出力予定の画像のパスを定義 $image_file_path = "{$data['file_path']}/{$data['raw_name']}_{$i}.png"; // ページを画像として出力 $imagick->writeimage($image_file_path); // 出力予定の画像のパスを削除用配列に入れとく array_push($delete_files_if_exception, $image_file_path); } // 処理が終わったので後処理 $imagick->destroy(); return true; } catch (Exception $e) { // 例外が発生したので後処理 $imagick->destroy(); // 例外が起きたので出力した画像を削除する foreach($delete_files_if_exception as $file) { unlink($file); } echo $e->getMessage(); return false; } } }
まぁこんな感じです。
丸一日解決法を探してめげそうになってましたが、こちらの内容で全部うまくいきました。ありがとうございます!
ちょっと補足を…
delegates.xml の修正の説明で「”(ダブルクォーテーション)」が実体参照化されて"になってしまっていますが、要は参照先を
gs
から
/usr/local/bin/gs
に変えるということですね。僕のファイルでは81,82行目にあたりました。