Dompdf は PHP 上で HTML を元に PDF ファイルを生成してくれるライブラリです。CSS についてはブラウザほど高機能ではありませんが、HTML によって楽に整った PDF を生成できます。
dompdf/dompdf: HTML to PDF converter for PHP
Dompdf で img タグ等によって画像を埋め込む時、しばしばなかなか解決しない時があります。IDE から見えている設定やパスの書き方を変えても”Image not found or type unknown”と書かれた箱が画像の代わりに出力されるばかりです。これの原因の把握する方法を紹介します。
ここで扱う dompdf のバージョンは v1.1.1 です。
まず一番に見るべきなのはグローバル変数の $_dompdf_warnings
です。
Usage · dompdf/dompdf Wiki
/** dompdf の警告エラーを表示 */ function dumpDompdfLog(){ // スコープ global $_dompdf_warnings; var_dump($_dompdf_warnings); /** 出力例 array:3 [ 0 => "file_get_contents(): Passing null to parameter #2 ($use_include_path) of type bool is deprecated" 1 => """ Permission denied on /work/backend/public/cal2.png. The file could not be found under the paths specified by Options::chroot. \n /work/backend/public/cal2.png """ 2 => "file_get_contents(): Passing null to parameter #2 ($use_include_path) of type bool is deprecated" ] */ }
Dompdf は可能な限り処理を進める方針で作られています。これは少々の問題があってもそれらしい PDF が出力されるという点で便利ですが、エラーが目立たないという欠点があります。こういった時、エラーはログファイル等のどこかしらに貯められます。Dompdf の場合、こういった致命的でないエラーは $_dompdf_warnings というグローバル変数に格納されていきます。これを dump することで何が起きているのか正確にわかります。Dompdf の PDF 上に出力される画像エラーはエラー内容に関わらず”Image not found or type unknown”ですが、実際には Permission denied ということもあります。
次に見るべきは画像エラーの詳しい内容です。これは \Dompdf\Image\Cache::resolve_url メソッドの中を見るといいです。resolve_url は画像 URL を解決するためのメソッドで、この中で画像を読み込めない時のエラーの処理も行います。このメソッドは大きく try catch でくくられており、例外として投げられたエラーを catch ないでざっくばらんにまとめています。このざっくばらんを解体して細かく見ることでエラー原因がわかりやすくなります。
dompdf/Cache.php at master · dompdf/dompdf
} catch (ImageException $e) { // $_dompdf_warnings で見れないエラーの細かい部分を表示 var_dump($e); // スタックトレースの出力 var_dump($e->getTrace()); if ($tempfile) { unlink($tempfile); } $resolved_url = self::$broken_image; $type = "png"; $message = self::$error_message; Helpers::record_warnings($e->getCode(), $e->getMessage() . " \n $url", $e->getFile(), $e->getLine()); self::$_cache[$full_url] = $resolved_url; }