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文書のオブジェクト階層のルート(最上位)です。
カタログ ディクショナリはトレイラーのRoot要素に記載されます。
多くの場合、カタログ ディクショナリへのリファレンスとしてRoot要素に記載されています。
ドキュメント カタログには以下が含まれます。
- 文書内容 (docoment contents)
- しおり (アウトライン、outlines)
- 記事スレッド (article threads)
- 名前の付いた到達先 (named destinations)
- 他の属性 (other attributes)
- PDF文書を表示する際の情報
3.1 カタログ(Catalog) ディクショナリの項目
カタログ(Catrog)ディクショナリには以下の項目が記載されます。
キー | タイプ | 値 |
---|---|---|
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)または、ページツリー(Page Tree)オブジェクトです。 |
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)オブジェクト
ページ ツリーで単一ページの属性を指定した部分がページ(Page) オブジェクトです。
オブジェクトのTypeが"Page"であることで判断します。
ページ ディクショナリには以下の項目が含まれます。
キー | タイプ | 値 |
---|---|---|
Type | name | (必須)"Page"を指定 |
Parent | dictionary | (必須)直接の親オブジェクト |
LastModified | date | (PieceInfoがある場合は必須、他はオプション)ページの内容が最後に変更された日時 PieceInfo(ページピースディクショナリ)がある場合には、それに含まれるアプリケーションデータディクショナリのなかでどのディクショナリがページの変更日時に対応しているかを判断するために使用される。 |
Resources | dictionary | (必須)このページで必要とするリソース |
MediaBox | 四角形 | (必須)表示または印刷される際のページのサイズ |
CropBox | (オプション) | |
BleedBox | (オプション) | |
TrimBox | (オプション) | |
ArtBox | (オプション) | |
BoxColorInfo | (オプション)画面上の様々なページ境界のガイドライン表示に使用する色およびその他の視覚特性を指定するボックス色情報ディクショナリ | |
Contents | stream / array | (オプション)このページに表示されるべき内容(Content Stream) Content Streamではグラフィック、画像、テキストなどが定義 |
Rotate | integer | (オプション)表示または印刷される際のページの回転角度 回転は時計方向とします。角度は、90の倍数でなければなりません。既定値は、0です。 |
(オプション) | ||
Thumb | stream | (オプション)このページのサムネール画像のストリーム オブジェクトを指定 |
Annots | array | (オプション)このページに関連するアノテーションを指定 |
UserUnit | number | (オプション)ページ解像度を指定倍します。既定値は1.0で1単位は1/72インチです。 |
オブジェクトのタイプは「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オブジェクトはページ オブジェクトの要素として定義され、単一の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ノード
一般的な記事(ニュース)のように、物理的には順番が無いけれども論理的にはそれらに関連があるような項目をまとめるためのディクショナリです。Articlesノードは、カタログ ディクショナリのThreads項目から参照されます。
記事(Article)をスレッド(Thread)で表しその記事に関連した参照をビーズ(Bead)を使ったチェーンで順番に表します。
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オブジェクト」を参照してください。