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

『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なら簡単ですね。
機会があればぜひ試してみてください。それではまた!

LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。

Webサイト制作の実績・料金を見る

この記事のシェア数

ディレクターのエリカです。趣味は美術鑑賞で、絵画や展示などたくさんの作品を眺めるのが好きです。得意料理は「鍋」です。よろしくお願いします。

このメンバーの記事をもっと読む
バックエンドへの道 | 58 articles
デザイン力×グローバルな開発体制でDXをトータル支援
お問い合わせ 会社概要DL