中年プログラマーの息抜き

ブログをはじめました。気の向くままにプログラム関連ネタをメモしていきます。

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)、 公式ドキュメント参照

www.php.net