MAMPでImageMagickを使ってpdfからpng生成

MAMPでImageMagickを使えるようにするのは結構大変でした。
今回、自分がやりたかったことは、MAMP上で動いているウェブアプリで、pdfファイルからpng画像を作り出すというやつでした。
しかし、phpコマンドやpeclコマンドが、MAMPのものではなく、HomeBrewでインストールしたphpになっていたため、難儀しました。

参考にさせてもらったサイトは以下の通り。

とりあえず、まず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="&quot;/usr/local/bin/gs&quot; -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 &quot;-sDEVICE=pdfwrite&quot; &quot;-sOutputFile=%o&quot; &quot;-f%i&quot;"/>
  <delegate decode="eps" encode="ps" mode="bi" command="&quot;/usr/local/bin/gs&quot; -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=pswrite&quot; &quot;-sOutputFile=%o&quot; &quot;-f%i&quot;"/>

これでいけるかと思ったけどまだダメだったので、ぐぐったところ、やはり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;
    }
  }
}

まぁこんな感じです。


カテゴリー CodeIgniter, PHP | タグ     | パーマリンク

コメント・トラックバック一覧

  1. しげる says:

    丸一日解決法を探してめげそうになってましたが、こちらの内容で全部うまくいきました。ありがとうございます!
    ちょっと補足を…
    delegates.xml の修正の説明で「”(ダブルクォーテーション)」が実体参照化されて"になってしまっていますが、要は参照先を
    gs
    から
    /usr/local/bin/gs
    に変えるということですね。僕のファイルでは81,82行目にあたりました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です