LaravelでPDF出力

投稿者: | 2019/04/07

調べるといろいろライブラリがある様子。
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に入っているのでそれを参照できます。

FPDI 2.x

Laravel で pdfテンプレートとhtmlを使ってpdfを出力する

PHPでPDF帳票を出力する方法(TCPDF + FPDI)


コメントを残す

メールアドレスが公開されることはありません。