Laravel/Mpdfでメイリオを使う
はじめに
LaravelでPDFを生成するため、"laravel-mpdf"
$ composer require carlos-meneses/laravel-mpdf
を使って開発しています。日本語フォントのメイリオを使うのにかなり苦労したので、どうすればいいかを書いていきます。
前の記事は
です。バージョン情報
昔から使っているレンタルサーバなので、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つを加えます。
'providers' => [
//ほかの設定
//以下を追加
Mccarlosen\LaravelMpdf\LaravelMpdfServiceProvider::class,
],
'aliases' => [
'Bunsho' => Mccarlosen\LaravelMpdf\Facades\LaravelMpdf::class,
],
もう一つのconfigファイルは\vendor\carlos-meneses\laravel-mpdf\config
をコピーしてから修正していきましょう。スネーク記法が基本みたいですね。表記ゆれの恐れがあるので、発行元が書いたキーなら間違いないでしょう。ということです。
<?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.ttf
とmeiryo_italic.ttf
として入れました。
ルーター
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\BunshoController;
Route::get('/viewPdf',[BunshoController::class,'viewPdf'])->name('viewPdf');
コントローラ
<?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;
をお忘れなく。
モデル
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class BunshoModel extends Model
{
use HasFactory;
}
特にモデルの作りこみ要りません。
ビュー
<p style="font-family:'meiryo';">こんにちは、世界!</p>
OR
<style>
p.hoge{
font-family:'meiryo';
}
</style>
<p class="hoge">これはメイリオフォントです。</p>
ここは残念なご報告があって、ビューにcss記述が書いていないと、日本語フォント使えませんでした。外部cssは使えないようです。style
タグを書けば、id
やclass
でも書けます。正しい手順に従っていたのに、使えないのなんでだろうな?と思っています。
細かい設定(今回の核心部分)
ここまでは何とか自力でもできると思います。
ここから大事です。vendor
のconfig
フォルダを触ることになります。まずは、\vendor\mpdf\mpdf\src\Config
にあるConfigVariables.php
を開きます。
1.maxTTFFilesize' => 2000,
を'maxTTFFilesize' => 20000,
これはコメントを見るとフォントのアップロード制限のサイズ上限です。kB単位で書かれています。2000kB
ではメイリオは9000kB
位あるのでここでは20000kB
に変更します。でも、もしかしたらこれは変えなくていい説があります。
2.'useAdobeCJK' => true,
にしておきましょう。東アジアの漢字フォントの設定です"Chinese,Japanese,Korean"の略ですね。
同じフォルダのFontVariables.php
も変更します。
'BMPonly' => [
"dejavusanscondensed",
"dejavusans",
"dejavuserifcondensed",
"dejavuserif",
"dejavusansmono",
],
の配列の「最初」に、
'BMPonly' => [
//ここに「最初に」"meiryo"を書く
"meiryo",
"dejavusanscondensed",
"dejavusans",
"dejavuserifcondensed",
"dejavuserif",
"dejavusansmono",
],
の様に"meiryo"
を加えます。
以上で設定は終わりです。もし、まだpdfが文字化けするようならCtrl+F5
で更新してみてください。
蛇足
コントローラでLaravel/Mpdfインスタンス$pdfではなく、mpdfのインスタンスのメソッドを使いたいときには、
$pdf->getMpdf()->keepColumns = true;
の様にgetMpdf
メソッドを使いましょう。例えばこのコードは2カラムにしたとき、文章を流し込むと片方のカラムの下端まで行ってから、次のカラムに書いていくようになります。
今日はここまで、お疲れさまでした。
Discussion