Laravel 11環境でLaravel-Snappyを使ってPDF出力をする
はじめに
PDFを出力するためのライブラリ「Snappy」をLaravel 11で使えるようにするための手順のメモ。
事前準備
今回は、Windows 11上のVirtualBoxにAlmaLinux 9.3をインストールした環境での手順を示す。
まずはLaravel 11でのプロジェクト作成。
$ cd /var/www/html $ composer create-project laravel/laravel snappy-sample $ sudo chown -R apache:apache snappy-sample $ cd snappy-sample
Wkhtmltopdf/Wkhtmltoimageのインストール
Snappyでは、このライブラリが必要になるので、先にインストールする。
$ composer require h4cc/wkhtmltopdf-amd64 0.12.x $ composer require h4cc/wkhtmltoimage-amd64 0.12.x
laravel-snappyのインストール
続いて、Laravel-Snappyのインストールを行う。
$ composer require barryvdh/laravel-snappy
サービスプロバイダーの登録
インストール完了後、bootstrap/providers.php
にサービスプロバイダーの登録を行う。
以下のように、「Barryvdh\Snappy\ServiceProvider::class
」を追記する。
<?php return [ App\Providers\AppServiceProvider::class, Barryvdh\Snappy\ServiceProvider::class, ];
追記が完了したら、以下のコマンドを実行して設定ファイルを生成する。
$ php artisan vendor:publish --provider="Barryvdh\Snappy\ServiceProvider"
config/snappy.php
という設定ファイルが生成されるので、これを以下のように編集する
(Wkhtmltopdf/Wkhtmltoimage が /usr/local/bin 以下にインストールされている場合には編集は不要だし、環境変数 WKHTML_PDF_BINARY・WKHTML_IMG_BINARY にそれぞれフルパスを設定しても構わない)。
<?php return [ /* |-------------------------------------------------------------------------- | Snappy PDF / Image Configuration |-------------------------------------------------------------------------- | | This option contains settings for PDF generation. | | Enabled: | | Whether to load PDF / Image generation. | | Binary: | | The file path of the wkhtmltopdf / wkhtmltoimage executable. | | Timeout: | | The amount of time to wait (in seconds) before PDF / Image generation is stopped. | Setting this to false disables the timeout (unlimited processing time). | | Options: | | The wkhtmltopdf command options. These are passed directly to wkhtmltopdf. | See https://wkhtmltopdf.org/usage/wkhtmltopdf.txt for all options. | | Env: | | The environment variables to set while running the wkhtmltopdf process. | */ 'pdf' => [ 'enabled' => true, 'binary' => base_path('vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64'), 'timeout' => false, 'options' => [], 'env' => [], ], 'image' => [ 'enabled' => true, 'binary' => base_path('vendor/h4cc/wkhtmltoimage-amd64/bin/wkhtmltoimage-amd64'), 'timeout' => false, 'options' => [], 'env' => [], ], ];
IPAフォントのダウンロード
以下のサイトから、ZIPファイルをダウンロードする。
本記事執筆時点では“IPAexfont00401.zip”が最新なので、こちらを利用する。
ダウンロードしたら、解凍してstorage/fonts
にTTFファイルをコピーする。
$ mkdir storage/fonts $ unzip IPAexfont00401.zip $ cp IPAexfont00401/*.ttf storage/fonts/
コントローラーの作成
$ php artisan make:controller SnappyController
app/Http/Controllers/SnappyController.php
が作成されるので、これを以下のように編集する。
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Barryvdh\Snappy\Facades\SnappyPdf as SnappyPDF; class SnappyController extends Controller { public function viewPdf() { $pdf = SnappyPDF::loadView('snappy.pdf'); return $pdf->stream(); } }
ビューの作成
内容は何でも良いが、以下のようなビューファイルを作る。
コントローラーでの記述に合わせて、ビューファイルのパスは「resources/views/snappy/pdf.blade.php
」とする。
$ mkdir resources/views/snappy
$ vi resources/views/snappy/pdf.blade.php
<!DOCTYPE html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>PDF出力</title> </head> <style> @font-face { font-family: ipaexg; font-style: normal; font-weight: normal; src: url('{{ storage_path('fonts/ipaexg.ttf') }}'); } html, body { font-family: ipaexg, sans-serif; } </style> <body> こんにちは <br> Hello Snappy </body> </html>
ルーティングの設定
routes/web.php
にルーティングの設定を追記する。
<?php use Illuminate\Support\Facades\Route; Route::get('/', function () { return view('welcome'); }); Route::get('/snappy/pdf', 'App\Http\Controllers\SnappyController@viewPdf');
表示
以上で必要なファイルがそろったので、Webブラウザで以下のURLにアクセスすると、PDFが表示される。 (URLはご自身の環境に合わせてね)
http://192.168.56.nn/snappy-sample/public/snappy/pdf
参考
- Laravel環境で日本語のPDFを作成する方法(Laravel-Snappy)
- laravel-snappy