TCPDFで特定日本語文字が表示されないのをなんとかする
PHPでPDFファイルを生成するために、私は「TCPDF」を使用しています。
関数を呼び出すと、PDFを作成することができる優れものです。
今回、PDFで出力するプログラムを制作していたのですが、出力した文字が空欄になっている現象が発生しました。
いろいろ調べると、特定日本語文字(特殊文字)のみTCPDFで表示されてない現象でした。
(一般的な日本語は表示されますが、「髙」「㈱」「㌫」といった特殊文字が表示されませんでした)
これでは具合が悪いと思い、いつものごとくググって調べて対処いたしました。
現象はこのような感じです
TCPDFで、次のような記述をしてみました。
1 |
$pdf->Text(20, 20, "ここから>> 髙 : ㈱ : ㌫ << ここまで"); |
すると、このように表示されました。
特殊文字が表示されませんでした。
しかし、正しく対処したところうまく表示されるようになりました。
いろいろ試行錯誤してうまく対処できました。
そのやり方について解説いたします。
原因はTCPDFのフォントにあります
特殊文字が出ないのは、TCPDFの問題というよりも、指定したフォントが特殊文字に対応していないために起こります。
今回フォント指定をTCPDF備え付けの「kozgopromedium(小塚ゴシックPRO)」にしていましたが、どうやらこのフォントでは、特殊文字が表示されないようです。
他のフォントでうまく表示できればそれに越したことはないのですが、うまくいきませんでした・・。
こうなったら、やれることは一つです。
特殊文字がちゃんと表示できるフォントをTCPDFに追加する
TCPDFはフォントを追加できるようになっています。
特殊文字が表示できるフォントをTCPDFにインストールすればこの問題は解決します。
事実、フォントインストールをしたことで正しく表示されるようになりました。
このやり方について解説いたします。
特殊フォントをTCPDFにインストールするための手順
ざっくりとですが、以下の手順で行います。
- 正しく表示できるフォントを取り出す
- フォントをttf形式に変換する
- ttf形式フォントをTCPDFに登録する
パソコンからフォントを取り出し、2回変換すればそれでよいのです。
でも、
言うは易く行うは難しです。
フォントの変換って、そもそもどういうこと?
TCPDFにフォント登録ってどうやってやるの?
と実際にやろうとすると、わからないことばかりです。
でも大丈夫です。
次の通りにやればTCPDFにフォント登録ができます。
(1)正しく表示できるフォントを取り出す。
フォントデータは、Windowsであればコントロールパネルから取り出すことができます。
word等で特殊文字がちゃんと表示できるフォントをしらべ、該当のフォントを取り出します。
■コントロールパネルを開く
コントロールパネルを開きます。
windowsシステムツールメニューの中にあります。
見当たらなければ、「コントロールパネル」で検索すると出てきます。
■フォントをクリックします
アイコン別表示にしたら、フォントをクリックします。
該当のフォントをコピーして、適当なフォルダにペーストします
該当のフォントを探し、右クリックしてコピーします。
あとは、適当なフォルダで貼り付け(ペースト)すると、目的のフォントが取り出せます。
(2)フォントをttf形式に変換する
取り出したフォントは、大抵「ttc」形式です。
このままだとTCPDFへは登録できないため、ttf形式に変換します。
■ttf形式の変換には、変換してくれるサイトを利用する
フォント変換には、変換サイトを利用します。
こちらのtrans fonter でttc形式のフォントをttf形式に変換できます。
■trans fonter で先ほど取り出したフォントを選択する
Upload fileボタンから、先ほど取り出したttc形式のフォントを読み込みします。
■フォント変換が終わるのを待つ
変換フォントを読ませると、変換が始まります。
10秒ほどで終わります。
■変換されたttf形式のフォントをダウンロードする
変換が終わると、このような画面になるのでダウンロードボタンをおして、ダウンロードします。
変換フォントが複数になる場合は、個別ダウンロードができますが、zip形式の一括ダウンロードが楽です。
以上でフォント変換は終わりです。
(3)フォントをTCPDFに登録する
TCPDFに登録するフォントが準備出来たら、TCPDFへの登録を行います。
ここで重要なことは、登録処理を自分でPHPで作るという点です。
登録だから簡単なのかと思いましたが、力業での登録作業です。
■TCPDFへ登録するプログラムを作る
プログラムといっても数行です。
以下の記述でOKです。
今回はfontconv.phpという任意の名前で保存しました。
1 2 3 4 5 6 7 8 9 10 |
<?php require_once('tcpdf/tcpdf.php'); /** PDFクラス取得 */ $font = new TCPDF_FONTS(); //ttfフォントをTCPDF用に変換 $myFont = $font->addTTFfont("Meiryo-01.ttf"); ?> |
■注意点
- require_onceのパスは、TCPDFの環境に合わせて適時設定します。(今回はtcpdfというフォルダ名です)
要は「 addTTFfont() 」関数を呼び出せばよいだけなのです。
■疑問:「Meiryo-01.ttf」はどこから引っ張ってきた名前なの?
追加するフォント名は、先ほど変換して出来上がったファイル名をそのまま指定します。
この時に、フォントファイルのいる相対位置にも気お付けます。
プログラムとフォントを同じフォルダに入れておけば簡単で良いです。
あとは作った登録用のPHPを実行すれば、tcpdfにフォントが追加されます。
PHPなので、ブラウザから起動します。
私の事例だとxamppで実行し、そのまま本番環境へコピーしました。
(一度フォント登録すると、あとはコピーするだけで登録したフォントが他の環境でも使えます。)
登録したフォントの呼び出し方
TCPDFで登録したフォントを呼び出すのは、SetFont関数で行います。
1 |
$pdf->SetFont("meiryo01", "", 16); |
■疑問:”meiryo01″という名称はどっから引っ張ってきたの?
今回追加したフォントはメイリオですが、tcpdfライブラリの「fonts」フォルダに追加されています。
「fonts」フォルダに追加されたファイルの名称をそのまま指定すればOKです。
私は最初SetFontに記述するフォント名がわからず悩みましたが、なんてことはありませんでした。
登録時に作られたファイル名をそのまま指定すればよいだけでした。
これにより、特殊文字も正しく表示されるようになりました。
思ったより手間はありますが、ひとつひとつゆっくりやればできます
今回の作業は、思ったよりも手間がありました。
わかってしまえば、なんてことはありませんが、それでもやることが少々多いです。
こんな時は、作業を分割して、ひとつずつゆっくりやるのがコツです。
慌てて一気にやろうとすると、軽いパニックになり作業が止まってしまいます。
急がば回れです。
本記事がまたお役に立てば幸いです。