Laravel環境で簡単にPDFの作成を行いたい

Posted in Laravel on 11月 24, 2016

Laravel環境でデータベースから取り出したデータを利用してPDFファイルを作成したい場合も多々あるかと思います。

そのような場合にlaravel-dompdfのパッケージをインストールして、利用すれば簡単にPDFファイルを作成することができます。

ブラウザに表示させる時と同様にLaravelのViewのBldeファイルを通してPDFファイルを作成することができるため、HTMLとCSSの知識があれば、整形されたレイアウトのPDFを作成することができます。

laravel-dompdfパッケージのインストールと設定

  1. composerを使用してlaravel-dompdfをインストール
  2. config/app.phpへのサービスプロバイダーとエイリアスの登録
  3. PDFの作成
  4. 日本語の文字化け

composerを使用してlaravel-dompdfをインストール

composerを通して、larave-dompdfのインストールを行います。

composer.jsonに"barryvdh/laravel-dompdf":"0.7.*"の1行を追加して、composer updateを実行します。

composer.json

"require": {
        "php": ">=5.6.4",
        "laravel/framework": "5.3.*",
        "barryvdh/laravel-dompdf":"0.7.*",

composer updateを行うと少し時間がかかりますが、出力される情報の中にbarryvdh/laravel-dompdfが入っていることを確認することができます。

%composer update

Warning: This development build of composer is over 60 days old. It is recommended to update it by running "/usr/local/bin/composer self-update" to get the latest version.
Loading composer repositories with package information
Updating dependencies (including require-dev)

- Installing barryvdh/laravel-dompdf (v0.7.0)
    Downloading: 100%

config/app.phpへのサービスプロバイダーとエイリアスの登録

configディレクトリの中にあるapp.phpにcomposerでインストールしたlaravel-dompdfのサービスプロバイダーとエイリアスを追加します。

app.php

'providers' => [

        /*
         * Laravel Framework Service Providers...
         */
        Illuminate\Auth\AuthServiceProvider::class,
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
        Illuminate\Bus\BusServiceProvider::class,
                         ・
                         ・
        Illuminate\View\ViewServiceProvider::class,
        Barryvdh\DomPDF\ServiceProvider::class,
'aliases' => [

        'App' => Illuminate\Support\Facades\App::class,
        'Artisan' => Illuminate\Support\Facades\Artisan::class,
                         ・
                         ・
        'View' => Illuminate\Support\Facades\View::class,
        'PDF' => Barryvdh\DomPDF\Facades::class,

PDFの作成

パッケージのインストールとサービスプロバイダーの設定が完了するとlaravel-dompdfを使用する準備は完了です。

web.phpに新規のルーティング”Route::resource('/pdf','PdfController');”を追加し、コントローラー(PdfController.pdf)の作成を行います。

web.php

Route::get('/', function () {
    return view('welcome');
});

PdfController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PdfController extends Controller
{

    public function index()
    {
        $pdf = \App::make('dompdf.wrapper');

        $pdf->loadHTML('<h1>Test</h1>');

        return $pdf->stream();

    }
}

/pdfにアクセスするブラウザ上にPDFが表示されます。 PDF作成

日本語の文字化け

Testというアルファベットでは問題なく作成できることが確認できますが、日本語でもPDFが作成できるか確認する必要があります。

PdfController.phpの下記のh1タグをtestからテストに変更します。

$pdf->loadHTML('<h1>テスト</h1>');

/pdfに再度アクセスすると日本語は文字化け、初期設定のままでは日本語を表示させることはできません。 PDF文字化け

日本語フォント対応は下記の記事を参考にしてください。 laravel-dompdfバージョン7.0環境での日本語環境でPDFを作成

Bladeファイルを使ってPDFを作成

Laravel内にあるデータベースからデータを取得し、CSSを使ってレイアウトを整えたPDFを作成したい場合は、Bladeファイルを利用します。

下記のようにusersテーブルからユーザ情報を取得して、viewsディレクトリに作成したuser.indexのbladeファイルを利用して、PDFを作成します

PdfController.pdf

        $users = User::all();

        $pdf = PDF::loadView('user.index', compact('users'));

        return $pdf->download('user_list.pdf');

index.blade.php

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Create PDF</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
</head>
<body>

<div class="container">

    <div class="row">
        <div class="col-md-12">
        <h1>user list</h1>

        <table class="table table-hover table-bordered">
        <thead>
            <tr>
                <th>id</th>
                <th>usename</th>
                <th>E-mail</th>
            </tr>
        </thead>
        <tbody>
            @foreach ($users as $user)
            <tr>
                <td>{{ $user->id }}</td>
                <td>{{ $user->name }}</td>
                <td>{{ $user->email }}</td>
            </tr>
            @endforeach
        </tbody>
        </table>
        </div>
    </div> 
</div>
</body>
</html>

/pdfにアクセスするとブラウザのダウンロードフォルダにuser_list.pdfという名前でPDFファイルが作成されます。

ユーザ作成