ページについて
PDF の各ページは、「ページツリー」と呼ばれる、ツリー状の構造によって定義されます。
これによって、ページ順も決まります。
※このツリー構造は、アウトライン(目次)の階層とは関係ありません。アウトラインの階層は別の形で定義します。
ページツリーには、「ページツリーノード」と呼ばれる中間ノードと、
「ページオブジェクト」と呼ばれるリーフノードの2種類が含まれます。
ページツリーノードにはツリーの構造情報のみが含まれ、これを使ってツリー構造を形成します。
ツリーの末端は常にページオブジェクトであり、ページオブジェクトには単一ページの情報が含まれます。
ページツリーノードもページオブジェクトも、辞書で定義されます。
また、ページツリーのルート (ページツリーノード) は、カタログ辞書の Pages エントリで指定します。
これによって、ページ順も決まります。
※このツリー構造は、アウトライン(目次)の階層とは関係ありません。アウトラインの階層は別の形で定義します。
ページツリーには、「ページツリーノード」と呼ばれる中間ノードと、
「ページオブジェクト」と呼ばれるリーフノードの2種類が含まれます。
ページツリーノードにはツリーの構造情報のみが含まれ、これを使ってツリー構造を形成します。
ツリーの末端は常にページオブジェクトであり、ページオブジェクトには単一ページの情報が含まれます。
【ページツリーノード】┬【ページツリーノード】─【ページオブジェクト】 └【ページツリーノード】┬【ページオブジェクト】 └【ページオブジェクト】
ページツリーノードもページオブジェクトも、辞書で定義されます。
また、ページツリーのルート (ページツリーノード) は、カタログ辞書の Pages エントリで指定します。
ページツリーノードの辞書
ページツリーを構成するための情報です。
この辞書内で、"継承可能" であるページオブジェクトのエントリを指定すると、その属性を子に継承させることができます。
Type | name | (必須) オブジェクトのタイプ。常に /Pages |
---|---|---|
Parent | dictionary | (ルートのノード以外では必須。間接参照) 直接の親であるページツリーノード |
Kids | array | (必須) 子への間接参照の配列。 直接の子をすべて配列で指定します。 子は、ページツリーノードまたはページオブジェクトです。 |
Count | integer | (必須) ページツリー内において、このノードの子孫となるページオブジェクトの数。 直接の子だけでなく、子の子など、このノード以下が持つすべてのページの総数を指定します。 (ページツリーノードは数に含めません) |
この辞書内で、"継承可能" であるページオブジェクトのエントリを指定すると、その属性を子に継承させることができます。
ページオブジェクトの辞書
単一ページの情報や内容などを指定します。
必ず、ページツリーノードの子である必要があります。
"継承可能" と記述されているエントリは、ページツリーノードの辞書でも指定できます。
"ユーザー空間" については、詳細はグラフィックの説明の時に行いますが、この空間は、出力デバイスの座標系に左右されない、ページ独自の座標系です。
基本的に 1.0 = 1/72 インチで、左下が原点となります。
必ず、ページツリーノードの子である必要があります。
"継承可能" と記述されているエントリは、ページツリーノードの辞書でも指定できます。
"ユーザー空間" については、詳細はグラフィックの説明の時に行いますが、この空間は、出力デバイスの座標系に左右されない、ページ独自の座標系です。
基本的に 1.0 = 1/72 インチで、左下が原点となります。
Type | name | (必須) オブジェクトのタイプ。常に /Page |
---|---|---|
Parent | dictionary | (必須。間接参照) 直接の親であるページツリーノード |
LastModified | date | (PDF 1.3。PieceInfo が存在する場合は必須) ページのコンテンツが最後に変更された日時。 PieceInfo が存在する場合、この更新日時を使用して、含まれるアプリケーションデータ辞書のどれが現在のコンテンツに対応するかを確認します。 |
Resources | dictionary | (必須。継承可能) ページに必要なリソースを含む辞書。 ※ページにリソースが必要ない場合は、空の辞書とすること。 エントリ自体を省略した場合は、上位ノードからの継承となります。 |
MediaBox | rectangle | (必須。継承可能) ページを表示または印刷する時の物理メディアの境界を定義する長方形 (ユーザー空間単位)。 これは、ページの領域となります。 |
CropBox | rectangle | (継承可能) 可視領域 (ユーザー空間単位)。 default = MediaBox の値 |
BleedBox | rectangle | (PDF 1.3) 本番環境で出力するときに、ページの内容をクリッピングする領域 (ユーザー空間単位)。 default = CropBox の値 |
TrimBox | rectangle | (PDF 1.3) 完成したページ (トリミング後) の目的の寸法となる長方形 (ユーザー空間単位)。 default = CropBox の値 |
ArtBox | rectangle | (PDF 1.3) 意味のあるコンテンツ(潜在的な空白を含む)の範囲を定義する長方形 (ユーザー空間単位)。 default = CropBox の値 |
BoxColorInfo | dictionary | (PDF 1.4) さまざまなページ境界のガイドラインを画面に表示する際に使用する色、およびその他の視覚特性を指定する、BoxColorInfo 辞書。 このエントリが存在しない場合、アプリケーションは独自のデフォルト設定を使用する必要があります。 |
Contents | stream or array | このページの内容となるコンテンツストリーム。 このエントリが存在しない場合、ページは空となる。 ※要素を含まない配列は指定してはならない。 値は、単一のストリーム、またはストリームの配列です。 配列の場合は、配列内のすべてのストリームが順番に連結されて、単一のストリームが形成されます。 |
Rotate | integer | (継承可能) 表示または印刷時に、ページを時計回りに回転させる角度。 値は 90 の倍数であること。 default = 0。 |
Group | dictionary | (PDF 1.4) 透明なイメージングモデルを使用する場合、ページグループの属性を指定するグループ属性辞書 |
Thumbs | stream | ページのサムネイル画像 |
B | array | (PDF 1.1) ページに表示される記事ビーズへの間接参照の配列 |
Dur | number | (PDF 1.1) ビューアが自動的に次のページに進む時、このページが表示される最大時間(秒単位)。 デフォルトで、自動的に進まない。 |
Trans | dictionary | (PDF 1.1) ページが自動的に進む時に使用される、遷移効果の辞書 |
Annots | array | ページに関連付けられた注釈を表す注釈辞書の配列 |
AA | dictionary | (PDF 1.2) ページが開かれたとき、または閉じられたときに実行されるアクションを定義する、追加アクション辞書 |
Metadata | stream | (PDF 1.4) ページのメタデータを含む、メタデータストリーム |
PieceInfo | dictionary | (PDF 1.3) ページに関連付けられたページピース辞書 |
StructParents | integer | (PDF 1.3。ページに構造的なコンテンツアイテムが含まれる場合は必須) 構造的な親ツリーのページエントリの整数キー。 |
ID | byte string | (PDF 1.3。間接参照が望ましい) ページの親 Web キャプチャコンテンツセットのデジタル識別子 |
PZ | number | (PDF 1.3) 自然な表示倍率を達成するためのスケーリング係数 |
SeparationInfo | dictionary | (PDF 1.3) ページの色分解を生成するために必要な情報を含む分離辞書 |
Tabs | name | (PDF 1.5) ページ上の注釈に使用されるタブ順序を指定する名前。 指定可能な値は、/R(行の順序)、/C(列の順序)、および /S(構造の順序)。 |
TemplateInstantiated | name | (PDF 1.5) 元のページオブジェクトの名前。 このページが名前付きページオブジェクトから作成された場合は必須。 |
PresSteps | dictionary | (PDF 1.5) ページの最初のノードを表すナビゲーションノード辞書 |
UserUnit | number | (PDF 1.6) ユーザー空間の1単位を、1.0 = 1/72 インチとした倍率で示す。 default = 1.0 |
VP | dictionary | (PDF 1.6) ページの長方形の領域を指定するビューポート辞書の配列 |
属性の継承について
ページオブジェクトで "継承可能" としているエントリは、ページツリーノードでも指定することができます。
ページオブジェクトで「継承可能」なエントリが省略されていた場合、上位ノードを順に検索して、その属性がページツリーノードで設定されていた場合は、その値が使用されます。
親に属性を指定することで、その属性をすべての子に継承させることが可能となります。
例えば、すべてのページが同じサイズであれば、ルートのページツリーノードで MediaBox エントリを指定して、すべてのページオブジェクトにおいて MediaBox エントリを省略すれば、すべての子が同じページサイズとなります。
継承可能なエントリが "必須エントリ" である場合は、必ずどこかで、そのエントリを定義する必要があります。
継承可能なエントリがオプション扱いのエントリである場合に、いずれの場所でも値が設定されていなかった場合は、そのエントリのデフォルト値が使用されます。
ページオブジェクトで「継承可能」なエントリが省略されていた場合、上位ノードを順に検索して、その属性がページツリーノードで設定されていた場合は、その値が使用されます。
親に属性を指定することで、その属性をすべての子に継承させることが可能となります。
例えば、すべてのページが同じサイズであれば、ルートのページツリーノードで MediaBox エントリを指定して、すべてのページオブジェクトにおいて MediaBox エントリを省略すれば、すべての子が同じページサイズとなります。
継承可能なエントリが "必須エントリ" である場合は、必ずどこかで、そのエントリを定義する必要があります。
継承可能なエントリがオプション扱いのエントリである場合に、いずれの場所でも値が設定されていなかった場合は、そのエントリのデフォルト値が使用されます。
コンテンツストリームについて
「コンテンツストリーム」は、ページの内容となるグラフィックを記述するストリームです。
ストリームオブジェクトで定義し、ページオブジェクトの Contents エントリで指定します。
ストリームのデータ部分には、ページに描画するグラフィックの命令を、テキストで記述します。
内容は、PDF 構文の規則に従って解釈されます。
PostScript と同じで、先にオペランド(命令のパラメータ)を記述し、その後に命令を記述していきます。
オペランドでは、ストリームオブジェクトを除く PDF データ型のいずれかを、直接記述します。
コンテンツストリーム内で間接参照を使用することはできません。
ストリームオブジェクトで定義し、ページオブジェクトの Contents エントリで指定します。
ストリームのデータ部分には、ページに描画するグラフィックの命令を、テキストで記述します。
内容は、PDF 構文の規則に従って解釈されます。
PostScript と同じで、先にオペランド(命令のパラメータ)を記述し、その後に命令を記述していきます。
12 0 obj << /Length 18 >> stream % (50,50)-100x100 の四角形パスを追加。're' が命令 50 50 100 100 re % 'S' はストロークを描画する命令 S endstream endobj
オペランドでは、ストリームオブジェクトを除く PDF データ型のいずれかを、直接記述します。
コンテンツストリーム内で間接参照を使用することはできません。
ページの例
>> 08.pdf
ツリーは上記の構成で、ページごとに四角形の描画位置を移動させています。
【ルート】┬【子1】─【子1A】 └【子2】┬【子2A】 └【子2B】
ツリーは上記の構成で、ページごとに四角形の描画位置を移動させています。
%PDF-1.3 % カタログ辞書 1 0 obj << /Type /Catalog /Pages 2 0 R % ルートのページツリーノード >> endobj %---- % ページツリーノード (ルート) 2 0 obj << /Type /Pages /Kids [ 3 0 R % 子1 4 0 R ] % 子2 /Count 3 /MediaBox [ 0 0 612 792 ] % ページ領域。すべての子に継承させる >> endobj % ページツリーノード (子1) 3 0 obj << /Type /Pages /Parent 2 0 R % 親はルート /Kids [ 5 0 R ] % 子1-A /Count 1 >> endobj % ページツリーノード (子2) 4 0 obj << /Type /Pages /Parent 2 0 R % 親はルート /Kids [ 6 0 R % 子2-A 7 0 R ] % 子2-B /Count 2 >> endobj % ページツリーノード (子1-A) 5 0 obj << /Type /Pages /Parent 3 0 R % 親は子1 /Kids [ 8 0 R ] % ページオブジェクト /Count 1 >> endobj % ページツリーノード (子2-A) 6 0 obj << /Type /Pages /Parent 4 0 R /Kids [ 9 0 R ] /Count 1 >> endobj % ページツリーノード (子2-B) 7 0 obj << /Type /Pages /Parent 4 0 R /Kids [ 10 0 R ] /Count 1 >> endobj %---- % ページオブジェクト (子1-A) 8 0 obj << /Type /Page /Parent 5 0 R /Contents 11 0 R >> endobj % ページオブジェクト (子2-A) 9 0 obj << /Type /Page /Parent 6 0 R /Contents 12 0 R >> endobj % ページオブジェクト (子2-B) 10 0 obj << /Type /Page /Parent 7 0 R /Contents 13 0 R >> endobj %---- % コンテンツストリーム (子1-A) 11 0 obj << /Length 18 >> stream 10 10 100 100 re S endstream endobj % コンテンツストリーム (子2-A) 12 0 obj << /Length 20 >> stream 100 100 100 100 re S endstream endobj % コンテンツストリーム (子2-B) 13 0 obj << /Length 20 >> stream 200 200 100 100 re S endstream endobj xref 0 14 0000000000 65535 f 0000000031 00000 n 0000000126 00000 n 0000000275 00000 n 0000000395 00000 n 0000000534 00000 n 0000000656 00000 n 0000000778 00000 n 0000000901 00000 n 0000001011 00000 n 0000001121 00000 n 0000001235 00000 n 0000001347 00000 n 0000001461 00000 n trailer << /Size 14 /Root 1 0 R % カタログ辞書 >> startxref 1533 %%EOF