laravel-dompdfバージョン7.0環境での日本語環境でPDFを作成

Posted in Laravel on 11月 25, 2016

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

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

※laravel-dompdfのインストール方法や簡単な動作確認については下記の以前の記事を参考にしてください。

参考記事:Laravel環境で簡単にPDFの作成を行いたい

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

バージョン6からの主な変更点は下記のリリースノートに記載されています。 https://github.com/dompdf/dompdf/releases

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

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

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

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

(1)フォントのダウンロード

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

http://ipafont.ipa.go.jp/old/ipafont/download.html

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

(2)load_font.phpのダウンロード

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

https://github.com/dompdf/utils

ダウンロードしたload_font.phpファイルは、/vendor/dompdf/dompdf/ の下に保存してください。

(3)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をレンダリングするために使用するライブラリです

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は(2)でipag.ttfファイルを保存したディレクトリです

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',
  ),

(4)fontsフォルダの作成

/storage/ディレクトリの下にfontsフォルダを作成します。

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

#cp  lib/fonts/* /storage/fonts/

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

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

usersテーブルからユーザの情報を取り出し、その値をviewのindex.blade.phpファイルに渡し、PDFファイルをダウンロードします。

PdfController.php

<?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');

    }
}

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を開くとIPAのゴシックフォントで日本語が表示されます。

日本語フォントのPDF