PDF 構文 テキスト
PDF構文 (PDF Syntax ISO 32000-2)
ここでは32000-2規格に基づいたPDF1.7の構文(構造)について説明しています。
PDFファイルは8-bitデータを単位として構成されていて一般の文書編集アプリケーションで開くことができその内容を読取ることができます。ただし、バイナリのデータもそのまま(表示可能な文字に変換されずに)格納されていますので文字化けしているように表示されますが、これはPDFの仕様です。
ここではそのデータの一部を読み解くことでPDF文書へのデータ追加などPDF再構成の意味を説明し、PDF-ToolsでのPDFデータ解析や編集をより詳細にできるようにします。
5.テキスト
テキストは指定されたフォントのグリフ(字形)を様々に指定された方法で表示されます。
ここではテキストを表示するためにオブジェクトに記載する具体的な内容を説明します。
PDFで使用するテキストやグラフィックスの描画コマンドはPostScript言語をPDF用に特化したそのサブセットです。また、PDFの原点(x=0,y=0)はウィンドウの左下で、画面の解像度を既定では1インチあたり72画素(1単位は1/72インチ)としています。ただし、UserUnitの指定によって解像度を変更できます。
5.1 テキスト描画演算子
PDFでは、以下のようなコマンドでテキストをページに描画(表示)します。
BT /F13 12 Tf 288 720 Td (ABC) Tj ET
上記例にあるワードが描画演算子で、それらの意味は以下のとおりです。
- BTテキストオブジェクトの開始
- 名前 サイズ Tf
- x座標 y座標 Td開始位置を指定
左から4インチ(4x72=288)、下から10インチ(10x72=720)を開始位置に指定します。 - テキスト Tjテキストを描画
テキスト文字列 「ABC」 を描画します。
しかし、指定されるのは必ずしも文字列や文字コードではありません。 - ETテキストオブジェクトの終了
5.2 フォント定義
Resourcesとしてのフォントの定義例を示します。
この例ではHelvaticaフォントを 「SF1」 として定義しています。
/Resources << /Font << /SF1 1 0 R >> >> 1 0 obj << /Type /Font /Subtype /Type1 /Encoding /WinAnsiEncoding /BaseFont /Helvetica >> endobj
1 0 objはフォントディクショナリです。詳細は「6.フォント」を参照してください。
フォントの指定は日本語を指定する場合や、フォント埋め込みの有無などでその方法が違います。
5.3 テキストへのグラフィックな効果
テキストを表示する際はその色を指定することはもちろん、文字のパス・図形のパス・塗りつぶしを使って別のオブジェクトをクリップするように指定することができます。
以下のコマンドでは、50%のグレーでテキストを塗りつぶして表示します。
BT /F13 48 Tf 20 40 Td 0 Tr 0.5 g (ABC) Tj ET

次のコマンドでは線幅2でテキストのパスを描画します。
BT /F13 48 Tf 20 38 Td 1 Tr 2 w (ABC) Tj ET

5.4 文字間隔・行間隔、レンダリングモード
テキストにはグラフィック効果だけでなく文字間隔・行間隔などを指定できます。以下のコマンドでそれらを指定します。
コマンド | 値 | 意味 |
---|---|---|
Tc | 文字間隔 | 文字と文字の間隔を指定 |
Tw | 単語間隔 | 単語と単語の間隔を指定 |
Tz | 文字の幅 | 文字の幅を%で指定 |
TL | 行間隔 | ベースラインと次の行のベースラインの間隔を指定 |
Tf | フォント サイズ | フォントおよびそのサイズを指定 |
Tr | レンダリングモード | 塗りつぶしやパスの描画の方法を指定 |
Ts | テキストライズの方向と距離 | テキストをベースラインの上下へ移動方法を指定 |
文字間隔
Tc=0 (既定値)
Tc=0.25
単語間隔
Tw=0 (既定値)
Tw=2.5
文字の幅
Th=100 (既定値)
Th=50
ベースラインと次の行のベースラインの間隔
TL=14.5

塗りつぶし

パスを描く

塗りつぶし
パスを描く

塗りつぶしなし
パスを描かない

塗りつぶし
パスでクリップ

パスを描く
パスでクリップ

塗りつぶし
パスを描く
パスでクリップ

塗りつぶしなし
パスを描かない
パスでクリップ
(This text is ) Tj 5 Ts (superscripted) Tj

Tj(This text is ) Tj –5 Ts (subscripted) Tj

Tj(This ) Tj –5 Ts (text ) Tj 5 Ts (moves ) Tj 0 Ts (around) Tj

5.5 座標系
PDFの原点(x=0,y=0)は左下で、1単位は1/72インチです。この座標系にフォントのグリフ(字形)を表示させるためには大きさや位置を指定しての変換が必要になります。PDFでは以下の行列を使ってその変換を実施します。
a | b | 0 | ||
c | d | 0 | ||
e | f | 1 |
この行列は以下の変換式に利用します。
y' = b・x + d・y + f
PDFでは変換の行列を表すためにその定数要素を除いた6っの値を組み合わせて [ a b c d e f ]としたarray(配列)を使用します。 これによって以下のように置き換え(移動)・拡大縮小・回転・ゆがみを実施します。




置き換え
[ 1 0 0 1 tx ty ] を指定します。
拡大縮小
[ sx 0 0 sy 0 0 ] を指定します。
回転
[ cos(q) sin(q) -sin(q) cos(q) 0 0 ] を指定します。
ゆがみ
[ 1 tan(a) tan(b) 1 0 0 ] を指定します。