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 タグを使って契約書っぽい書式にして、必要なデータを埋め込めば完了です。