PHP Imagick でPDFをPNGに変換
はじめに
今回、DBに格納したPDFバイナリ(BLOB)をAPI側でPNGに変換してレスポンスする処理をメモっときます。
いきなりですがPHPコード
$im = new imagick(); $im->setResolution(96, 96); $im->readimageblob(/** SELECTしたBLOB **/); $im->setImageIndex(0); $im->setImageBackgroundColor('#ffffff'); $im->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE); $im->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN); $im->setImageFormat("png"); $im->setOption('png:compression-level', 5); $im->stripImage(); $im->thumbnailImage(/** 表示幅 **/, 0);
$image = $im->getImageBlob();
header('Content-Description: Image File'); header("Content-Type: image/png;"); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Disposition: inline'); header('Content-Length: ' . strlen($image)); echo $image; exit;
ざっくり補足
setImageIndex(0) 、 今回のPDFは1ページだけなので、ループなし。
ヘッダ「Content-Type」 、 HttpClientでは取得できなかった。
出力で四隅に余白ができるので、もう少し処理を足せばぴったり作れる・・が、
(今回は余白できても良かったので気にしない感じ)
setResolution(96, 96)、 Windowsを意識した。
thumbnailImage(/** 表示幅 **/, 0) 、 今回のPDFはA4限定だから、高さはゼロで良い。
setOption('png:compression-level', 5)、 公式ドキュメント参照