# 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;
でも一緒

# フォント変更

デフォルトのフォントは明朝体ぽいが、丸めの 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
レンタルサーバー エックスサーバー レンタルサーバー エックスサーバー DMM fx DMM fx 開発/運用エンジニア募集プログラム 開発/運用エンジニア募集プログラム 外為ジャパンFX 新規口座開設促進 外為ジャパンFX 新規口座開設促進 eBay公式ショッピングサイト Qoo10 eBay公式ショッピングサイト Qoo10 Amazon.co.jpのカテゴリごとのページ

関連記事

正規表現一覧 よく使う検索・置換のパターン
Apache 初期設定メモ
codeigniter email ライブラリでメール送信 日本語対応
Codeigniter APPPATH BASEPATH FCPATH 各種パスと URL 取得
PHP mbconvertkana 全角半角英数カナ変換
php 開発におけるコーディングルール・規約
php date 日付の日数・月数差を計算
php curl 使って クリックなしで POST 送信
FlattenException deprecated
php Exception エラーキャッチでメール送信
allowurlinclude の設定で ftp_connect()エラー
Lumen と Laravel 違い比較
Laravel 5.7 の MVC 使う時のメモ
Laravel timestamp() auto update 有効化無効化
PHP empty isset is_null の違い
Laravel toSql パラメータ付きで出力
Lumen8 で JWT ユーザー認証
Lumen8 で API 開発
PHP 8 リリース新機能と変更
twig 3 人気 PHP テンプレートエンジンがバージョンアップ
解決!phpMyAdmin テーブル構造の内容が表示されない問題
Smarty HTTP URL 取得できるサーバー関数
開発時によく使うゼロ埋めパディング作業まとめ
nuxtjs と codeigniter で jwt システム構築
PHP 7.4 にアップグレードして使えなくなる機能
php.ini 初期設定のいろいろ
Composer コマンドとオプション
Laravel Error についてのメモ
爆速軽量フレームワーク codeigniter PHP 開発