😉

Laravel/Mpdfでメイリオを使う

2023/07/26に公開

はじめに

LaravelでPDFを生成するため、"laravel-mpdf"

$ composer require carlos-meneses/laravel-mpdf

を使って開発しています。日本語フォントのメイリオを使うのにかなり苦労したので、どうすればいいかを書いていきます。

前の記事は
https://zenn.dev/chromel/articles/6edadcdcce19fa
です。

バージョン情報

昔から使っているレンタルサーバなので、PHPのバージョンが古いです。

Laravel v8.83.27
PHP v7.4.33
mpdf v8.0
laravel-mpdf v???

mpdfをLaravelでも使えるようにするのがlaravel-mpdfの様ですね。

configの用意

config/app.phpの修正とconfig/pdf.phpの作成が必要です。順にみていきましょう。configファイルは内容が正しくて、configフォルダにさえ入っていれば、ファイル名は何でもよいようですね。

app.phpの方はPHP8を使っている方は形式が変わっている可能性があります。ここに書くのはPHP7の書き方です。ご注意ください。returnする配列に次の2つを加えます。

app.php
'providers' => [
//ほかの設定
//以下を追加
Mccarlosen\LaravelMpdf\LaravelMpdfServiceProvider::class,
],
'aliases' => [
'Bunsho' => Mccarlosen\LaravelMpdf\Facades\LaravelMpdf::class,
    ],

もう一つのconfigファイルは\vendor\carlos-meneses\laravel-mpdf\configをコピーしてから修正していきましょう。スネーク記法が基本みたいですね。表記ゆれの恐れがあるので、発行元が書いたキーなら間違いないでしょう。ということです。

pdf.php
<?php
return [
    'mode'                     => 'ja', //ここ大事っぽい
    'format'                   => 'A4',
    'default_font_size'        => '12',
    'default_font'             => 'sans-serif',
    'margin_left'              => 10,
    'margin_right'             => 10,
    'margin_top'               => 10,
    'margin_bottom'            => 10,
    'margin_header'            => 0,
    'margin_footer'            => 0,
    'orientation'              => 'P',
    'title'                    => 'Laravel mPDF',
    'subject'                  => '',
    'author'                   => '',
    'watermark'                => '',
    'show_watermark'           => false,
    'show_watermark_image'     => false,
    'watermark_font'           => 'sans-serif',
    'display_mode'             => 'fullpage',
    'watermark_text_alpha'     => 0.1,
    'watermark_image_path'     => '',
    'watermark_image_alpha'    => 0.2,
    'watermark_image_size'     => 'D',
    'watermark_image_position' => 'P',
    'custom_font_dir'          => public_path('fonts/'),//終わりのスラッシュを忘れない
    'custom_font_data'         => [ 'meiryo' => [ //キー名のmeiryoは大文字を使わない
                                    'R' => 'meiryo_plain.ttf',
                                    'I' => 'meiryo_italic.ttf',
                                    ],
                                  ],
    'auto_language_detection'  => false,
    'temp_dir'                 => storage_path('app'),
    'pdfa'                     => false,
    'pdfaauto'                 => false,
    'use_active_forms'         => false,
  ];

まずは、'mode' => 'ja'とします。日本語使います宣言です。

次に'custom_font_dir' => public_path('fonts/'),はpublicフォルダにfontsフォルダを作りメイリオttfファイルを入れましょう。ここではファイル名をmeiryo_plain.ttfmeiryo_italic.ttfとして入れました。

ルーター

web.php
<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\BunshoController;

Route::get('/viewPdf',[BunshoController::class,'viewPdf'])->name('viewPdf');

コントローラ

BunshoController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\BunshoModel;
use Bunsho;

class BunshoController extends Controller
{
    public function viewPdf(){
        $post = ["test"=>"hoge"];
        //下コードはresource/viewsにbunshoフォルダを作り、そこにbunsho.blade.phpを作ればよい
	$pdf = Bunsho::loadView('bunsho.bunsho', compact('post'));
        return $pdf->stream('document.pdf');
    }
}

use Bunsho;をお忘れなく。

モデル

BunshoModel.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class BunshoModel extends Model
{
    use HasFactory;
}

特にモデルの作りこみ要りません。

ビュー

bunsho/bunsho.blade.php
<p style="font-family:'meiryo';">こんにちは、世界!</p>

OR

<style>
  p.hoge{
    font-family:'meiryo';
  }
</style>
<p class="hoge">これはメイリオフォントです。</p>

ここは残念なご報告があって、ビューにcss記述が書いていないと、日本語フォント使えませんでした。外部cssは使えないようです。styleタグを書けば、idclassでも書けます。正しい手順に従っていたのに、使えないのなんでだろうな?と思っています。

細かい設定(今回の核心部分)

ここまでは何とか自力でもできると思います。
ここから大事です。vendorconfigフォルダを触ることになります。まずは、\vendor\mpdf\mpdf\src\ConfigにあるConfigVariables.phpを開きます。

1.maxTTFFilesize' => 2000,'maxTTFFilesize' => 20000,これはコメントを見るとフォントのアップロード制限のサイズ上限です。kB単位で書かれています。2000kBではメイリオは9000kB位あるのでここでは20000kBに変更します。でも、もしかしたらこれは変えなくていい説があります。

2.'useAdobeCJK' => true,にしておきましょう。東アジアの漢字フォントの設定です"Chinese,Japanese,Korean"の略ですね。

同じフォルダのFontVariables.phpも変更します。

FontVariables.php
'BMPonly' => [				
"dejavusanscondensed",
"dejavusans",
"dejavuserifcondensed",
"dejavuserif",
"dejavusansmono",
],

の配列の「最初」に、

FontVariables.php
'BMPonly' => [
//ここに「最初に」"meiryo"を書く
"meiryo",
"dejavusanscondensed",
"dejavusans",
"dejavuserifcondensed",
"dejavuserif",
"dejavusansmono",
],

の様に"meiryo"を加えます。

以上で設定は終わりです。もし、まだpdfが文字化けするようならCtrl+F5で更新してみてください。

蛇足

コントローラでLaravel/Mpdfインスタンス$pdfではなく、mpdfのインスタンスのメソッドを使いたいときには、

$pdf->getMpdf()->keepColumns = true;

の様にgetMpdfメソッドを使いましょう。例えばこのコードは2カラムにしたとき、文章を流し込むと片方のカラムの下端まで行ってから、次のカラムに書いていくようになります。

今日はここまで、お疲れさまでした。

Discussion