テキスト
PDF でテキストを描画するためには、まず、フォントの定義が必要になります。
PDF で使用するフォントは、リソース辞書の Font エントリで、辞書によって定義します。
辞書の各キーには「任意のフォント定義名」を指定し、値には、「フォントの情報を定義したフォント辞書」を指定します。
※フォント辞書の各エントリは、使用するフォントのタイプによって、設定する値が異なります。
コンテンツストリーム内では、テキスト関連の命令を使うことで、任意の文字列を描画できます。
また、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」となります。
デフォルトではユーザー空間と同じですが、Tm 命令を使って、テキスト空間からユーザー空間への変換行列を設定することができます。
また、テキストの各グリフは、「グリフ空間」によって表されます。
グリフ空間は、各フォントで定義されているグリフの座標系と同じです。
PDF では、「グリフの 1 em = ユーザー空間における 1.0」となります。
そのため、「ユーザー空間の 1 単位 = 1/72 インチ = 1 pt」となります。
テキスト関連命令
BT, ET
BT 命令から ET 命令の間に記述されたテキストは、一つのテキストオブジェクトとなります。
(一つのグラフィック要素として扱われるので、変換行列などは、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 size | Tf | フォントとフォントサイズを指定する。 fontname は、現在のリソース辞書の Font エントリの辞書で定義されている名前 (名前オブジェクト)。 size は、グリフサイズを 1 とした倍数 (デフォルトの空間単位では、pt 単位に等しい)。 初期値はないため、明示的に指定する必要がある。 |
数値 | Tr | テキストレンダリングモードを設定。 0 : 通常 (塗りつぶしのみ) [default] 1 : ストロークのみ 2 : 塗りつぶしとストローク 3 : 非表示 4 : 0 と同じで、クリッピングパスも追加 5 : 1 と同じで、クリッピングパスも追加 6 : 2 と同じで、クリッピングパスも追加 7 : クリッピングパスに追加 クリッピングパスに追加する場合、 テキストオブジェクトの終了時に単一のパスに結合され、 個々のパスがサブパスとして扱われる (非ゼロワインディング規則) |
数値 | Ts | ベースラインからの移動距離 (テキスト空間単位)。 初期値 = 0。 正の値で上に移動する。 上付き・下付き文字を描画する際などに使う。 |
テキスト命令
座標などは、基本的にテキスト空間単位で指定します。
オペランドで指定する文字列は、PDF 構文と同じ形式で指定します。
※ただし、フォントごとの文字エンコーディングで記述する必要があります。
テキストを描画すると、各文字のグリフの幅ごとに水平移動します (横書きの場合)。
また、行を移動する際は、TL 命令で設定された方向と距離で垂直移動します。
オペランドで指定する文字列は、PDF 構文と同じ形式で指定します。
※ただし、フォントごとの文字エンコーディングで記述する必要があります。
オペランド | 命令 | 説明 |
---|---|---|
a b c d e f | Tm | テキスト空間からユーザー空間への変換行列を設定。 行列の6個の数値を指定する (配列ではない)。 初期値は [1 0 0 1 0 0] (変換なし) |
x y | Td | テキスト位置を次の行の先頭に移動し、行の先頭から (x, y) だけ移動。 ※x,y は、ページ上の絶対位置ではなく、現在の行の先頭からの相対位置であることに注意してください。 行送り (TL) はデフォルトで 0 になっているので、Td 命令を使うと、前に実行された Td の先頭位置に戻って、そこから x,y を相対移動する形になります。 また、初期位置は (0,0) となっています。 |
x y | TD | Td と同じだが、同時に y の値を行の移動距離として設定する。 以下と同じ。 -y TL x y Td |
- | T* | 次の行の先頭に移動 |
string | Tj | テキスト文字列を描画 |
string | ' | (シングルクォーテーション) 次の行に移動して、テキスト文字列を描画 |
aw ac string | " | (ダブルクォーテーション) 次の行に移動して、単語間隔を aw、文字間隔を ac に設定して、テキストを描画。 以下と同じ。 aw Tw ac Tc string ' |
array | TJ | 配列内に、文字列と数値を複数指定して、テキストを描画。 要素が文字列の場合は、そのテキストを描画します。 要素が数値の場合は、その分だけテキスト位置を移動します。 (テキスト空間の 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