Laravel環境でPDFを作成するために前回は、Laravel-dompdfパッケージを使った方法を説明しましたが、今回は別のパッッケージであるLaravel-Snappyを使用してPDFの作成を行ってみましょう。

Laravel 5.7 + MAC OS High Sierra環境です。

Laravel-Snappyのインストール

Laravel-SnappyのInstallationを確認しながらインストールを実行していきましょう。

Composerを使用してWkhtmltopdfのインストール

Laravel-Snappyのパッケージをインストールする前にWhtmltopdfをインストールする必要があります。Whtmltopdfのインストールはcomposerを利用して実施し、手順はWhtmltopdfを見ながら実施します。

MAC環境ではWhtmltopdfのインストール方法が異なるの【補足】MACにWhtmltopdfをインストール”を参考にしてください。


$ composer require h4cc/wkhtmltopdf-amd64 0.12.x
$ composer require h4cc/wkhtmltoimage-amd64 0.12.x

Whtmltopdfは2018/10/13最新版の0.12.4がインストールされます。また、Whtmltopdfの実行ファイルがvendor/h4cc/wkhtmltopdf-amd64/binファイルに作成されます。


Composerを使用してLaravel-Snappyのインストール

composerを使用してLaravel-Snappyのインストールを行います。


$ composer require barryvdh/laravel-snappy

サービスプロバイダーとエイリアスへの登録

インストール完了後、Laravelインストールディレクトリのconfig\app.phpにサービスプロバイダーとエイリアスを登録する必要があります。

providersには、Barryvdh\Snappy\ServiceProvider::classの追加。aliasesには、’PDF’ => Barryvdh\Snappy\Facades\SnappyPdf::classと
‘SnappyImage’ => Barryvdh\Snappy\Facades\SnappyImage::classの2行の追加を行います。


   'providers' => [

        /*
         * Laravel Framework Service Providers...
         */
        Illuminate\Auth\AuthServiceProvider::class,
                                   ・
        /*
         * Application Service Providers...
         */
        App\Providers\AppServiceProvider::class,
                                   ・
        App\Providers\RouteServiceProvider::class,
        Barryvdh\Snappy\ServiceProvider::class,
    ],

    /*
    |--------------------------------------------------------------------------
    | Class Aliases
    |--------------------------------------------------------------------------
    |
    | This array of class aliases will be registered when this application
    | is started. However, feel free to register as many as you wish as
    | the aliases are "lazy" loaded so they don't hinder performance.
    |
    */

    'aliases' => [
        'App' => Illuminate\Support\Facades\App::class,
            ・
        'View' => Illuminate\Support\Facades\View::class,
        'PDF' => Barryvdh\Snappy\Facades\SnappyPdf::class,
        'SnappyImage' => Barryvdh\Snappy\Facades\SnappyImage::class,
    ],
];

Snappy configファイルの作成と変更

Laravel-Snappyのconfig(設定)ファイルの変更が必要となるので、作成を行います。


$ php artisan vendor:publish --provider="Barryvdh\Snappy\ServiceProvider"

configファイルはconfigディレクトリにsnappy.phpという名前で作成されます。Whtmltopdfの実行ファイルのパスの設定が必要になります。変更前のsnappy.phpファイルは下記となります。

MAC環境でwkhtmltopdfパッケージを/user/local/binにインストールした場合は、snappy.phpの変更の必要はありません。

<?php
return array(
    'pdf' => array(
        'enabled' => true,
        'binary'  => '/usr/local/bin/wkhtmltopdf',
        'timeout' => false,
        'options' => array(),
        'env'     => array(),
    ),
    'image' => array(
        'enabled' => true,
        'binary'  => '/usr/local/bin/wkhtmltoimage',
        'timeout' => false,
        'options' => array(),
        'env'     => array(),
    ),
);

binaryの部分のパスの変更を行うと下記のようになります。


<?php
return array(
    'pdf' => array(
        'enabled' => true,
        'binary'  => base_path('vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64'),
        'timeout' => false,
        'options' => array(),
        'env'     => array(),
    ),
    'image' => array(
        'enabled' => true,
        'binary'  => base_path('vendor/h4cc/wkhtmltoimage-amd64/bin/wkhtmltoimage-amd64'),
        'timeout' => false,
        'options' => array(),
        'env'     => array(),
    ),
);

PDFの作成

ここまでの手順でPDFを作成するための設定は完了しました。次はController(コントローラー)を使って実際にPDFが作成できるか確認を行いましょう。

Controller(コントローラー)の作成

PDFの作成を行うControllerの作成を行います。


$ php artisan make:controller PDFController

ルーティングの設定

Controller作成後、web.phpを使ってルーティングの追加を行います。


Route::get('pdf','PDFController@index');

ブラウザ上にPDFを表示

ブラウザ上にPDFファイルの内容を表示させるためにPDFControllerに以下を記述します。Hello Worldをh1タグで囲んでPDFファイルに大きなHello Worldの文字列を表示させます。


<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use PDF;

class PDFController extends Controller
{
    public function index(){

    	$pdf = PDF::loadHTML('<h1>Hello World</h1>');

    	return $pdf->inline();

    }
}

ブラウザで確認するとHello Worldが表示されます。

Hello World

Hello World

Hello Worldからこんにちはに変更を行い、日本語の対応を確認します。



$pdf = PDF::loadHTML('<h1>こんにちは</h1>');

return $pdf->inline();


文字化けを起こして、日本語を確認することができませんがencodeをUTF-8に設定すると日本語を表示することができました。



$pdf = PDF::loadHTML('<h1>こんにちは</h1>');

return $pdf->setOption('encoding', 'utf-8')->inline();


日本語に対応

日本語に対応

【注意】dompdfのように日本語フォントのインストールを行わなくても日本語で出力することができました。wkhtmltopdfではサーバ内の日本語フォントを自動的に使用するとの記載をネット上に見つけたのですが、どのような仕組みなのかわかっていません。MAC以外のLinuxOSではサーバへの日本語フォントのインストールが必要だと思いますので、確認次第また記事を更新したいと思います。

【補足】MACにWKhtmltopdfをインストールする

MAC環境で、Laravel-SnappyのInstallationに沿って設定を行っていくとPDFの作成を行った際に下記のエラーが発生します。実行権限の問題かと判断し、権限を変更しても同じエラーが発生します。


The exit status code '126' says something went wrong: stderr: "sh: /XXXX/vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64: cannot execute binary file " 

また、コマンドラインで行っても同様のエラーが発生します。


bin $ ./wkhtmltoimage-amd64
-bash: ./wkhtmltoimage-amd64: cannot execute binary file

WKhtmltopdfパッケージのインストール

上記問題は、WKhtmltopdfから直接パッケージをダウンロードし、インストールを行うことで回避することができました。

composerをせずパッケージをインストールで、管理者権限も必要になります。インストール完了後、/user/local/binディレクトリに実行ファイルが作成されます。

下記のwkhtmltopdfのホームページからパッケージのダウンロードを行います。MACなので、64bitを選択します。

wkhtmltopdfダウンロード画面

wkhtmltopdfダウンロード画面

ダウンロードが完了したら、パッケージのアイコンをダブルクリックしてインストールを開始します。

デスクトップにダウンロードしたパッケージ

デスクトップにダウンロードしたパッケージ

インストールを開始しようとするとMACのバージョンによって下記のメッセージが表示されます。セキュリティに関するメッセージなので、システムから許可する必要があります。

MACパッケージインストールメッセージ

MACパッケージインストールメッセージ

システム環境設定を開いて、セキュリティとプライバシーをクリックしてください。

システム環境設定

システム環境設定

下記の画面でこのまま開くをクリックしてください。インストールが開始しない場合は、再度デスクトップのパッケージのアイコンをダブルクリックしてインストールを実行してください。

セキュリティとプライバシー設定

セキュリティとプライバシー設定

手順に沿ってインストールを進めていきます。

手順1

手順1

手順2

手順2

手順3

手順3

MACの管理者のユーザIDとパスワードを聞かれるので、入力してください。

パスワード画面

パスワード画面

下記の画面が表示されたらパッケージのインストールは完了です。

インストール完了画面

インストール完了画面

インストール完了後、/user/local/binに存在するか確認して、実行してみてください。


$ ls
composer		wkhtmltoimage
uninstall-wkhtmltox	wkhtmltopdf

実行後、バージョンが出力されればインストールは成功しています。


$ ./wkhtmltopdf -V
wkhtmltopdf 0.12.5 (with patched qt)