TCPDFに限らず、漢字文化の無い国で作成されたシステムには縦書きの概念がありません。 RL フォントを扱うシステムでは特に問題となります。

TCPDFは縦書きを考慮した設計にはなっていないものの、 少し手を加えることで、不完全ながらも縦書きに対応することができます。 ここでは、その方法をご紹介します。

フォント設定ファイルを書き換える方法

addFontで生成されるファイルを書き換えてしまいます。 addFont初回時に生成されるファイルはtcpdf/fonts/の中に保存されます。 「IPA明朝」の場合は次のファイルが追加されているはずです。

ipam.ttf

フォントファイル本体です。

ipam.z

ファイルサイズから推測するに、フォントデータが格納されているようです。 Tarで圧縮されているのか、バイナリデータです。 フォントファイルそのものが格納されているわけではない可能性があります。

ipam.php

設定ファイルです。 このファイルを書き換えることで縦書きに対応させます。

ipam.ctg.z

不明です。 Tarで圧縮されているのか、バイナリデータです。 ファイル名から推測するとカテゴリですが、いまひとつ掴めません。

ipam.phpファイルをテキストエディタで開いて次のように書き換えます。 元のコードは、コメントアウトして残しておくと良いでしょう。

フォントタイプをCIDに変更します。 IPA明朝に限らず、日本語用フォントであれば「TrueTypeUnicode」になっているはずです。

//$type='TrueTypeUnicode';
$type='cidfont0';

文字の幅をCIDフォントの規定幅に変更します。 文字を描画しても、実際にはポインタから位置がずれます。

//$dw=600;
$dw=1000;

フォントのエンコードを変更します。 CIDフォントの場合は、このコードになります。 ※ CMapの変換テーブルがUTF-16用しか用意されていないため

//$enc='';
$enc='UniJIS-UTF16-H';

フォントデータのファイル名を未定義に変更します。 フォントデータがCIDを想定していないため、埋め込むと化けるので埋め込まないようにします。

//$file='';

謎データのファイル名を未定義に変更します。 指定しているとフォントデータを探しに行くのでエラーとなるので、こちらも未定義にします。

//$ctg='';

CID用の設定追加と、CMap変換テーブルファイルのパスを追加します。 詳しくは不明ですが、この変換テーブルがあって初めて文字を参照できるようです。

$cidinfo=array('Registry'=>'Adobe', 'Ordering'=>'Japan1','Supplement'=>5);
include(dirname(__FILE__).'/uni2cid_aj16.php');

上書用ファイルを用意する方法

フォント設定ファイルを直接書き換えてしまうと、横書きに戻したいときや使い分けたいときに困ります。 なので、CIDフォントとして使用したい場合には、新しく用意したファイルを参照するようにしましょう。

縦書き用上書ファイルはファイル名の末尾に「-v」と追加したファイルを用意します。 ipam.phpなら、ipam-v.phpとします。 そして、先程変更したのと同じ動作をするコードを記述します。

<?php
require(dirname(__FILE__).'/ipam.php');
$type='cidfont0';
$dw=1000;
$enc='UniJIS-UTF16-V';
$diff='';
$file='';
$ctg='';
$cidinfo=array('Registry'=>'Adobe', 'Ordering'=>'Japan1','Supplement'=>5);
include(dirname(__FILE__).'/uni2cid_aj16.php');

同様に、横書き用上書ファイルも用意しておきましょう。 ファイル名の末尾に「-h」と追加したファイルを用意します。

<?php
require(dirname(__FILE__).'/ipam.php');
$type='cidfont0';
$dw=1000;
$enc='UniJIS-UTF16-H';
$diff='';
$file='';
$ctg='';
$cidinfo=array('Registry'=>'Adobe', 'Ordering'=>'Japan1','Supplement'=>5);
include(dirname(__FILE__).'/uni2cid_aj16.php');

これらのファイルはipam.phpと同じ階層に配置します。