PDFファイルの1ページ目をイメージファイルjpgに変換するサンプルです。
imagickのサーバーへのインストールは、このブログからは除きます。
当初
$im = new Imagick(); //画像を生成したいPDFを読み込む $im->readImage('hoge.pdf'); //特定のPDFのページ 0が表紙 $im->setImageIndex(0); //サムネイルサイズ 640pxに収める $im->thumbnailImage(640, 640, true); //シャープ $im->sharpenImage(0, 1); //生成 $im->writeImage('out.jpg'); $im->destroy();
を元に関数を作成したのですが、
この記述では、階層が深いPDFを指定した場合は、エラーになるという致命的な問題が
潜んでいます。
そこで、ソースを
$im = new Imagick(); //画像を生成したいPDFを読み込む $image = file_get_contents('/var/www/xxxx/xxxx/hoge.pdf'); $im->readImageBlob($image); //特定のPDFのページ 0が表紙 $im->setImageIndex(0); //サムネイルサイズ 640pxに収める $im->thumbnailImage(640, 640, true); //シャープ $im->sharpenImage(0, 1); //生成 $im->writeImage('/var/www/xxxx/xxxx/out.jpg'); $im->destroy();
で動くようになりました。
しかし、透明の箇所が真っ黒になるという不具合がありなおかつ
複数ページあるPDFと1ページのみのPDFでは動きが違うという問題にも直面
この難題を解決するのに、3時間程度要しました。
解決済みのサンプルがこちらです。
$im = new Imagick(); //画像を生成したいPDFを読み込む $image = file_get_contents('/var/www/xxxx/xxxx/hoge.pdf'); $im->readImageBlob($image); $totalPage = $im->getImageScene(); //サムネイルサイズ 640pxに収める $im->thumbnailImage(640, 640, true); //シャープ $im->sharpenImage(0, 1); // バックグラウンドを白にする。 $im->setImageBackgroundColor('white'); //特定のPDFのページ 0が表紙 if ($totalPage != 0) { // 複数ページの場合 $im->flattenImages()->setImageIndex(0); } else { // 単一ページの場合 $im = $im->flattenImages(); } //生成 $im->writeImage('/var/www/xxxx/xxxx/out.jpg'); $im->destroy();
以上です。