Laravel-dompdfでPDF化する方法について
LaravelでPDF化を行うための方法について紹介します。
使うのはLaravel-dompdfライブラリです。
GitHub→https://github.com/barryvdh/laravel-dompdf
Laravel 5.5
以上であればconfig/app.php
に設定をする必要はありません。
目次
PDF化するための手順
- パッケージのインストール
- 日本語用フォントの準備
- ビューファイル(bladeファイル)の準備
- コントローラの準備
- ルーティングの設定
- web.appまたはapi.php
必要な手順は上記の通りです。
Laravel-dompdfは日本語に対応していないため日本語フォントが別で必要になります。
パッケージのインストール
まずはパッケージをインストールします。
ターミナルでLaravelアプリケーションのlaravelディレクトリまで移動してから下記のコマンドを入力してください。
$ composer require barryvdh/laravel-dompd
下記の内容が表示されればインストール成功です。
Package manifest generated successfully.
75 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
日本語用フォントのダウンロード
デフォルトでは英語のみしか使えない状態になっています。
なので日本語フォントをダウンロードしてください。
おすすめはMigMix(ミグミックス)フォントです。
https://mix-mplus-ipa.osdn.jp/migmix/
拡張子が.ttfであれば他の日本語フォントも使用できます。
稀に使えないフォントもあるので色々試してみてください。
ダウンロードした日本語フォントは
laravel/app/storage/配下にfontsディレクトリを作成してそこに入れてください。
これでPDF化をする準備は整いました。
ビューファイル(bladeファイル)を準備する
実際にPDF化したい画面を作成します。
bladeファイルで作成してくださいね。
下記にサンプルを載せます。
<!DOCTYPE html>
<html>
<title>pdf test</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<style>
/* 基本の文字 */
@font-face {
font-family: migmix-1p-regular;
font-style: normal;
font-weight: normal;
src: url('{{ storage_path('fonts/migmix-1p-regular.ttf') }}');
}
/* 太字用 */
@font-face{
font-family: migmix-1p-bold;
font-style: bold;
font-weight: bold;
src:url('{{ storage_path('fonts/migmix-1p-bold.ttf')}}');
}
/* body全体に反映する */
body {
font-family: migmix-1p-regular;
}
/* hタグに反映 */
h1, h2 {
font-family: migmix-1p-bold;
}
</style>
<body>
<h1>テスト表示を行います</h1>
<h2>
日付 : {{ $date }}
<br>
</h2>
<p>
こんにちは {{ $name }} さん!
</p>
</body>
</html>
@font-face
で日本語フォントを指定しておくことでPDF化したときに文字化けを防げます。
normalは通常用の文字に、boldは太字文字用に使います。
storage_path()を使用して、storage配下の日本語フォントファイルにアクセスできるようにしています。
cssのbodyの設定で読み込んだ日本語フォントファイルをbodyタグに、h1, h2 の設定でh1タグとh2タグに太字のフォントを反映しています。
コントローラを準備
コントローラを準備します。
コントローラで使う主なメソッド3つを紹介します。
loadView()
第1引数にPDF化したいビュー(bladeファイル)、第2引数に連想配列で渡すことでビューファイルに値を渡せます。
こうすることでライブラリがPDF化してくれます。
stream()
ブラウザでPDFプレビューとしてみることが可能です。
download()
ブラウザに表示せずにPDFをダウンロードすることができます。
引数に渡した値がダウンロード時のファイル名になります。
実際に使う場合はstream()かdownload()のどちらかを使うことになると思います。
下記にサンプルを載せます。
<?php
namespace App\Http\Controllers;
use Barryvdh\DomPDF\Facade\Pdf;
use Illuminate\Http\Request;
class TestPdfController extends Controller
{
public function pdfCreate ()
{
$pdf = Pdf::loadView('test',
[
"date" => date("Y-m-d"),
"name" => "山田太郎",
]);
return $pdf->stream("test.pdf");
}
}
ルーティングの設定
web.appにルーティングを設定します。
<?php
use App\Http\Controllers\TestPdfController;
Route::get('/test-pdf', [TestPdfController::class, 'pdfCreate']);
動作確認
準備したもので実際に動作確認を行います。
下記 http://127.0.0.1:8000/test-pdf でアクセスしました。
ちゃんとPDFとして画面が表示されていますね。
このまま右上からダウンロードすることも可能です。
日本語フォントが設定されていない場合、下記のように英数字以外は文字化けします。
まとめ
Laravel-dompdfでPDF化する手順について
- パッケージのインストール
- 日本語用フォントの準備
- ビューファイル(bladeファイル)の準備
- コントローラの準備
- ルーティングの設定
- web.appまたはapi.php
日本語フォントを準備する手間がありますが、それ以外は比較的簡単にPDF化できるのでやってみてくださいね。