Laravelで構築している案件で、契約書的なものをExcelでテンプレートを作っておいて、そこにデータを埋め込んでPDFを生成したいという話が出てきました。
さっそく、「laravel excel pdf」でぐぐってみたら、なんだかみなさん苦労している雰囲気が。
ただ、ヒヤリングをしたところ、Excelによるテンプレートは必須ではなく、必要事項が記入されていればOKとのこと。
ハードルがひとつなくなりました。
こちらのさいとを見ながら実装してみました。
まずパッケージをインストールします。
% composer require barryvdh/laravel-dompdf
日本語を表示するには、日本語フォントファイルを用意しておく必要があります。
こちらからダウンロードします。
≫ https://moji.or.jp/ipafont/ipafontdownload/
IPAexフォント Ver.004.01 のリンクをクリックして進みます。
ライセンスの下にあるリンクからダウンロードできます。
解凍してみると、参考サイトとはファイル名が異なっていますが、読み替えれば大丈夫でしょう。
*.ttf を、laravel 内の storage/fonts フォルダにコピーします。
% mkdir storage/fonts % cp -p ~/Downloads/IPAexfont00401/*.ttf storage/fonts
これで準備ができました。
bladeでビューを作ります。
今回は売買契約書なので、sales_certificate.blade.php というファイル名にしておきます。
書体は明朝体を指定します。
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <style type="text/css"> @font-face { font-family: ipam; font-style: normal; font-weight: normal; src: url('{{ storage_path('fonts/ipaexm.ttf') }}') format('truetype'); } @font-face { font-family: ipam; font-style: bold; font-weight: bold; src: url('{{ storage_path('fonts/ipaexm.ttf') }}') format('truetype'); } body { font-family: ipam !important; } </style> </head> <body> はろーわーるど! </body> </html>
route/web.php にルーティングを追加します。
Route::get('/salesCertificate', [App\Http\Controllers\IndexController::class, 'salesCertificatePdf'])->name('salesPdf');
コントローラからPDFを出力してみます。
public function salesCertificatePdf() { $pdf = \PDF::loadView('sales_certificate'); return $pdf->stream('sales_certificate.pdf'); }
無事にPDFを表示できました!
あとは、table タグを使って契約書っぽい書式にして、必要なデータを埋め込めば完了です。