Laravelを利用してアプリケーションを構築している場合にテーブルに保存されているデータを利用してPDFファイルを作成したいという機会があります。Laravel-dompdfを利用することで業務でも利用可能なオリジナルのPDFの納品書、請求書などを作成することが可能になります。

本文章は、Laravel5.1、Laravel-dompdfのバージョン7.0の環境で実行した内容です。手順も変わっているので、Laravel5.7の場合は、下記を参照してください。

DomPDFのバージョンアップと日本語フォント

laravel-dompdfのパッケージをインストールすれば、英語のみで記述されたHTML文書は簡単にPDF化することができます。しかし、パッケージインストール直後の初期設定のままでは日本語のPDFを作成することができません。日本語を使ってPDFを作成しようとすると日本語部分のみ文字化けします。

また、PDF作成のコア部分であるdompdfは、バージョン6からバージョン7にアップされ日本語フォントの設定方法も含めいくつかの更新が行われています。

以前のバージョンでは、新しいフォントをインストールするためにload_font.phpを使用していました。最新のパッケージにはこのファイルが含まれていないため、laravel-dompdfとは別にload_font.phpファイルをダウンロードする必要があります。

リリースノートでは、@font-faceを使用して、フォントをインストールする方法も紹介されていますが、ここでは、以前のバージョンで利用していたload_font.phpを利用して日本語でのPDF作成を行います。

正しい手順は見つけることができなかったので、試行錯誤を繰り返して日本語フォントが使用できることを確認しました。より適切な方法もあると思いますので、こういう方法もあるんだと参考程度に参照して頂ければと思います。

load_font.phpで日本語フォントを使える環境へ

フォントのダウンロード

日本語のフォントには、IPAゴシックを使用しています。 下記のURLからダウンロードを行いました。

https://moji.or.jp/ipafont/

zipファイルでダウンロードした後、zipファイルを解凍してipag.ttfを適当な場所に保存してください。

Laravelのインストールディレクトリ直下でも/tmpディレクトリでも大丈夫です。リモートサーバ上でLaravelを動作させている場合はリモートサーバ上でLaravelからアクセスできる場所に保存してください。
fukidashi

load_font.phpのダウンロード

load_font.phpファイルはdompdfのバージョン7には付属していないので、下記のURLからダウンロードする必要があります。

https://github.com/dompdf/utils

ダウンロードしたload_font.phpファイルは、Laravelのインストールディレクトリ内の/vendor/dompdf/dompdf/ の下に保存してください。

load_font.phpを使ってフォントのインストール

load_font.phpを実行すると最初に読み込むautoload.inc.phpの中に記載されている/vendor/dompdf/dompdf/libディレクトリには、php-font-libとphp-svg-libディレクトリがないのでエラーになります。

これら2つのディレクトリは、dompdfのパッケージをインストールする際にlibディレクトリではなく、/vendor/phenxディレクトリに保存されているので、この2つのディレクトリを/vendor/dompdf/dompdf/lib/の下にコピーします。

  • php-font-lib: 日本語フォントのようにdompdfでデフォルトでは存在しないフォントを使用する場合に利用するライブラリです
  • php-svg-lib: SVGをレンダリングするために使用するライブラリです

/vendor/dompdf/dompdf/libディレクトリ内には、autoload.inc.phpで必要になるhtml5lib、php-font-lib、php-svg-libの3つが存在することを確認後、load_font.phpを実行します。


$ php load_font.php ipag $path_to_font_directory/ipag.ttf
$path_to_font_directoryはipag.ttfファイルを保存したディレクトリです。保存した場所によって値は異なります。/home/fontに保存した場合は、/home/font/ipag.ttfを指定します。
fukidashi

Unable to find bold face file.
Unable to find italic face file.
Unable to find bold_italic face file.
Copying $path_to_font_directory/ ipag.ttf to $laravel_install_directory /vendor/dompdf/dompdf/lib/fonts/ipag.ttf...
Generating Adobe Font Metrics for $laravel_install_directory /vendor/dompdf/dompdf/lib/fonts/ipag...

上記のload_font.phpの実行後に出力されるメッセージにあるようにフォントのインストールが正常に行われると/vendor/dompdf/dompdf/lib/fonts/の下にipag.ttfがコピーされipag.ufmが作成されます。

また、dompdf_font_family_cache.phpにipagの情報が追加されていることを確認することができます。


'ipag' => array(
    'normal' => $fontDir . '/ipag',
    'bold' => $fontDir . '/ipag',
    'italic' => $fontDir . '/ipag',
    'bold_italic' => $fontDir . '/ipag',
  ),

fontsフォルダの作成

Laravelインストールディレクトリにあるstorage/ディレクトリの下にfontsフォルダを作成します。

作成したフォルダには、/vendor/dompdf/dompdf/lib/fonts/の下にあるファイルをコピーします。


$cp  lib/fonts/* {Laravelインストールディレクトリ}/storage/fonts/

以上で日本語フォントを使用できる環境が整いました。

日本語フォントが埋め込まれたPDFを作成する

Controller(コントローラー)ファイルの作成

PDFを作成するためにPDFControllerファイルを作成します。

usersテーブルからユーザの情報を取り出し、その値をviewのindex.blade.phpファイルに渡し、PDFファイルをダウンロードするシンプルな内容です。作成されるPDFファイルの名前は、user_list.pdfとなります。

事前にusersテーブルにユーザ情報を登録しておく必要があります。
fukidashi

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\User;
use PDF;

class PdfController extends Controller
{
    public function index()
    {
        $users = User::all();

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

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

View(ビュー)ファイルの作成

index.blade.phpファイルには、font-familyでインストールしたipagフォントを指定します。


<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Create PDF</title>
<style>
body {
font-family: ipag;
}
</style>
</head>
<body>
<div class="container">
    <div class="row">
        <div class="col-md-12">
        <h1>user list</h1>
        <table>
        <thead>
            <tr>
                <th>ユーザID</th>
                <th>ユーザ名</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>

ルーティングの追加

ルーティングファイルのweb.phpには、下記のルーティングを追加し、/pdfにアクセスするとuser_list.pdfが作成されダウンロードが行われます。


Route::resource('/pdf','PdfController');

ダウンロードしたPDFファイルを開くと日本語が表示されます。

日本語が表示されていることが確認できれば、Laravel5.1環境におけるPDFへの日本語表示を行う設定は完了です。