調べるといろいろライブラリがある様子。
mPDF, FPDF, dompdf, TCPDF, FPDI…。
ただしLaravelでやりたいのとHTMLで作りたい、場合によってはPDFのテンプレートを使いたい、
ということだったので一番下に載せた参考サイトもあるのでTCPDF+FPDIを使うことにしました。
準備
以下の2つを追加する
composer require tecnickcom/tcpdf composer require setasign/fpdi
外部フォントの設定
TCPDFは外部のフォントを使用する場合変換が必要なようです。
実行するときにaddTTFFont()などとしてやることもできるようですが、処理負荷はかかると思われるし毎回やるのは無駄でしょう。
調べて見るとコマンドラインであらかじめ変換できるようです。
ここでは参考サイトにあった MigMixフォント を使用してみました。(見やすい良いフォントです!)
php ./vendor/tecnickcom/tcpdf/tools/tcpdf_addfont.php -b -t TrueTypeUnicode -f 32 -i ./resources/fonts/migmix-2p-regular.ttf
こうすると
vendor/tecnickcom/tcpdf/fonts下にmigmix2pという名前のファイルがいくつかでき、
コードの方でも普通に
$pdf->setFont('migmix2p', '', 20);
とすることで使えるようになりました。
テンプレートPDF設置
これはどこでも良いと思いますがresources\pdfsというディレクトリの中に設置することにします。
注意:FPDIで使えるテンプレートPDFはバージョンによって使えないものもあるようです。私の環境では少なくともExcelで出力したものは使えました。
コントローラー
TcpdfFpdiクラスはTCPDFクラスを継承してテンプレートを使えるようにしたクラスのようです。
テンプレートを使わない場合はTCPDFクラスを直接newしても使えました。
ルートは適当に定義してあげてください。
use setasign\Fpdi\TcpdfFpdi; class PDFController extends Controller { public function make_pdf(Request $request) { $pdf = new TcpdfFpdi(); // テンプレートPDFの設定 $template_path = resource_path('pdfs/template.pdf'); $pdf->setSourceFile($template_path); $pdf->setFont('migmix2p', '', 20); $pdf->setPrintHeader(false); $pdf->setPrintFooter(false); $pdf->addPage(); // テンプレートの適用 $page = $pdf->importPage(1); $pdf->useTemplate($page); // 内容の書き込み $title = 'サンプルPDF'; $titles = ['id', '名前']; $data = [ ['id' => 1, 'name' => '山田太郎'], ['id' => 2, 'name' => '甲斐花子'], ]; $pdf->writeHTML(view("pdfs.sample", compact('title', 'titles', 'data'))->render()); $pdf->output('sample.pdf', 'D'); return Redirect::back(); } }
ビュー
Laravelの場合はbladeが使えるのがうれしい。
サンプルなのでかなりシンプルなものです。
resources\views\pdfs\sample.blade.php
<h1>{{$title}}</h1> <table> <thead> <tr> @foreach ($titles as $d) <th>{{$d}}</th> @endforeach </tr> </thead> <tbody> @foreach ($data as $d) <tr><td>{{$d['id']}}</td><td>{{$d['name']}}</td></tr> @endforeach </tbody> </table>
参考
TCPDF
Examplesでどんな感じに出力できるのか確認できます。
使い方はダウンロードしたExamplesに入っているのでそれを参照できます。
Laravel で pdfテンプレートとhtmlを使ってpdfを出力する
PHPでPDF帳票を出力する方法(TCPDF + FPDI)