テキスト

テキスト
PDF でテキストを描画するためには、まず、フォントの定義が必要になります。

PDF で使用するフォントは、リソース辞書の Font エントリで、辞書によって定義します。
辞書の各キーには「任意のフォント定義名」を指定し、値には、「フォントの情報を定義したフォント辞書」を指定します。

※フォント辞書の各エントリは、使用するフォントのタイプによって、設定する値が異なります。

3 0 obj
<< /Type /Page
   /Parent 2 0 R
   /MediaBox [ 0 0 612 792 ]
   /Resources 4 0 R
   /Contents 5 0 R
>>
endobj

% リソース辞書
4 0 obj
<< /Font << /FONT1 6 0 R >>
>>
endobj

% フォント辞書
6 0 obj
<< /Type /Font
   /Subtype /Type1
   /BaseFont /Helvetica 
>>
endobj

コンテンツストリーム内では、テキスト関連の命令を使うことで、任意の文字列を描画できます。
また、PDF では、縦書きのテキストにも対応しています。

フォント辞書については、各フォントタイプごとに説明していきますので、ここでは、まず、テキスト関連の命令を説明します。
テキスト空間
テキストの位置やサイズは、「テキスト空間」によって指定されます。

デフォルトではユーザー空間と同じですが、Tm 命令を使って、テキスト空間からユーザー空間への変換行列を設定することができます。

また、テキストの各グリフは、「グリフ空間」によって表されます。
グリフ空間は、各フォントで定義されているグリフの座標系と同じです。

PDF では、「グリフの 1 em = ユーザー空間における 1.0」となります。

そのため、「ユーザー空間の 1 単位 = 1/72 インチ = 1 pt」となります。
テキスト関連命令
BT, ET
BT 命令から ET 命令の間に記述されたテキストは、一つのテキストオブジェクトとなります。
(一つのグラフィック要素として扱われるので、変換行列などは、BT〜ET までのすべてのテキストを対象として適用されます)

BT
10 100 Td
(ABCD) Tj
ET

なお、BT〜ET 間で設定したテキスト位置や、テキスト空間の変換行列は、次のテキストオブジェクトには適用されず、初期化されます。
ただし、文字間隔などのテキスト状態は、そのまま次のテキストオブジェクトにも適用されます。
テキスト状態を設定する命令
テキストに関するパラメータは、グラフィック命令で設定します。

テキスト状態のパラメータは、グラフィック状態に含まれるため、一つのコンテンツストリーム内で値が保持されます。

テキストは、パスと同じように、輪郭をなぞるストロークと、内側の塗りつぶしで構成することができます (アウトラインフォントの場合)。

そのため、通常のテキストの色は、塗りつぶし部分の色として扱われるため、テキストの色を指定する場合は、ストローク以外用の色として設定する必要があります。

オペランド命令説明
数値Tc文字間隔を設定 (テキスト空間単位)。
初期値 = 0。
次の文字位置へ移動する時に、この値が追加される。
数値Tw単語間隔を設定 (テキスト空間単位)。
初期値 = 0。
半角スペース文字の幅に追加される。
数値Tz文字の水平方向の倍率を設定。
通常の幅を 100 とした割合。初期値 = 100。
文字幅を拡大縮小します。
数値TL現在の行から次の行までの移動距離を設定 (テキスト空間単位)。
初期値 = 0。

正の値で下方向に移動します。
※デフォルトで 0 であるため、次の行は現在の行に重ねて描画されます。
fontname sizeTfフォントとフォントサイズを指定する。
fontname は、現在のリソース辞書の Font エントリの辞書で定義されている名前 (名前オブジェクト)。
size は、グリフサイズを 1 とした倍数 (デフォルトの空間単位では、pt 単位に等しい)。

初期値はないため、明示的に指定する必要がある。
数値Trテキストレンダリングモードを設定。

0 : 通常 (塗りつぶしのみ) [default]
1 : ストロークのみ
2 : 塗りつぶしとストローク
3 : 非表示
4 : 0 と同じで、クリッピングパスも追加
5 : 1 と同じで、クリッピングパスも追加
6 : 2 と同じで、クリッピングパスも追加
7 : クリッピングパスに追加

