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; }" これが無いと改ページしても、最後に余計なページができてしまう。