小三ツ星インターフェイス

【メモ】SendPDFプラグインへのフォントインストール

WordPressのプラグインに「SendPDF for contact form 7」というものがある。

メールフォームとして世界的に人気のContact form 7を使い、メールフォームに入力された値をPDFとして出力、メールに添付して送信してくれるというものだ。

https://wordpress.org/plugins/send-pdf-for-contact-form-7/

良いプラグインなのだが、問題点もある。

現在抱えているのは、

  1. ver.0.9.1.1 時点において、チェックボックス・ラジオボタンの選択肢の値に2バイト文字列があると、そのデータはPDFファイルに出力されない
  2. 漢字が中華フォント。字体も足りず全角アルファベットなどは豆腐(文字がないことを示す長方形の記号)になる。

の2つ。

1つ目については、ver 0.9.5 ではちゃんと出力されるので、その後のバージョンアップに伴う問題。
【追記2023/12/17】var1.0.0.1にて日本語出力ができなくなる問題は解消された。ただしそれ以降のバージョンで別更新によりサイトにJavaScriptに関連するエラーが表示される問題が発生。このエラーはvar1.0.1.8で解消。

今回、2つ目の問題については長らく作者さん対応してもらえてないので、自力でどうにかすることにした。ここにやったことをメモしておく。

本題

環境など

このプラグインはPDFを生成するライブラリとしてmPDFを使っている。

なので、「mPDF 日本語フォント」などのキーワードでいろいろ検索した。

SendPDF 0.9.9.1 プラグインで使われているmPDFのバージョンは8.0.0。なお、検索して出てくる情報はvar5とかのものが多く、configファイルなどの名前などが変わっているなどの問題に直面した。それでも十分助かったので、先達の皆様に感謝。参考にした記事をいかに記す。

https://qiita.com/kunihiko_sugiura/items/7e33cd6490ea53a1b87d

http://piyopiyocs.blog115.fc2.com/blog-entry-790.html

https://tohokuaiki.hateblo.jp/entry/20121113/1352810525

作業内容

1 フォントファイルの準備

Notoフォントが使えたらよかったのだが、mPDF が otf 形式に対応しているかいまいち情報が乏しかったのでこちらは断念。実績のある ttf 形式のフォントを使うことにした。

IPAフォントが ttf 形式なので、IPA PゴシックとIPA P明朝を使うことにした。

https://moji.or.jp/ipafont/ipafontdownload/

ダウンロードしたフォントファイルを、/mpdf/vendor/mpdf/mpdf/ttfonts/ フォルダにコピー。

2 フォントファイルの登録作業

/mpdf/vendor/mpdf/mpdf/src/Config/FontVariables.php ファイルの、
'fontdata' => [で始まるリストに登録したフォントを追加する。
/* CJK fonts */の後ろあたりに以下を追加。

'ipamp' => [/* Japanese */
		'R' => "ipamp.ttf",
	],
	'ipagp' => [
		'R' => "ipagp.ttf",
	],

あと、こちらは不要かもしれないけど
'backupSubsFont' => ['dejavusanscondensed', 'freesans', 'sun-exta'],

'backupSubsFont' => ['dejavusanscondensed', 'freesans', 'ipamp', 'sun-exta'],
に、

'backupSIPFont' => 'sun-extb',

'backupSIPFont' => ['ipagp', 'sun-extb'],
に変更。

それぞれの当該部分のコメントを見てみる。

// Optionally set font(s) (names as defined below in ‘fontdata’) to use for missing characters
// when using useSubstitutions. Use a font with wide coverage – dejavusanscondensed is a good start
// only works using subsets (otherwise would add very large file)
// More than 1 font can be specified but each will add to the processing time of the script

DeepL翻訳にかけてみると、

オプションとして、useSubstitutions を使用する際に、欠落している文字に使用するフォント (複数可) (名前は以下の ‘fontdata’ で定義されます) を設定することができます。
広い範囲をカバーするフォントを使います – dejavusanscondensed がよいでしょう。は、サブセットを使ってのみ動作します(そうしないと、非常に大きなファイルが追加されます)。
複数のフォントを指定することもできますが、それぞれスクリプトの処理時間が増えます。

// Optionally set a font (name as defined below in ‘fontdata’) to use for CJK characters
// in Plane 2 Unicode (> U+20000) when using useSubstitutions.
// Use a font like hannomb or sun-extb if available
// only works using subsets (otherwise would add very large file)

useSubstitutions を使用する際、Plane 2 Unicode (> U+20000) の日中韓キャラクタに使用するフォント (fontdata’ で以下に定義する名前) をオプションで設定することができます。
hannomb や sun-extb のようなフォントが利用可能であれば、サブセットを用いてのみ動作します (そうでないとファイルが非常に大きくなります)。

とある。で、このuseSubstitutionsについてコードを検索してみると、
ConfigVariables.phpに

// Substitute missing characters in UTF-8(multibyte) documents - from other fonts
'useSubstitutions' => false,

とあったので、この設定は多分機能しないと思う。

3 使用するフォントの設定変更

/mpdf/vendor/mpdf/mpdf/src/Language/LanguageToFont.php ファイルの、以下のコードを修正。
修正前:

case 'ja':
case 'jpn': // Japanese HIRAGANA KATAKANA
	$unifont = 'sun-exta';
	if ($adobeCJK) {
		$unifont = 'sjis';
	}
	break;

修正後:

case 'ja':
case 'jpn': // Japanese HIRAGANA KATAKANA
	$unifont = 'ipamp';
	if ($adobeCJK) {
		$unifont = 'ipamp,ipagp,sjis';
	}
	break;

これは、日本語を出力するときに使う可能性があるフォントの一覧ということなので、優先適用したいフォントを追加。

4 lang2fonts.cssの編集

/mpdf/vendor/mpdf/mpdf/data/ フォルダの lang2fonts.css で

:lang("ja"), :lang("jpn")  {	/* Japanese HIRAGANA KATAKANA */
	font-family: sun-exta, sjis;
}

:lang("ja"), :lang("jpn")  {	/* Japanese HIRAGANA KATAKANA */
	font-family: ipamp, ipagp, sjis;
}

に変更。
これはおそらく、PDFのプレビューで使われるものと思われる。

5 言語選択メニューへの登録

/classes/send-pdf.php の、
function wpcf7pdf_getFontsTab() {
return array(

のリストに以下を追加。

'IPA-gp' => 'ipagp',
'IPA-mp' => 'ipamp',