PDF 構文 ドキュメント カタログ
PDF構文 [PDF Syntax ISO 32000-2]
ここでは32000-2規格に基づいたPDF2.0の構文(構造)について説明しています。
PDFファイルは8-bitデータを単位として構成されていて一般の文書編集アプリケーションで開くことができその内容を読取ることができます。ただし、バイナリのデータもそのまま(表示可能な文字に変換されずに)格納されていますので文字化けしているように表示されますが、これはPDFの仕様です。
ここではそのデータの一部を読み解くことでPDF文書へのデータ追加などPDF再構成の意味を説明しPDF StructureやPdftools SDKでのPDFデータ解析や編集をより詳細にできるようにします。
3. ドキュメント カタログ (Document Catalog)
Catalog(カタログ)ディクショナリは、PDF文書のオブジェクト階層のルート(最上位)です。
CatalogディクショナリはTrailer(トレイラー)のRoot要素に記載されます。
多くの場合、カタログ ディクショナリへのリファレンスとしてRoot要素に記載されています。
ドキュメント カタログには以下が含まれます。
- 文書内容 (docoment contents)
- しおり (アウトライン、outlines)
- 記事スレッド (article threads)
- 名前の付いた到達先 (named destinations)
- 他の属性 (other attributes)
- PDF文書を表示する際の情報
3.1 Catalog(カタログ) ディクショナリの項目
Catlog(カタログ)ディクショナリには以下の項目が記載されます。
キー | タイプ | 値 |
---|---|---|
Type | name | (必須)"Catalog"を指定 |
Version | name | (省略可)PDFファイルのHeader(ヘッダー)に記載されたバージョンより古い場合は、無視されます。PDF文書が更新され更新前のバージョンより新しくなった場合は、ここで指定されます。 |
Extensions | dictionary | このPDF文書で使用されている、開発者プレフィックス識別とバージョン番号が含まれた開発者拡張(Extension)機能のディクショナリ |
Pages | dictionary | (必須)Page Tree(ページツリー) |
Names | dictionary | (省略可;PDF 1.3) |
ViewerPreferences | dictionary | (省略可)PDF文書の画面表示方法を指定する設定ディクショナリ。このエントリがない場合ではPDFリーダーは現在ユーザーの設定を使用します。 |
PageLayout | name | (省略可)文書を表示したときのレイアウトを指定
以下の値で指定します。
1ページを表示
1っのカラムでページを表示
2っのカラムでページを表示、奇数ページが左カラム
2っのカラムでページを表示、奇数ページが右カラム
2ページを同時に表示、奇数ページが左側
2ページを同時に表示、奇数ページが右側
|
PageMode | name | (省略可)文書を表示した時の全体構成を指定
以下の値で指定します。
しおり、サムネール画像を非表示
しおりを表示
サムネール画像を表示
フルスクリーン・モード表示
オプショナル コントロール パネル表示
アタッチメント パネル表示
|
Outlines | dictionary | (省略可)Outlines(アウトライン)のルートへの参照を指定 アウトラインは、文書の概要を階層で示した情報です。 |
Threads | array | (省略可)Articlesノード オブジェクトへの参照 |
OpenAction | array / dictionary | (省略可)文書を開くときの動作を指定します。 arrayの場合はDestinationsを表し、dictionaryの場合はActionsを表します。 |
AA | dictionary | (省略可)ドキュメント全体に影響を及ぼすさまざまなトリガー・イベントに応じて実行されるアクションを定義するAdditional-Actionディクショナリ |
AcroForm | dictionary | (省略可)Interactive Formディクショナリ(入力フォーム)を指定 |
Metadata | streams | (省略可)Metadata Streamsを表すインダイレクトオブジェクトへの参照 |
StructTreeRoot | dictionary | (省略可)PDF文書の構造(Structure)ツリーのルートディクショナリ |
Lang | text string | (省略可)PDF文書内のすべてのテキストの言語を指定する言語識別子(構造要素またはマークされたコンテンツの言語指定によって上書きされている場合は除きます)。このエントリがない場合の言語は不明とみなされます。 |
SpiderInfo | dictionary | (省略可)すべてのWebキャプチャ(Capture)拡張機能で使用される状態情報を格納するWebキャプチャ情報ディクショナリ |
OutputIntents | array | (省略可)PDF文書がレンダリングされる可能性のある出力デバイスの色特性を指定する出力Intentディクショナリの配列 |
PieceInfo | dictionary | (省略可)文書に関連付けられたページピースディクショナリ |
DSS | dictionary | (省略可;PDF 2.0)ドキュメント全体のセキュリティ情報を含むDSS(Document Security Store)ディクショナリ |
オブジェクトのタイプは「2.5オブジェクト」を参照してください。
以下は、カタログ ディクショナリの例です。 HelloWorld.pdfデータのオブジェクト番号7がカタログ ディクショナリです。
7 0 obj << /Type /Catalog /Pages 5 0 R >>
PDF Imager-LP(無償版)でカタログ ディクショナリーを表示するソースコード
C# | C/C++ | Python |
3.2 PageTree(ページツリー)ディクショナリー
PDFのリーダーは、ページ・ツリー ディクショナリーの情報を使って文書内のページをその順番どおりに素早くアクセスできます。カタログ ディクショナリのPages項目から参照されます。
ツリーのリーフノード(枝葉)には、ページツリーノードと呼ばれる中間ノードとページオブジェクトと呼ばれるリーフノードの2種類があります。
ページツリーノードはそのTypeが"Pages"であることで判断できます。
ページツリーノード ディクショナリには以下の項目が含まれます。
キー | タイプ | 値 |
---|---|---|
Type | name | (必須)"Pages"を指定 |
Parent | dictionary | (必須)親オブジェクトへの参照 |
Kids | array | (必須)子ノード オブジェクトへの参照 子ノードは、Page(ページ)または、PageTree(ページツリー)オブジェクトです。 |
Count | integer | (必須)このPage Treeの子孫であるPageオブジェクトの数 |
オブジェクトのタイプは「2.5オブジェクト」を参照してください。
以下は、PageTreeディクショナリの例です。
2 0 obj << /Type /Pages /Kids [ 4 0 R 10 0 R ] /Count 2 >> endobj 4 0 obj << /Type /Page ・・・このページの属性を記述する追加の項目・・・ >> endobj 10 0 obj << /Type /Page ・・・このページの属性を記述する追加の項目・・・ >> endobj
PDF Imager-LP(無償版)でPageTreeディクショナリーを表示するソースコード
C# | C/C++ | Python |
3.3 Page(ページ)オブジェクト
PageTreeで単一ページの属性を指定した部分がPage(ページ)オブジェクトです。
オブジェクトのTypeが"Page"であることで判断します。
Pageディクショナリには以下の項目が含まれます。
キー | タイプ | 値 |
---|---|---|
Type | name | (必須)"Page"を指定 |
Parent | dictionary | (必須)直接の親オブジェクト |
LastModified | date | (PieceInfoがある場合は必須、他は省略可)ページの内容が最後に変更された日時 PieceInfo(ページピースディクショナリ)がある場合には、それに含まれるアプリケーションデータディクショナリのなかでどのディクショナリがページの変更日時に対応しているかを判断するために使用される。 |
Resources | dictionary | (必須)このページで必要とするリソース |
MediaBox | rectangle | (必須)ページが表示または印刷される物理媒体の境界を定義で既定のユーザー空間単位で表現される矩形 |
CropBox | rectangle | (省略可)既定のユーザー空間での表示領域 ページが表示または印刷される際にページ内容はこの矩形で切り取られる。 既定値:MediaBoxの値 |
BleedBox | rectangle | (省略可)デフォルトのユーザー空間単位での長方形 これは実稼働環境で出力する際にページの内容を切り取る領域を定義 既定値:CropBoxの値 |
TrimBox | rectangle | (省略可)トリミング後の完成ページの寸法を定義する既定のユーザー空間単位で表現された長方形 既定値:CropBoxの値 |
ArtBox | rectangle | (省略可)ページ作成者の意図に基づきページ上の意味のあるコンテンツの範囲を定義する既定のユーザー空間単位で表現された長方形 既定値:CropBoxの値 |
BoxColorInfo | dictionary | (省略可)画面上の様々なページ境界のガイドライン表示に使用する色およびその他の視覚特性を指定するボックス色情報ディクショナリ |
Contents | stream / array | (省略可)このページに表示されるべき内容(Content Stream)で、このエントリがない場合、ページは空になる。 Content Streamではグラフィック、画像、テキストなどが定義される。 |
Rotate | integer | (省略可)表示または印刷される際のページの回転角度 回転は時計方向とします。角度は、90の倍数であること。 既定値:0 |
Group | dictionary | (省略可)透明画像モデルで使用するページのページ グループの属性を指定するグループ属性ディクショナリ |
Thumb | stream | (省略可)このページのサムネール画像のStream Object(ストリーム オブジェクト)を指定 |
Annots | array | (省略可)このページに関連するAnnotation(アノテーション)を指定 |
UserUnit | number | (省略可)既定のユーザー空間単位のサイズを1/72インチの倍数で示す正の数値 サポートされる値の範囲は実装依存 既定値:1.0(ユーザー空間単位は1/72インチ) |
B | array | (省略可;ページに記事ビーズが含まれている場合には推奨)ページに表示されるすべての記事Bead(ビーズ)への間接参照を含む配列 ビーズは自然な読み順で配列内に列挙されるものとする。 |
Dur | number | (省略可)ページの表示時間(ページ送りタイミングとも呼ばれまる):プレゼンテーション中にページが表示される最大時間(秒単位) この時間を超えると表示アプリケーションが自動的に次のページに進む。既定:ビューアは自動的にページ送りを行わない。 |
Trans | dictionary | (省略可)プレゼンテーション中にページを表示するときに使用するトランジション効果を記述するトランジション ディクショナリ |
Annots | array | (省略可)ページに関連付けられたすべてのAnnotation(注釈)への間接参照を含むAnnotationディクショナリの配列 |
AA | dictionary | (省略可)ページを開いたときまたは閉じたときに実行されるAction(アクション)を定義するAdditional-Actions(追加アクション)ディクショナリ |
Metadata | stream | (省略可)ページのメタデータを格納するMetadata Stream |
PiceInfo | dictionary | (省略可) |
StructParents | integer | (ページに構造コンテンツ項目(structural content items)が含まれている場合に必須) |
ID | byte string | (省略可)ページの親Webキャプチャ コンテンツ セットのデジタル識別子 |
PZ | number | (省略可)ページの推奨拡大係数:自然な表示拡大を実現するための係数 |
SeparationInfo | dictionary | (省略可)ページの色分解を生成するために必要な情報を含むSeparation(分割)ディクショナリ |
Tabs | name | (省略可)ページ上のAnnotation(注釈)に使用されるタブ順序を指定する名前 指定する場合の値はR(行順序)、C(列順序)、S(構造順序)のいずれか。PDF2.0以降では、A(注釈配列順序)とW(ウィジェット順序)が追加された。 Annotation Array(注釈配列)順序は、ページディクショナリのAnnotsエントリに列挙されているAnnotationの順序を指す。 ウィジェット順序は同じ配列順序を使用するが、2つのパス(最初のパスではウィジェット注釈のみを選択し、2番目のパスでは他のすべての注釈を選択)を使用することを意味する。 |
TemplateInstantiated | name | (このページが名前付きページ オブジェクトから作成された場合に必須)元のページ オブジェクトの名前 |
PresStep | dictionary | (省略可)ページの最初のノードを表すNavigation Nodeディクショナリ |
UserUnit | number | (省略可)既定のユーザー空間単位のサイズを1/72インチの倍数で示す正の数値 サポートされる値の範囲は実装依存 既定値: 1.0 (ユーザー空間単位は1/72インチ) |
VP | array | (省略可)ページの矩形領域を指定するビューポートディクショナリの配列 |
AF | array of dictionary | (省略可)このページに関連付けられたファイルを示す1つ以上のFile Spacification(ファイル仕様)ディクショナリ |
OututIntents | array | (省略可)このページがレンダリングされる出力デバイスの色特性を指定するOutput Intent(出力インテント)ディクショナリの配列 |
DPart | dictionary | (このページが DPartの範囲内にある場合は必須、それ以外の場合は許可されない)このページオブジェクトを含むページ範囲を持つDPart辞書への間接参照 |
オブジェクトのタイプは「2.5オブジェクト」を参照してください。
以下は、Page(ページ)ディクショナリの例です。
3 0 obj
<< /Type /Page
/Parent 4 0 R
/MediaBox [ 0 0 612 792 ]
/Resources << /Font << /F3 7 0 R
/F5 9 0 R
/F7 11 0 R
>>
>>
/Contents 12 0 R
/Annots [ 23 0 R
24 0 R
]
>>
endobj
PDF Imager-LP(無償版)でPageオブジェクトとContentsオブジェクトを表示するソースコード
C# | C/C++ | Python |
3.4 Contentsオブジェクト
ContentsオブジェクトはPage Object(ページ オブジェクト)の要素として定義され、単一のstreamまたは複数のstreamが格納されたArrayオブジェクトです。
ページに表示される、グラフィック、画像、テキストなどの描画コマンドが記載されています。
以下は、テキスト文字列"Hello World"を描画するstreamの例です。
5 0 obj << /Length 73 >> stream BT /F1 24 Tf 100 100 Td ( Hello World ) Tj ET endstream endobj
演算子"Tj"は文字列を描画するコマンドです。しかし、必ずしも文字コード(または文字列)が指定されるとは限りません。
演算子"Tf"はReources要素のFontサブディレクトリで指定したフォントに替えます。
以下は、グラフィックの例です。
5 0 obj << /Length 883 >> stream % 既定の線幅で黒い直線を描画 150 250 m 150 350 l S % 細い点線を描画 4 w % 4ユニットの線幅を指定 [ 4 6 ] 0 d % 点線(4ユニットのダッシュと6ユニットの空白)指定 150 250 m 400 250 l S % パスを描画 [ ] 0 d % 点線を直線(空白無し)に変更 1 w % 線幅を1ユニットに変更 % 矩形(赤枠、ライトブルーでの塗りつぶし)を描画 1.0 0.0 0.0 RG % 赤の線色指定 0.5 0.75 1.0 rg % ライトブルーでの塗りつぶし色指定 200 300 50 75 re % 矩形描画 B % パスの内部を塗りつぶし、パスを描画 % カラーの枠線とグレイで塗りつぶされた曲線を描画 0.5 0.1 0.2 RG 0.7 g 300 300 m 300 400 400 400 400 300 c b % パスを閉じ、パスの内部を塗りつぶし、パスを描画 endstream endobj
PDF Imager-LP(無償版)でページコンテンツを表示するソースコード
C# | C/C++ | Python |
3.5 Articlesノード
一部の種類の文書では論理的には接続されているものの物理的には連続していない内容がばらばらに含まれていることがあります。
そのような物理的には連続していないものの論理的に関連する項目の順序を表現するためにPDF文書では1つ以上のArticle(アーティクル;ニュースなどの記事)を定義することができます。
Articleの順序はThread(スレッド)によって定義されます。
Articleを構成する個々の内容はThread上のBeads(ビーズ)と呼ばれます。
CatalogディクショナリのThreads要素は文書の記事を定義するThread(スレッド)ディクショナリの配列で記載されます。
スレッド内の個々のビーズはBead(ビーズ)ディクショナリによって表されます。スレッド辞書のFエントリは、スレッドの最初のビーズを参照します。
ビーズは、N(次の)エントリとV(前の)エントリを介して二重リンクリストで順番に連結されます。
さらに、記事Beads(ビーズ)が出現する各ページについてPageObject(ページオブジェクト)にはBエントリが含まれます。Bエントリの値は、ページ上のBeads(ビーズ)への間接参照の配列(描画順)です。
3.5.1 Thread
記事スレッド(Article thread)は物理的に連続していないコンテンツ項目を論理的に連結します。
スレッド ディクショナリには以下の項目が含まれます。
キー | タイプ | 値 |
---|---|---|
Type | name | (省略可)"Thread"を指定 |
F | dictionary | (必須)threadの最初のbeadオブジェクトへの参照 |
I | dictionary | (省略可)threadの情報を表すディクショナリ |
Metadata | stream | (省略可;PDF2.0 参照オブジェクト)スレッドのタイトル、作成者、作成日などの情報を含むメタデータ ストリーム(Metadata streams) |
PDFプロセッサは文書の先頭にあるドキュメントカタログ内のThreads配列全体を記事を開く際に読み取る必要があります。
この情報を使用すると任意のスレッド(Thread)の最初のビーズ(Bead)を含むページを特定できます。
スレッドの最初のビーズ以外で開くには目的のビーズに到達するまですべてのビーズを連鎖する必要があります。この処理を高速化するためのヒントはありません。
3.5.2 Bead
アーティクルを構成する個々のコンテンツ項目をスレッド上のBead(ビーズ)といいます。
インタラクティブなPDFプロセッサはユーザーがスレッド上のビーズからビーズへと移動できるようにナビゲーション機能を提供する場合があります。
ビーズ ディクショナリには以下の項目が含まれます。
キー | タイプ | 値 |
---|---|---|
Type | name | (省略可)"Bead"を指定 |
T | dictionary | (threadの最初のbeadの場合に必須;それ以外は省略可)このbeadが所属するthread |
N | dictionary | (必須)次のbeadへの参照 |
V | dictionary | (必須)直前のbeadへの参照 |
P | dictionary | (必須)このbeadが含まれているpageへの参照 |
R | rectangle | (必須)このbeadのpage上の領域(rectangle) |
オブジェクトのタイプは「2.5オブジェクト」を参照してください。
3.5.3 スレッドとビーズの例
22 0 obj <</F 23 0 R /I <</Title (Man Bites Dog)>> >> endobj 23 0 obj << /T 22 0 R /N 24 0 R /V 25 0 R /P 8 0 R /R [158 247 318 905] >> endobj 24 0 obj << /T 22 0 R /N 25 0 R /V 23 0 R /P 8 0 R /R [322 246 486 904] >> endobj 25 0 obj << /T 22 0 R /N 23 0 R /V 24 0 R /P 10 0 R /R [157 254 319 903] >> endobj
3.6 デスティネーション(Destinations)
デスティネーション(Destinations)はPDF文書のハイパーリンクやしおりなどを使ってページのナビゲーションが発生した場合のページの移動先の様々な情報です。
このデスティネーションにはナビゲートされたページの表示方法(文書のビュー)やページを表示する際の動作(アクション(Actions))を指定されます。
デスティネーションが指定する内容は以下のとおりです。
- 表示されるべきページ
- そのページをウインドウのどの位置に表示するか
- 表示する際の倍率(ズーム)
これらの情報は、以下の構文で指定します。
構文 | 意味 |
---|---|
[page /XYZ left top zoom] | zoomに拡大されたコンテンツをウィンドウの左上からの座標(left,top)に表示 |
[page /Fit] | ウインドウにフィットするように表示 |
[page /FitH top] | ウインドウ上端からのtop位置に表示 |
[page /FitV left] | ウインドウ左端からのleft位置に表示 |
[page /FitR left bottom right top] | ウインドウ内の領域(left,bottom,right,top)に表示 |
[page /FitB] | ウインドウのバンディング領域にフィットするように表示 |
[page /FitBH top] | ウインドウ上端からのtop位置でウインドウのバンディング幅にフィットするように表示 |
[page /FitBV left] | ウインドウ左端からのleft位置でウインドウのバンディング高さにフィットするように表示 |
3.7 アクション(Actions)
PDF文書は文書内のリンクを表現できます。
リンクでは到達先の表示方法(到達先(Destinations))や到達先を表示する際のアクション(Actions)を指定できます。
アクションはこのリンクの到達先を表示した際の動作を定義します。
動作は以下のアクション ディクショナリの項目で指定されます。
キー | タイプ | 値 |
---|---|---|
Type | name | (省略可)"Action"を指定 |
S | name | (必須)動作内容 |
Next | dictionary / array | (省略可)現在の動作に続く、次の動作 |
オブジェクトのタイプは「2.5オブジェクト」を参照してください。