Laravel5+laravel-snappyでPDF出力する際のヘッダー・フッター設定とか改ページしたい時のあれこれ


Laravel5+laravel-snappyでPDF出力機能実装した際に、少しハマったところがあったのでメモ。

導入方法はこの記事参考にさせていただきました。

Laravel5でLaravel-Snappy(wkhtmltopdf)を使用してPDF出力機能を実装してみる

環境

  • PHP7.1.1
  • Laravel5.3
  • laravel-snappy 0.3.1
route/web.php
Route::get('/', function() {
        $pdf = PDF::loadView('pdf', ['pages' => range(1, 3)])
            ->setPaper('A4')                                // 用紙サイズ
            ->setOption('encoding', 'utf-8')                // Encoding
            ->setOption('margin-top', 10)                   // 上マージン
            ->setOption('margin-bottom', 10)                // 下マージン
            ->setOption('margin-left', 10)                  // 左マージン
            ->setOption('margin-right', 10)                 // 右マージン
            ->setOption('orientation', 'Landscape')         // 横向き
            ->setOption('header-font-size', 16)             // ヘッダーフォントサイズ
            ->setOption('header-center', 'Header Center')   // ヘッダー中央
            ->setOption('header-left', 'Header Left')       // ヘッダー右
            ->setOption('header-right', 'Header Right')     // ヘッダー左
            ->setOption('footer-font-size', 16)             // フッターフォントサイズ
            ->setOption('footer-left', 'Footter Left')      // フッター右
            ->setOption('footer-right', 'Footter Right')    // フッター左
            ->setOption('footer-center', '[page] ページ')    // フッター中央 [page]でページ番号が自動で入ります
            ->setOption('header-font-name', 'IPAexMincho')  // ヘッダーフォント名
            ->setOption('footer-font-name', 'IPAexMincho'); // フッターフォント名

        // インラインでPDF表示
        return $pdf->inline();

        // ダウンロードする場合
        return $pdf->download('download.pdf');
});

ヘッダー・フッター周りはsetOptionで設定します。これがわからず、HTML側のフォントと違うフォントで出力されてしまって結構ハマった。

Bladeファイルを作成

resource/view/pdf.blade.php
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
    <head>
        <title>PDF出力テスト</title>
        <style>
            .page {
                page-break-after: always;
                page-break-inside: avoid;
            }
            .page:last-child{
                page-break-after: auto;
            }
        </style>
    </head>
    <body>
@foreach ($pages as $page)
        <div class="page">
            {{ $page }}ページ目
        </div>
@endforeach
    </body>
</html>

PDF出力でBladeテンプレート使えるのはかなり便利(小並感

".page:last-child{ page-break-after: auto; }" これが無いと改ページしても、最後に余計なページができてしまう。

出力するとうまく改ページされて表示できます。