これはCakePHP Advent Calendar 2014の15日目の記事です。大変遅くなってしまってすみません…
その中に、UploadPackという簡単にファイルのアップロードを行えるプラグインがあります。
特に、画像のアップロードを行うとそのサムネイルや指定サイズにリサイズした画像を作る機能があり、便利に使えます。
ただUploadPackでサムネイル対応してくれるのは画像ファイルだけで、PDFのサムネイルや画像化の機能はありません。
以前の案件でその機能が必要だったため、UploadPackにPDFも画像化とサムネイル生成をするための機能を追加したので、公開します。
https://github.com/stealthinu/uploadpack/commits/convert_pdf_to_image
PDFから画像を生成するためには、GhostScriptを外部コマンドを呼んで行っています。
実は始めのバージョンではImageMagickで(内部でGhostScriptが呼ばれて)行っていました。
しかし、実際に稼働させてみるとCMYK(0,0,0,0)の色と透明色で色の違いが出てしまいました。
RGBではこの問題は起きず、CMYKの場合でのみ発生しました。
これを作ったのは印刷関係向けのWebサービスだったため、RGBの画像データよりもCMYKの画像データでアップロードされてきていたのでした。
最初、色ズレあるということで、ICCプロファイルの問題かと思い(ImageMagickで色味がおかしい、という話はだいたいICCプロファイルの問題に帰着するので)色々と調べたのですが、ICCプロファイルの問題ではなく、CMYK(0,0,0,0)と透明色とで色の違いが出ているということがわかりました。
また調査していく中で、GhostScriptを直接呼び出した場合はこの色ズレの問題が起こらず、変換後の画像品質も良い、ということがわかりました。
さらに色々とぐぐっていた中でGS直呼び出しよりImageMagick経由のほうがパフォーマンスがだいぶ悪くなるという話もありました。
というわけで、最終的にはImageMagickを使わずに直接gsコマンドを呼び出して使うような形になっています。
PHPでImageMagick使うこと自体がなにかと大変だったり、この案件はWindowsサーバだったため、ImageMagickをWindowsのxamppに入れるのはだいぶ大変なので、そういう点からもImageMagick入れずに済むならそっちのほうが良いと思います。
CakePHPアドベントカレンダーなのに、ほぼImageMagickネタとなってしまいましたがお許しを…