クリッピングパスに追加する場合、
テキストオブジェクトの終了時に単一のパスに結合され、
個々のパスがサブパスとして扱われる (非ゼロワインディング規則)
数値Tsベースラインからの移動距離 (テキスト空間単位)。
初期値 = 0。
正の値で上に移動する。
上付き・下付き文字を描画する際などに使う。
テキスト命令
座標などは、基本的にテキスト空間単位で指定します。

オペランドで指定する文字列は、PDF 構文と同じ形式で指定します。
※ただし、フォントごとの文字エンコーディングで記述する必要があります。

オペランド命令説明
a b c d e fTmテキスト空間からユーザー空間への変換行列を設定。
行列の6個の数値を指定する (配列ではない)。
初期値は [1 0 0 1 0 0] (変換なし)
x yTdテキスト位置を次の行の先頭に移動し、行の先頭から (x, y) だけ移動。
※x,y は、ページ上の絶対位置ではなく、現在の行の先頭からの相対位置であることに注意してください。

行送り (TL) はデフォルトで 0 になっているので、Td 命令を使うと、前に実行された Td の先頭位置に戻って、そこから x,y を相対移動する形になります。
また、初期位置は (0,0) となっています。
x yTDTd と同じだが、同時に y の値を行の移動距離として設定する。

以下と同じ。
-y TL
x y Td
-T*次の行の先頭に移動
stringTjテキスト文字列を描画
string'(シングルクォーテーション)
次の行に移動して、テキスト文字列を描画
aw ac string"(ダブルクォーテーション)
次の行に移動して、単語間隔を aw、文字間隔を ac に設定して、テキストを描画。

以下と同じ。
aw Tw
ac Tc
string '
arrayTJ配列内に、文字列と数値を複数指定して、テキストを描画。

要素が文字列の場合は、そのテキストを描画します。
要素が数値の場合は、その分だけテキスト位置を移動します。
(テキスト空間の 1/1000 単位。正の値で、指定値分の幅が減ることになります)

値は、フォントサイズにスケーリングする前の段階での値となるため、
1000 で 1 em と等しくなります。
次の文字まで 0.5 em の幅を空けたいなら、-500 となります。

テキストを描画すると、各文字のグリフの幅ごとに水平移動します (横書きの場合)。

また、行を移動する際は、TL 命令で設定された方向と距離で垂直移動します。
ベースライン
テキスト描画時は、横書きなら、フォントのベースライン位置が基準になります。
縦書き時は、グリフの左右中央・上端が基準になります。
テキスト描画位置の移動
Td で位置を移動する場合、前回の Td 移動時の先頭位置からの相対移動になるので、注意してください。

BT
% 初期位置は (0,0) なので、用紙上の (100,200) の位置に移動して ABC を描画
100 200 Td (ABC) Tj
% (100,200) の位置に戻った上で、(0,50) を相対移動し、(100,250) の位置へ
0 50 Td (DEF) Tj
ET
使用例
>> 15.pdf

3 0 obj
<< /Type /Page
   /Parent 2 0 R
   /MediaBox [ 0 0 612 792 ]
   /Resources 4 0 R
   /Contents 6 0 R
>>
endobj

% リソース辞書
4 0 obj
<< /Font << /FONT1 5 0 R >>
>>
endobj

% フォント辞書 (Type1)
5 0 obj
<< /Type /Font
   /Subtype /Type1
   /BaseFont /Helvetica 
>>
endobj

% コンテンツストリーム
6 0 obj
<< /Length 104 >>
stream
/FONT1 24 Tf % フォント指定
24 TL % 行高指定
BT
10 600 Td
(ABCDEFG) Tj
(abcdefg) '  % 次の行に移動して描画
ET
BT
10 500 Td
% A と B の間を 1 em 空け、
% B と CD の間を 0.5 em 空ける
[(A) -1000 (B) -500 (CD)] TJ
ET
endstream
endobj