Mac Laravelのライブラリ「laravel-dompdf」を日本語表示に対応させる

# 目的

- Laravelにライブラリ「laravel-dompdf」を入れたが、日本語化されない問題があったため改善する

# 実施環境

- ハードウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| OS | macOS Catalina(10.15.3) |  |
| ハードウェア | MacBook  Air (11-inch ,2012) |  |
| プロセッサ | 1.7 GHz デュアルコアIntel Core i5 |  |
| メモリ | 8 GB 1600 MHz DDR3 |  |
| グラフィックス | Intel HD Graphics 4000 1536 MB |  |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHP バージョン | 7.4.3 |  |
| Laravel バージョン | 7.0.8 |  |

- ライブラリ環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| laravel-dompdf | v0.8.6 | アプリ名ディレクトリに移動後コマンド`composer show -i | grep "laravel-dompdf"`を実行して確認 |

# 実施条件

- 下記の二つの投稿内容に沿ってライブラリが導入できていること
    - [Mac Laravelでライブラリ「laravel-dompdf」をインストールする](https://qiita.com/miriwo/items/4e67f2b1645d9dd55336)
- 下記の内容は実施しなくても良いが一度読んでおくと理解が早いかも知れない。
    - [Laravelのライブラリ「laravel-dompdf」を使ってビューの表示をPDFとして表示しよう](https://qiita.com/miriwo/items/748e72c2d45f48e88440)
- ローカル開発環境でブラウザから確認可能なLaravelアプリがあること。

# 実施方法概要

- Bladeファイルを利用した日本語化対応の方法をまとめる。

1. 準備
1. フォントのファイルの取得
1. ライブラリに登録するためのスクリプト取得
1. ライブラリに登録
1. 確認

# 実施方法詳細

1. 準備
    1. 下記コマンドを実行してフォントのファイルを設置するディレクトリを作成する

        ```terminal
        $ mkdir アプリ名ディレクトリ/fonts
        ```
1. フォントのファイルの取得
    1. 下記リンク先にアクセスする。

        [IPAフォント ダウンロードページ](https://ipafont.ipa.go.jp/old/ipafont/download.html)
    1. リンク先の「TTFファイル」の「4書体パック」のzipをクリックしてフォントをインストールする。

        ![laravel_dompdf_japanese_md_と_IPAフォントのダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/2b0ab9b8-19c0-f2b1-e695-6ebd24694f8d.png)
    1. お使いのMacのダウンロードフォルダにダウンロードされたフォントのzipファイル「IPAfontXXXXX.zip」を解凍する。(Xには任意の数字)
    1. 下記コマンドを実行して、解凍した「IPAfontXXXXX」の中のファイル郡を先に作成した`アプリ名ディレクトリ/fonts`にコピーする。

        ```terminal
        $ cd アプリ名ディレクトリ
        $ cp ~/Downloads/IPAfont00303/* fonts/
        ```
    1. フォントのファイルを設置した`アプリ名ディレクトリ/fonts`直下の状態を下記に記載する。
        - ~アプリ名ルートフォルダ/fonts
            - IPA_Font_License_Agreement_vX.X.txt
            - Readme_IPAfontXXXXX.txt
            - ipag.ttf
            - ipagp.ttf
            - ipam.ttf
            - ipamp.ttf
2. ライブラリに登録するためのスクリプト取得
    1. 下記のリンク先にアクセスする。
        - [https://github.com/dompdf/utils](https://github.com/dompdf/utils)
    1. 「Clone or download」をクリックする。

        ![dompdf_utils__Utility_scripts_for_use_with_the_dompdf_library.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/a418f57d-a00b-de90-ed87-d6d2779599c2.png)
    1. 「Download ZIP」をクリックする。
    
        ![dompdf_utils__Utility_scripts_for_use_with_the_dompdf_library_と_laravel_dompdf_japanese_md.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/56cba291-2b19-acad-324b-bbe1dfb417ef.png)
    1. お使いのMacのダウンロードフォルダにダウンロードされたzipファイル「utils-master.zip」を解凍する。
    1. 下記コマンドを実行して解凍したフォルダ「utils-master」の中の「load_font.php」をアプリ名ディレクトリ直下にコピーする。

        ```terminal
        $ cd アプリ名ディレクトリ
        $ cp ~/Downloads/utils-master/load_font.php .
        ```
    1. アプリ名ディレクトリ直下に「load_font.php」があることを確認する。
3. ライブラリに登録
    1. 下記コマンドを実行する。(筆者環境での下記コマンドの実行後の出力を付録に記載する。)

        ```terminal
        $ php load_font.php ipag fonts/ipag.ttf
        ```
    1. 下記コマンドをアプリ名ディレクトリで実行してフォントの設定ファイルを確認する。

        ```terminal
        $ cd アプリ名ディレクトリ
        $ vi vendor/dompdf/dompdf/lib/fonts/dompdf_font_family_cache.php
        ```
    1. 先のコマンドを実行して開いたファイルに下記の記載がある事を確認する。

        ```vendor/dompdf/dompdf/lib/fonts/dompdf_font_family_cache.php
        'ipag' => array(
        'normal' => $fontDir . '/ipag',
        'bold' => $fontDir . '/ipag',
        'italic' => $fontDir . '/ipag',
        'bold_italic' => $fontDir . '/ipag',
        ),
        ```
    1. 下記コマンドを実行してスクリプトファイルにより作成されたライブラリが読むためのフォントデータをコピーする。

        ```terminal
        $ cd アプリ名ディレクトリ
        $ cp -r vendor/dompdf/dompdf/lib/fonts storage/
        ```
1. 確認
    1. 下記コマンドを実行して`アプリ名ディレクトリ/resource/view`に「test」フォルダを作成する。

        ```terminal
        $ cd アプリ名ディレクトリ
        $ mkdir resources/views/test
        ```
    1. 下記コマンドを実行してTestコントローラを作成する。

        ```terminal
        $ cd アプリ名ディレクトリ
        $ php artisan make:controller TestController
        >Controller created successfully.
        ```
    1. 下記コマンドを実行して先に作成したコントローラを開く。

        ```terminal
        $ cd アプリ名ディレクトリ
        $ vi app/Http/Controllers/TestController.php
        ```
    1. 先のコマンドで開いたコントローラをの内容を下記の様に修正する。

        ```アプリ名ディレクトリ/app/Http/Controllers/TestController.php
        <?php
        
        namespace App\Http\Controllers;
        
        use Illuminate\Http\Request;
        
        use PDF;
        
        class TestController extends Controller
        {
            public function japanese_pdf_test() {
                $pdf = PDF::loadView('test.japanese_pdf_test');
                return $pdf->stream();
            }
        }
        ```
    2. 下記の記載を`アプリ名ディレクトリ/routes`にあるweb.phpのルーティングファイルに追記する。

        ```アプリ名ディレクトリ/routes/web.php
        Route::get('/japanese_pdf_test', 'TestController@japanese_pdf_test');
        ```
    3. 下記コマンドを実行してビューファイルを作成し開く。

        ```terminal
        $ cd アプリ名ディレクトリ
        $ vi resources/views/test/japanese_pdf_test.blade.php
        ```
    4. 開いたビューファイルに下記の内容を記載する。

        ```アプリ名ディレクトリ/resources/views/test/japanese_pdf_test.blade.php
        <!doctype html>
        <html>
          <head>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
            <title>PDF</title>
            <style>
            body {
            font-family: ipag;
            }
            </style>
          </head>
          <body>
              <h1>こんにちは</h1>
          </div>
          </body>
        </html>
        ```
    5. 下記コマンドを実行してローカルサーバを起動する。

        ```terminal
        $ cd アプリ名ディレクトリ
        $ php artisan serve
        ```
    6. 下記のリンク先にアクセスしブラウザから文字化けせずに「こんにちは」とPDFとして出力されることを確認する。
        - [http://127.0.0.1:8000/japanese_pdf_test](http://127.0.0.1:8000/japanese_pdf_test)

# 付録

- コマンド`php load_font.php ipag storage/fonts/ipag.ttf`を実行した際の筆者の環境でのターミナル出力を下記に記載する。

    ```terminal
    $ php load_font.php ipag fonts/ipag.ttf
    >Unable to find bold face file.
    >Unable to find italic face file.
    >Unable to find bold_italic face file.
    >Copying fonts/ipag.ttf to /Users/shun/workspace/study/laravel/calculation_drill_app/vendor/dompdf/dompdf/lib/fonts/ipag.ttf...
    >Generating Adobe Font Metrics for /Users/shun/workspace/study/laravel/calculation_drill_app/vendor/dompdf/dompdf/lib/fonts/ipag...
    >PHP Notice:  Trying to access array offset on value of type null in /Users/shun/workspace/study/laravel/calculation_drill_app/vendor/phenx/php-font-lib/src/FontLib/AdobeFontMetrics.php on line 142
    >PHP Stack trace:
    >PHP   1. {main}() /Users/shun/workspace/study/laravel/calculation_drill_app/load_font.php:0
    >PHP   2. install_font_family() /Users/shun/workspace/study/laravel/calculation_drill_app/load_font.php:201
    >PHP   3. FontLib\TrueType\File->saveAdobeFontMetrics() /Users/shun/workspace/study/laravel/calculation_drill_app/load_font.php:155
    >PHP   4. FontLib\AdobeFontMetrics->write() /Users/shun/workspace/study/laravel/calculation_drill_app/vendor/phenx/php-font-lib/src/FontLib/TrueType/File.php:361
    >
    >Notice: Trying to access array offset on value of type null in /Users/shun/workspace/study/laravel/calculation_drill_app/vendor/phenx/php-font-lib/src/FontLib/AdobeFontMetrics.php on line 142
    >
    >Call Stack:
    >    0.0086     423096   1. {main}() /Users/shun/workspace/study/laravel/calculation_drill_app/load_font.php:0
    >    0.0484    4914016   2. install_font_family() /Users/shun/workspace/study/laravel/calculation_drill_app/load_font.php:201
    >    0.0858    5068992   3. FontLib\TrueType\File->saveAdobeFontMetrics() /Users/shun/workspace/study/laravel/calculation_drill_app/load_font.php:155
    >    0.0862    5103120   4. FontLib\AdobeFontMetrics->write() /Users/shun/workspace/study/laravel/calculation_drill_app/vendor/phenx/php-font-lib/src/FontLib/TrueType/File.php:361
    ```

# 参考文献

- [A guide to enabling Unicode support in DOMPDF (with the CPDF backend)](https://github.com/dompdf/dompdf/wiki/UnicodeHowTo#load-a-font-supporting-your-characters-into-dompdf)
- [laravel-dompdfバージョン7.0環境での日本語環境でPDFを作成](https://reffect.co.jp/laravel/laravel-dompdf70-japanese)