こんにちは、エリカです。
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_subsetting
を true
にしておくと、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サイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。