FPDF(MBFPDF) でプロポーショナルフォントを使おう

動機

FPDF は PHP で手軽に PDF を出力できる手軽かる強力なライブラリで、これにマルチバイト対応の MBFPDF を利用すると日本語も利用できるようになり、非常に重宝しています。
しかし、使っているうちにどんどん欲が出てくるもので、英数字以外でもプロポーショナルフォントが使いたい…と思い、MBFPDF の改良に手を出した次第です。

とりあえず、使ってみよう

プロポーショナルフォント対応版は MBFPDF を使ったスクリプトを「ほぼ」そのまま利用できるになっていますので、 まずは MBFPDF を利用できるようにしておいてください。 その上で、プロポーショナルフォント対応版 mbfpdf-1.26-kzhk.zip をダウンロード、上書きをすれば準備完了です。

プロポーショナルフォント対応版に差し替える上での注意点としては、

があげられます。

実際に、プロポーショナルフォント(PMINCHO など)を指定して、ひらがな・カタカナを含んだ PDF を作成してみて効果を確認してみてください。

プロポーショナルフォント対応について

プロポーショナルフォントに対応するためには、フォントのメトリクス情報が必要となるのですが、 このメトリクス情報を入手するために APACHE FOP の org.apache.fop.fonts.apps.TTFReader クラスを利用しています。
ただし、このプログラムは otf フォントには対応していないようなので、MSMincho,MSGothic 系の情報しか得られなかったため、 プロポーショナルとして指定できるのは(とりあえず)MSMincho,MSGothic 系のフォントとなります。

なお、メトリクス情報は、MBFPDF オリジナルのものとプロポーショナルフォント対応版のどちらともが利用できますが、 プロポーショナルフォント対応版の定義が優先されます。

このため、非Windows系のクライアントでは、事実上使い物にならないと考えてください。

mbfpdf-1.25-kzhk から、KozMinProVI-Regular,KozGoPro-Medium,HiraKakuPro-W3,HiraMinPro-W3 のフォント情報を追加していますが、 これらは半角部分のみのメトリクス情報なので英数字以外では固定ピッチとなります(オリジナルの MBFPDF のフォント定義です)。

メトリクス情報の作成方法について

メトリクス情報の作成方法に関してですが、必要となるプログラム・ファイルがちょっとややこしいので、頭の中を整理してそのうち書きます。

otf フォントのメトリクス情報の取り出し方法を知っている人は教えてもらえるとありがたいです。

追加機能について

Horizontal Scaling の指定

SetFont() 関数と SetFontSize() 関数で「Horizontal Scaling(水平方向の描画比率)」の指定をできるようにしました。

SetFont($family, $style='', $size=0, $hs=100)
$hs で描画比率を%で指定します。未指定時は100%(本来の幅)で描画します。
SetFontSize($size, $hs='')
$hs で描画比率を%で指定します。未指定時は変更なし(以前の状態を引き継ぐ)となります。

たとえば helvetica と日本語フォントを並べると間延びして見える…というようなときに、

SetFont('helvetica', '', 10, 80);

のように指定すると本来の80%の幅で描画することができます。

MultiCell() で描画に必要な高さを得る

FPDF-J のフォーラムの「表の自動折り返しについて」の GetMultiCellHeight() 関数と同等の機能の実装です。
行数ではなく、「高さ」を直接返すようにしていますので、上記フォーラムの関数の置き換え時には注意してください。

GetMultiCellHeight($w, $h, $txt)
幅 $w で描画するときに必要な高さを返します。具体的には、折り返し後の行数×$h となります。

ご利用上の注意

プロポーショナルフォント対応版は PHP-5.0.4 / UTF-8 環境下で作成・テストをしていますので、 それ以外の組み合わせでは正常に動作をしない可能性があります。

mbfpdf-1.24-kzhk から、MBMultiCell/MBWrite の文字幅計算部分を大幅に変更しました。 MBFPDF では素直に FPDF の実装を拡張しているようでしたが、折返し部分の抽出を共通化したため、ソース自体の見通しは良くなっています。
日本語フォント以外も MBMultiCell/MBWrite を利用するようにしたため、FPDF とは動作が異なっている可能性があります。 手持ちのスクリプトでは問題は見つけられませんでしたが、かなり力技な計算をしているのでおかしなところが残っているかと思います。

また、簡単なぶら下がり禁則を実装しましたので、MultiCell や Write も多少は細かなことを考えずに使えるようになったのではないかと思います。


Presented by Kazuhiko Iwama.