フォーム XObject

フォーム XObject
フォーム XObject」は、外部オブジェクト (XObject) の一部です。

フォーム XObject は、コンテンツストリームとして定義します。

画像 XObject などと同じように、Do 命令を使って、フォーム XObject で定義されているグラフィックの内容を、別のページのグラフィックの一部として描画することができます。

同ページ内や複数ページで、同じ内容を複数回描画したい場合に有用です。
PDF を処理する側では、レンダリング結果をキャッシュすることで、高速化も期待できます。

フォーム XObject では、「フォーム空間」と呼ばれる独自の座標系が使われるため、描画する際には、フォーム空間からユーザー空間への変換が必要になります。

処理手順
Do 命令が呼び出された場合、以下のような手順で処理が実行されます。
(グラフィック状態は、Do 命令が読み出された時点での状態が使われます)

  1. グラフィック状態をスタックに保存 (q 命令)
  2. フォーム辞書の Matrix エントリの行列を、現在の変換行列に追加
  3. フォーム辞書の BBox エントリに応じて、クリッピングを行う
  4. フォームのグラフィックを描画
  5. グラフィック状態を復元 (Q 命令)
フォーム XObject のストリーム辞書
Typenameオブジェクトのタイプ。常に /XObject
Subtypename(必須) XObject のタイプ。
フォーム XObject の場合、/Form
FormTypeintegerフォーム XObject のタイプ。※現在は 1 のみ。
default = 1
BBoxrectangle(必須) フォームの空間の領域
Matrixarrayフォーム空間をユーザー空間に変換するための行列 (6つの数値の配列)。
default = [1 0 0 1 0 0] (変換なし)
Resourcesdictionary(PDF 1.2) 必要なリソースのリソース辞書。

PDF 1.1 以前では、リソースは、各ページのリソース辞書で指定する必要がある。
PDF 1.2 以降では、この設定は必須ではないが、独立したリソースとして定義することが推奨される。
Groupdictionary(PDF 1.4) グループ XObject として扱うことを示し、グループ属性辞書を指定する
Refdictionary(PDF 1.4) 参照 XObject として扱うことを示し、参照辞書を指定する
Metadatastream(PDF 1.4) メタデータストリーム
PieceInfodictionary(PDF 1.3) フォーム XObject に関連付けられたページピース辞書
LastModifieddate(PDF 1.3。PieceInfo がある場合は必須)
フォーム XObject のコンテンツが最後に変更された日時。
PieceInfo が存在する場合、この更新日付を使用して、フォームの現在のコンテンツに対応するアプリケーションデータ辞書が確認される。
StructParentinteger(PDF 1.3) 構造親ツリー内のフォーム XObject エントリの整数キー
StructParentsinteger(PDF 1.3) 構造的な親ツリー内のフォーム XObject のエントリの整数キー
OPIdictionary(PDF 1.2) フォーム XObject の OPI バージョン辞書
OCdictionary(PDF 1.5) フォーム XObject のオプションのコンテンツプロパティを指定するオプションのコンテンツグループまたはオプションのコンテンツメンバーシップ辞書。

フォームが処理される前に、このエントリに基づいてその可視性が決定されます。
非表示であると判断された場合、フォームを呼び出す Do 演算子が存在しないかのように、フォーム全体がスキップされます。
Namename(PDF 1.0 では必須。現在は廃止)
現在のリソース辞書の XObject エントリの辞書で、このフォーム XObject が参照される名前。
使用例
>> 14.pdf

フォーム XObject で定義した破線の四角形を、2つ描画しています。

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
<< /XObject << /FORM1 6 0 R >>
>>
endobj

% コンテンツストリーム
5 0 obj
<< /Length 73 >>
stream
q
200 0 0 200 100 500 cm
/FORM1 Do
Q
q
100 0 0 100 100 300 cm
/FORM1 Do
Q
endstream
endobj

% フォーム XObject
6 0 obj
<< /Type /XObject
   /Subtype /Form
   /BBox [0 0 1 1]
   /Length 35
>>
stream
0.01 w % 線幅を 0.01 に (空間の 1/100)
[0.02 0.03] 0 d % 破線 (長さをフォーム空間に合わせる)
0 0 1 1 re % 四角形 (フォーム空間全体)
S  % ストローク描画
endstream
endobj

ここでは、ページに描画する時にサイズが扱いやすくなるように、フォーム空間を [0 0 1 1] のサイズで指定しています。
フォーム空間は、任意の大きさにすることができます。

フォームのグラフィック内容を、常にページの同じ位置とサイズで描画したいのであれば、BBox エントリにページと同じ矩形を指定し、Matrix エントリを省略すれば、フォーム空間はユーザー空間と全く同じになります。

この例では、フォーム空間を独自の座標系にしているため、線幅などを指定する際は、注意しなければなりません。

フォーム空間のサイズが 1 であるため、線幅を 1 としてしまうと、ものすごく太い線になってしまいます。
ここでは、線幅を 0.01 としました。

同じく、破線の長さも、フォーム空間に合わせる必要があります。

フォーム XObject を描画する際に、位置やサイズを変えたい場合は、Do 命令の前に cm 命令を使って、変換行列を指定します。