PHPからHTML形式の記述でPDFファイルを作るmpdfの使い方と日本語フォントの指定方法

mpdfというライブラリを使うと、プログラム言語PHPを使ってHTML形式でPDFファイルを作成することができます。実際に仕事でも使っているのですが、特定の日本語の場合、文字がおかしくなる現象がありました。
そこで今回は簡単なコードでmpdfを使ったPDFの作り方と日本語フォントの指定方法について書きます。割と簡単ですので初心者の方も試してみてください。

こんなサンプルプログラムを作ってみます

今回はサンプルとして申込書をPDFとして出力できるようにしてみます。

・申込用紙はExcelで作って保存(moushikomi.pdf)
・申込用紙にプログラムによって、内容(氏名、住所など)を上書きする

というような仕様です。プログラムはPDFファイルを下敷きとして読み込んで、氏名や住所などの内容をプログラムで出力するというものです。

Excelは

こんな感じに作って、通常保存したほかに、名前を付けて保存で

こんな感じにPDFで保存しておきます。

実際にプログラムを作るときはこの氏名や住所はWebサイトの申し込みフォームなどから入力した値を使ったり、データベースなどのデータから出力することになりますがそこまでサンプルPHPで書いてしまうと非常に長くなってしまうため、今回はPDFをどのように出力するかというところだけを具体的に記述しています。

氏名や住所などの値はPHPソースに直書きとなりますが、実際にはここにWebサイトの申し込みフォームなどから入力した値を使ったり、データベースなどのデータを入れるようなプログラムとなると思われます。

このプログラムはphptest というフォルダに moushikomi_print.php というプログラムを作ってそれを実行すると、申込書PDFが画面に表示されるようにします。moushikomi.pdf もこのphptest というフォルダに入れることになります。

mpdfライブラリのダウンロード

mpdfとはPDFから簡単なコードとHTMLでPDFファイルを出力できるライブラリです。

ダウンロードは
http://www.mpdf1.com/mpdf/index.php?page=Download

こちらから行うことができます。

mPDF version 6.0 をクリック。MPDF_6_0.zip というファイルがダウンロードされるので解凍します。

MPDF_6_0 というフォルダの中に mpdf60 というフォルダが入っています。

このフォルダをPDFファイルを作るPHPを置く場所から参照できるところに移動します。今回はプログラムを置いてあるphptest フォルダに移動しました。

プログラムは moushikomi_print.php という名前で作りますので、最終的にphptest フォルダの内容はこんな感じとなります。

mpdfを使ってPDFを作るプログラムを書く

mpdfを使ってPDFを作るPHPプログラムはこのようなコードになります。

このように短いPHPプログラムです。内容はmpdfライブラリの準備、下敷き(moushikomi.pdf)の準備、HTMLの編集、pdfの出力です。

各項目のセットはHTMLの形式が共通でしたので $tempDiv でテンプレートを作っておいて、sprintfでそれぞれに違う部分だけを置き換えています。

このように指定したのと同じことになります。

mpdfを使ってPDFを作るプログラムを実行してみる

このプログラムをブラウザで実行してみます。

このように下敷きとして作ったpdfの上にプログラムで指定した各項目の内容がうまく挿入されています(^^)/。

ここから

pdfファイルとして保存したり、印刷したりすることができます。

一部の文字がおかしくなる問題と原因、その解決方法

日本語もちゃんと表示されているし問題ない、と思ったのですがたくさんのデータを出力すると、一部の文字がおかしいことに気づきました。名前をおかしな文字をまとめた架空の名前に置き換えてみます。

これでプログラムを実行すると

このように  という字の横棒が3本のはずが2本という文字の 反 の上の棒が斜めになっている、  という字がだいぶおかしい(^_^; というようにおかしなことになっています。

ひらがなもきれいに出ていたし、いったいなぜ???としばらくわかりませんでしたが、検索して

中華フォントっちゅうか…

こちらのページでやっとわかりました。mpdfはcssなどで各PCに入っているフォントを使う方法(一般的なHTMLなどではこの方法)ではなく埋め込みフォント(mpdfに入っているフォントデータを利用する)を使っています。これは申込書など用紙の枠が決まっているようなときにどの環境でも同じように枠の中に入れるにはどの環境でも同じフォントが使われないとまずいため、だと思います。

今回日本語に対応して使われているのは cjkフォント というものでした。

cjk統合漢字

CJK統合漢字の名称は、中国語、日本語、朝鮮語で使われている漢字をひとまとめにしたことからきている。

とあるように中国語、日本語、朝鮮語で同じフォントを使えるようにしたものらしいです。しかし、参考にしたblog記事にあったように、すべての日本語が正しく出るわけでなく一部の文字がおかしい表示になってしまうようでした。

とういことで、cjkフォントに指定されているフォントデータ自体を置き換えたいと思います。

Webフォントとして利用可能なIPAフォントから、今回利用したい明朝体のttfファイルをダウンロードします。
*ライセンスについては http://ipafont.ipa.go.jp/node87#q005-1 参照

http://ipafont.ipa.go.jp/old/ipafont/download.html

こちらのページの

ipamp00303.zip をクリックしてダウンロード。ダウンロードしたファイルを解凍して、ipamp00303\ipamp00303\ にある
ipamp.ttf をコピーします。これを、phptest\mpdf60\ttfonts\ に貼り付けます。

cjkフォントでIPAフォントを利用できるようにするには、

phptest\mpdf60\config_fonts.php を開いて、

とあるところの Sun-ExtA.ttf を ipamp.ttf に置き換えます。

こんな感じです。今回は明朝体だけですがゴシック体を置き換えたいときはSun-ExtB.ttf というところを IPAからダウンロードしたゴシック体フォントに置き換えます。

この状態で再度プログラムを実行すると、

このように、おかしかった文字もちゃんと表示されるようになりました(^^)/

兎本美佳
ブログを見た人がそのままできたらいいなと思って、できるだけ丁寧に書いています。blogに書いたようなネタの有償対応のご相談は「ゆうそうと」へいただければと思います(^^)/
無償での対応をご希望の場合は、コメントをいただけましたら可能な場合はコメントを返させていただきます。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
スポンサー広告
トップへ戻る