Help us understand the problem. What is going on with this article?

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

実施条件

実施方法概要

  • Bladeファイルを利用した日本語化対応の方法をまとめる。
  1. 準備
  2. フォントのファイルの取得
  3. ライブラリに登録するためのスクリプト取得
  4. ライブラリに登録
  5. 確認

実施方法詳細

  1. 準備

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

      $ mkdir アプリ名ディレクトリ/fonts
      
  2. フォントのファイルの取得

    1. 下記リンク先にアクセスする。

      IPAフォント ダウンロードページ

    2. リンク先の「TTFファイル」の「4書体パック」のzipをクリックしてフォントをインストールする。

      laravel_dompdf_japanese_md_と_IPAフォントのダウンロード.png

    3. お使いのMacのダウンロードフォルダにダウンロードされたフォントのzipファイル「IPAfontXXXXX.zip」を解凍する。(Xには任意の数字)

    4. 下記コマンドを実行して、解凍した「IPAfontXXXXX」の中のファイル郡を先に作成したアプリ名ディレクトリ/fontsにコピーする。

      $ cd アプリ名ディレクトリ
      $ cp ~/Downloads/IPAfont00303/* fonts/
      
    5. フォントのファイルを設置したアプリ名ディレクトリ/fonts直下の状態を下記に記載する。

      • ~アプリ名ルートフォルダ/fonts
        • IPA_Font_License_Agreement_vX.X.txt
        • Readme_IPAfontXXXXX.txt
        • ipag.ttf
        • ipagp.ttf
        • ipam.ttf
        • ipamp.ttf
  3. ライブラリに登録するためのスクリプト取得

    1. 下記のリンク先にアクセスする。
    2. 「Clone or download」をクリックする。

      dompdf_utils__Utility_scripts_for_use_with_the_dompdf_library.png

    3. 「Download ZIP」をクリックする。

      dompdf_utils__Utility_scripts_for_use_with_the_dompdf_library_と_laravel_dompdf_japanese_md.png

    4. お使いのMacのダウンロードフォルダにダウンロードされたzipファイル「utils-master.zip」を解凍する。

    5. 下記コマンドを実行して解凍したフォルダ「utils-master」の中の「load_font.php」をアプリ名ディレクトリ直下にコピーする。

      $ cd アプリ名ディレクトリ
      $ cp ~/Downloads/utils-master/load_font.php .
      
    6. アプリ名ディレクトリ直下に「load_font.php」があることを確認する。

  4. ライブラリに登録

    1. 下記コマンドを実行する。(筆者環境での下記コマンドの実行後の出力を付録に記載する。)

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

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

      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',
      ),
      
    4. 下記コマンドを実行してスクリプトファイルにより作成されたライブラリが読むためのフォントデータをコピーする。

      $ cd アプリ名ディレクトリ
      $ cp -r vendor/dompdf/dompdf/lib/fonts storage/
      
  5. 確認

    1. 下記コマンドを実行してアプリ名ディレクトリ/resource/viewに「test」フォルダを作成する。

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

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

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

      アプリ名ディレクトリ/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();
          }
      }
      
    5. 下記の記載をアプリ名ディレクトリ/routesにあるweb.phpのルーティングファイルに追記する。

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

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

      アプリ名ディレクトリ/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>
      
    8. 下記コマンドを実行してローカルサーバを起動する。

      $ cd アプリ名ディレクトリ
      $ php artisan serve
      
    9. 下記のリンク先にアクセスしブラウザから文字化けせずに「こんにちは」とPDFとして出力されることを確認する。

付録

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

    $ 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
    

参考文献

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした