# HTML から PDF に変換 PHP ライブラリ mPDF の設定

mPDF について
mpdf 5から長年 mpdf 愛用しておりますが 現在バージョンは8です。公式サイトはまだ v7 のままですが 試したところ使い方は変っていない模様。mpdf は html から pdf に変換するための php ライブラリです。FPDFHTML2FPDFをベースにして 機能強化及び性能アップして作られたそうです。

mpdf を選ぶ理由

同類のライブラリは複数ありますが 自分が使ってて良かったと思うところ

  • 軽い (他のライブラリよりビルドが速い)
  • 機能性 (改ページ ヘッダー設定 ダウンロード機能など)
  • ライブラリがわかりやすい (config ファイルやマニュアルが詳しい わかりやすい 設定が楽)
  • 多言語対応 (日本語 韓国語 中国語 アラビア語など 文字化けなしで多言語対応)

composer install

composer require mpdf/mpdf

package mpdf/mpdf (opens new window)

php に取り込む

<?php

require_once __DIR__ . '/vendor/autoload.php';

$mpdf = new \Mpdf\Mpdf();
$mpdf->WriteHTML('<h1>Hello world!</h1>');
$mpdf->Output();

# 日本語対応

当初日本語対応するのに フォントをダウンロードしていろいろ設定もいじらなくてはならなかったが バージョン 6 からコンフィグを2行設定するだけで 日本語韓国語中国語が対応できるようになり 非常に便利

config

  • autoScriptToLang
  • autoLangToFont

結論から言うと デフォルトではfalseになっていますが trueにするだけで完了

sample






 
 




<?php

require_once __DIR__ . '/vendor/autoload.php';

$mpdf = new \Mpdf\Mpdf([
    'autoScriptToLang' => true,
    'autoLangToFont' => true,
]);
$mpdf->WriteHTML('<h1>Hello こんにちは 漢字日本語!</h1>');
$mpdf->Output();

$mpdf->autoScriptToLang = true;
$mpdf->autoLangToFont = true;
でも一緒

# mpdf 設定オプション

オプションパラメタ デフォルト 説明
mode utf-8 文字コードや言語
format A4 PDF の書類サイズ
orientation L 書類の向き
default_font_size 14 CSS 設定 フォントサイズ
default_font meiryo CSS 設定 フォントの種類
margin_left 15 左余白
margin_right 15 右余白
margin_top 16 上余白
margin_bottom 16 下余白
margin_header 9 ヘッダー余白
margin_footer 9 フッター余白
$mpdf = new \Mpdf\Mpdf([
	'mode' => 'utf-8', // 文字コードや言語
	'format' => 'A4', // PDF
	'orientation' => 'L', // 書類の向き
	'default_font_size' => 14, // フォントサイズ
	'default_font' => 'meiryo', // フォントの種類
	'margin_left' => 8, // 左余白
	'margin_right' => 8, // 右余白
	'margin_top' => 10, // 上余白
	'margin_bottom' => 10, // 下余白
	'margin_header' => 15, // ヘッダー余白
	'margin_footer' => 15 // フッター余白
]);

# 用紙サイズ指定オプション

用紙サイズ一覧

  • A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10
  • B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 B10
  • C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 C10
  • Letter
  • Legal
  • Executive
  • Folio

mPDF のデフォルト用紙は A4

$mpdf = new \Mpdf\Mpdf([
	'format' => 'A4',
]);

任意のサイズを指定する際は配列で縦横を指定

$mpdf = new \Mpdf\Mpdf([
	'format' => [190, 236] // 横190mm、縦236mm
]);

# 用紙向き指定オプション

  • P Portrait 横向き
  • L Landscape 縦向き
$mpdf = new \Mpdf\Mpdf([
	'orientation' => 'L' // 用紙の向きを指定
]);

# フォント変更

デフォルトのフォントは明朝体ぽいが 丸めの IPA ゴシックに変更します。

  1. IPA フォント (opens new window)ダウンロード
  2. フォント TTF ファイルを適切のディレクトリに保存
  3. config 設定変更
    autoScriptToLang autoLangToFont の自動判別機能をオフにして
// デフォルト設定読込
$defaultConfig = (new \Mpdf\Config\ConfigVariables())->getDefaults();
$fontDirs = $defaultConfig['fontDir'];
$defaultFontConfig = (new \Mpdf\Config\FontVariables())->getDefaults();
$fontData = $defaultFontConfig['fontdata'];

// mpdf初期化
$mpdf = new \Mpdf\Mpdf([
    // 'autoScriptToLang' => true,
    // 'autoLangToFont' => true,
    'orientation' => 'L',     // 横向き
    'defaultheaderline' => 0, // ヘッダーアンダーライン消す
    'fontDir' => array_merge($fontDirs, [
        app_path('font'),     // Laravel app/fontディレクトリに保存
    ]),
    'fontdata' => $fontData + [
        'mplus' => [                      // Google フォント
            'R' => 'MPLUS1p-Regular.ttf',
            'B' => 'MPLUS1p-Bold.ttf',
        ],
        'ipag' => [                       // ipag IPAゴシックフォント
            'R' => 'ipag.ttf',
            'B' => 'ipag.ttf',
            'I' => 'ipag.ttf',
            'BI' => 'ipag.ttf',
        ],
        'ipagp' => [                      // ipagp IPAゴシックPフォント
            'R' => 'ipagp.ttf',
            'B' => 'ipagp.ttf',
            'I' => 'ipagp.ttf',
            'BI' => 'ipagp.ttf',
        ],
        'ipaexg' => [                     // ipaexg IPAexgゴシックフォント
            'R' => 'ipaexg.ttf',
            'B' => 'ipaexg.ttf',
            'I' => 'ipaexg.ttf',
            'BI' => 'ipaexg.ttf',
        ],
    ],
    'default_font' => 'ipaexg',           // デフォルトで使うフォント指定
]);

# 縦書き

mPDF はwriting-mode: vertical-rl;CSS の対応していないため スタイルシートで縦書きはできないが プログラムで文字列を配列にして一文字ずつ出力することで縦書き風にします。

foreach (preg_split('//u', $str_item, -1, PREG_SPLIT_NO_EMPTY) as $value){
    echo $value . '<br />';
}

# トータルページ番号表示

ヘッダーかフッターにページ番号と合計ページ数表示する時

// ヘッダーに設定
$mPDF->setHeader('{PAGENO} / {nb}ページ');

// フッターに設定
$mPDF->setFooter('{PAGENO} / {nb}ページ');

ヘッダー フッターに使えるエリアス

  • {PAGENO} ページ番号
  • {nb} トータルページ数
  • {DATE j-m-Y H:m} 日付時間 PHP date 関数

# config 設定

# Paging ページ関連

項目 デフォルト 備考
mirrorMargins (opens new window) 0 1に設定すると ドキュメントは奇数ページと偶数ページの左右のマージン値をミラーリングします。つまり 内側と外側のマージンになります。
forcePortraitMargins (opens new window) false デフォルトのページ方向が P(縦)の場合 新しいページ L(横)を追加すると 左/右マージンが上/下として使用され 逆も同様
displayDefaultOrientation (opens new window) false デフォルトのページの向きが P(縦)の場合 ドキュメント内の L(ランドスケープ)ページは Adobe Reader で表示され 縦に表示
autoPageBreak (opens new window) true 自動改ページを許可するかどうかを指定
setAutoTopMargin (opens new window) false ドキュメントの上部余白を定義する動作を指定
setAutoBottomMargin (opens new window) false 下·部余白を定義
autoMarginPadding (opens new window) 2 「ストレッチ」モードで 上部マージンとヘッダーの間のパディングを指定
margBuffer (opens new window) 2 (空の)ブロックの終わりがこの量(mm)だけ下マージンを超えて広がることを許可
printers_info (opens new window) false @page および marks:crop を使用するときに プリンターの日付とページ情報を追加
bleedMargin (opens new window) 5 @page メディアで使用されるデフォルトの裁ち落としマージンをミリメートル単位で設定
crossMarkMargin (opens new window) 5 マージンからの十字マークの距離(mm)
cropMarkMargin (opens new window) 8 マージンからクロップマークまでの距離(mm)
cropMarkLength (opens new window) 18 クロップラインの mm 単位のデフォルトの長さ
nonPrintMargin (opens new window) 8 用紙の端の印刷不可能な境界(mm)
defaultPagebreakType (opens new window) cloneall <改ページ/>を使用して 強制改ページの改ページを入力します。

# Page numbering

項目 デフォルト 備考
aliasNbPg (opens new window) {nb} ドキュメント内の合計ページ番号で置換されるテキストを定義する変数
aliasNbPgGp (opens new window) {nbpg} ページグループ内の合計ページ番号で置換されるテキストを定義する変数
pagenumPrefix (opens new window) {PAGENO}を使用してヘッダーまたはフッターにページ番号を挿入する場合 ページ番号の前にテキストを指定
pagenumSuffix (opens new window) {PAGENO}を使用してヘッダーまたはフッターにページ番号を挿入するときに ページ番号に続くテキストを指定
nbpgPrefix (opens new window) {nbpg}によって生成されたページ合計の前にテキストを指定
nbpgSuffix (opens new window) {nbpg}によって生成されたページの合計に従うテキストを指定
defaultPageNumStyle (opens new window) 1 ドキュメントの最初から使用するデフォルトのページ番号スタイルを指定

# Fonts, Languages and Character sets

項目 デフォルト 備考
autoScriptToLang (opens new window) false
autoLangToFont (opens new window) false

# Page Headers & Footers

項目 デフォルト 備考
defaultfooterfontsize 8
defaultfooterfontstyle BI
defaultfooterline 1
defaultheaderfontsize 8
defaultheaderfontstyle BI
defaultheaderline 1
footer_line_spacing 0.25
header_line_spacing 25
forcePortraitHeaders false

# 参考

mPDF 公式マニュアル(英語) (opens new window)

# The HTML code size is larger than pcre.backtrack_limit 1000000 エラー

一気に複数ページの PDF 作成する作業で backtrack_limit エラー発生があったが デフォルト値を変更したら治りました。

ini_set("pcre.backtrack_limit", "5000000");
2019-12-12
  • php

関連記事

Laravel メンテナンスモード
Laravel でカテゴリー作成 テーブル構築と再帰クエリ
Laravel を API サーバーとしての初期設定
Laravel リクエストログ出力
Carbon で php date 日付の日数・月数差を計算
Laravel 429 Too Many Requests
Laravel Email バリデーションについて
Laravel Sanctum 使って API トークン JWT 認証と SPA 認証
Laravel logger でエラーログを chatwork に自動送信
php CSV データ取得は fgetcsv 使う
Laravel tinker 使って DB データベース接続とコマンド
Laravel Test についてのメモ
Laravel Log の基本設定&使い方
Exception: Class 'ZipArchive' not found
Laravel Sail で Docker 環境構築
PHP 文字列長さ・文字列の幅を取得方法
Codeigniter 画像アップロードとリサイズ
Laravel Lumen Faker 日本語設定
laravel method の基本 get post put options
Laravel schedule 設定
Class 'Imagick' not found Error
Laravel eloquent model の規約
PHP mbconvertkana 全角半角英数カナ変換
Codeigniter APPPATH BASEPATH FCPATH 各種パスと URL 取得
Laravel timestamp() auto update 有効化無効化
Lumen8 で JWT ユーザー認証
Laravel toSql パラメータ付きで出力
Lumen8 で API 開発
php Exception エラーキャッチでメール送信
Smarty HTTP URL 取得できるサーバー関数
Laravel blade foreach loop と current url
laravel session を制する
PHP empty isset is_null の違い
PHP 8 リリース新機能と変更
FlattenException deprecated
php.ini 初期設定のいろいろ
Laravel 5.1 から 8.1 にバージョンアップ
PHP 7.4 にアップグレードして使えなくなる機能
開発時によく使うゼロ埋めパディング作業まとめ
解決!phpMyAdmin テーブル構造の内容が表示されない問題
codeigniter email ライブラリでメール送信 日本語対応
Composer コマンドとオプション
爆速軽量フレームワーク codeigniter PHP 開発
nuxtjs と codeigniter で jwt システム構築
Lumen と Laravel 違い比較
twig 3 人気 PHP テンプレートエンジンがバージョンアップ
正規表現一覧 よく使う検索・置換のパターン
Apache 初期設定メモ
開発におけるコーディングルール・規約
Laravel Error についてのメモ
laravel に vuejs 使うための初期設定
php curl 使って クリックなしで POST 送信
allowurlinclude の設定で ftp_connect()エラー