Laravel9 + domPDF

業務でdomPDFをインストールしたが、リリースタイミングで若干手順が違うのか、複数サイトで情報が微妙に異なっていた。あちこち参考にさせていただいたので、私の試した方法も一例として紹介します。

■ インストール

ライブラリはcomposerコマンドのみです。config/app.php などの追記はしていませんが、最後に「composer dump-autoload」は実施が必要です。

composer require barryvdh/laravel-dompdf

フォントをWebサイトからダウンロードして配置します。私はIPAexフォントを利用させていただきました。

ダウンロードしたフォントを「storage/fonts」を作成して配置します。Linuxで fontsフォルダを777権限にします。

下記のコマンドでdomPDF設定ファイル(config/dompdf.php)を作成します。

php artisan vendor:publish --provider="Barryvdh\DomPDF\ServiceProvider"

config/dompdf.php では、フォントの埋め込み設定だけ変更しました。

enable_font_subsetting = false

dompdfを使った処理を実行すると、フォントのキャッシュファイルが作成されます。当初は、フォントファイルとキャッシュで随時作られるファイルのフォルダを分けようとfont_cacheの設定を変更してみたのですが、fontsフォルダに作られるキャッシュもあり、ファイルは違いますが、2箇所に随時作られるファイルができてしまったので、デフォルトに戻しました。

■ 実装例

public function testDompdf(Request $request) {

    // ダミーデータ
    $list = array();
    for ($i=0;$i<50;$i++) {
        $list[] = $i;
    }

    $pdf = \PDF::loadView('dompdf_sample', ['sample_list' => $list]);
    // ブラウザ表示
    return $pdf->stream('dispname.pdf');

    // ダウンロード
    // return $pdf->download();
}
<html lang="ja">
    <head>
        <title>dompdf-sample</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <style>
            @font-face{
                font-family: ipaexm;
                font-style: normal;
                font-weight: normal;
                src: url("{{ storage_path('fonts/ipaexm.ttf')}}") format('truetype');
            }
            body {
                font-family: ipaexm !important;
            }
        </style>
    </head>
    <body>
        <h2>domPDFの出力サンプル</h2>

        <div>文字を出力</div>
       
	テーブルを出力
        <table>
            <tr>
                <th>列見出し</th>
            </tr>
            @foreach ($sample_list as $value)
            <tr>
                <td>{{ $value }}</td>
            </tr>
            @endforeach
        </table>
    </body>
</html>

実装サンプルの細かい説明は省きますが、なるべく最小限の実例としているつもりです。HTML内に@font-faceを記載しない実装例も見かけましたが、私は書かないと日本語がうまく表示されませんでした。また、return view()を利用したサイトもありましたが、PDFにならなかったので$pdf->streamを利用しています。

Author: jester