Laravel5.8環境で日本語PDF出力(Laravel-dompdf)
laravel-dompdfパッケージのインストール
composer.jsonファイルに
"barryvdh/laravel-dompdf": "^0.8.5", を追加して
プロジェクトディレクトリ(/home/public_html)に移動し下記コマンドを実行する。
1. composer updateを実行
2. composer require barryvdh/laravel-dompdf
PDF出力(Route設定)
Route::get('/payslip', 'Payslip\PayslipController@index');
Route::group(['middleware' => 'auth.check.user'], function () {
Route::get('/payslip/pdf', [ 'as' => 'payslip.pdf', 'uses' => 'Payslip\PayslipController@printPDF']);
});
コントローラー (PayslipController)
# HTML確認時
return view('payslip.pdf', $data);
# PDFファイル出力時
$pdf = PDF::loadView('payslip.pdf', $data)
->setPaper('a4')->setWarnings(false);
return $pdf->download('payslip.pdf');
view
- resource/view/payslip/index.blade.phpを作成し、下記のリンクを貼る
aタグのリンクURL:{{route('payslip.pdf')}}?ym=201911 (例:2019年11月分)
- resource/view/payslip/pdf.blade.phpを作成し、PDF用内容を実装
日本語化への対応
- fontsディレクトリの作成 storage/fonts
- IPAフォントのダウンロード https://ipafont.ipa.go.jp/old/ipafont/download.html zipファイル解凍後、storage/fonts/ディレクトリの下にコピー
-
CSSの@font-faceを利用
@font-face{ font-family: ipag; font-style: normal; font-weight: normal; src:url('{{ storage_path('fonts/ipag.ttf')}}'); } @font-face{ font-family: ipag; font-style: bold; font-weight: bold; src:url('{{ storage_path('fonts/ipag.ttf')}}'); }
上記で日本語が正しく表示される
PDFのファイルサイズ問題
日本語化はできましたが、作成したファイルのサイズを確認すると4.5MBになっている。
下記の設定でファイルサイズ問題解決できる。
php artisan vendor:publish --provider="Barryvdh\DomPDF\ServiceProvider"を実行
config/dompdf.php "enable_font_subsetting" => trueにする
4.5MBもあったファイルサイズが8KBのサイズまで小さくなり
レイアウト崩れる問題
今回はユーザーの給与明細をPDFで出力する機能の実装で、ユーザー名などはdivで表などはtableでviewファイルを実装。
最初はdivなどを使いhtmlで綺麗に表示されて、PDF出力モードに切り替えPDFに書き出すとレイアウトが崩れてしまう(困った)。
結果的にdivの部分を全部tableに書き直してなんとか解決できた。
参考サイト
https://reffect.co.jp/laravel/how_to_create_pdf_in_laravel