NTTドコモ様_dカーシェア
NTTドコモ様_dカーシェア
2018.06.22
バックエンドへの道

『Laravel』で簡単にPDFデータを出力する方法

エリカ

こんにちは、エリカです。
Webアプリケーションを作っていると、まれにPDFの出力機能を用意することがあるかと思います。そんな時も、『Laravel』なら簡単です。

今回は、その実装方法を解説します。

やりたいこと

Laravelを使って、注文内容のデータなどを、PDFで出力できるようにする。

前提

Laravel 5.x を使用。
加えて、こちらのパッケージ(barryvdh/laravel-dompdf)を使います。

準備

composerを使って、パッケージをインストールします。

$ composer require barryvdh/laravel-dompdf

config/app.php を以下のように編集します。

providersに下記を追記します。

Barryvdh\DomPDF\ServiceProvider::class,

aliasesに下記を追記します。

'PDF' => Barryvdh\DomPDF\Facade::class,

PDF用の設定ファイルを用意します。

$ artisan vendor:publish --provider="Barryvdh\DomPDF\ServiceProvider"

Copied File [/vendor/barryvdh/laravel-dompdf/config/dompdf.php] To [/config/dompdf.php]
Publishing complete.

config/dompdf.phpが作成されますので、各種設定の初期値を必要に応じて修正することができます。

'font_dir' => storage_path('fonts/'), // advised by dompdf (https://github.com/dompdf/dompdf/pull/782)

この font_dir では、利用するフォントファイルのストレージを指定することができます。初期値では、上記のように、storage/fonts/ になっています。

PDFに日本語を利用する場合は、日本語のフォントファイルが必要になりますので、ここで指定したディレクトリにフォントファイルを配置していきます。

/*
         * Whether to enable font subsetting or not.
         */
        'enable_font_subsetting' => false,

また、上記の enable_font_subsettingtrue にしておくと、PDFデータに含むフォントファイルを使用しているものに制限することができるので、ファイルサイズが小さくなります。

PDFの作成

コントローラー、もしくはルーターのクロージャでPDFのインスタンスを作成し、ビューを準備します。

Route::get('/pdf', function () {
    $pdf = app('dompdf.wrapper');
    $pdf->loadView('pdf.sample', ['foo' => 'bar']);
    
    return $pdf->stream('sample.pdf');
    // PDFをダウンロードさせたい場合は下記を return します。
    // return $pdf->download('sample.pdf'); 
});

まずは、app('dompdf.wrapper') を利用して、Barryvdh\DomPDF\PDF インスタンスを取得しています。

ここでは、loadView() を利用することで、通常のビューを用意するのと同じ手順で、PDFに出力したい内容をHTMLで記述することができるようになります。もちろん、変数を渡すことも可能です。

HTMLを作成

PDFに表示したい内容のHTMLを記述します。

<!doctype html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <style type="text/css">
        @font-face {
            font-family: ipag;
            font-style: normal;
            font-weight: normal;
            src: url('{{ storage_path('fonts/ipag.ttf') }}') format('truetype');
        }

        @font-face {
            font-family: ipag;
            font-style: bold;
            font-weight: bold;
            src: url('{{ storage_path('fonts/ipag.ttf') }}') format('truetype');
        }

        body {
            font-family: ipag !important;
        }
    </style>
</head>
<body>

{{$foo}}

</body>
</html>

まとめ

あまりPDFを書き出すシチュエーションはないかもしれませんが、Laravelなら簡単ですね。
機会があればぜひ試してみてください。それではまた!