HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

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

参考