PDF 構文 ドキュメント カタログ
PDF構文 (PDF Syntax ISO 32000-2)
ここでは32000-2規格に基づいたPDF1.7の構文(構造)について説明しています。
PDFファイルは8-bitデータを単位として構成されていて一般の文書編集アプリケーションで開くことができその内容を読取ることができます。ただし、バイナリのデータもそのまま(表示可能な文字に変換されずに)格納されていますので文字化けしているように表示されますが、これはPDFの仕様です。
ここではそのデータの一部を読み解くことでPDF文書へのデータ追加などPDF再構成の意味を説明し、PDF-ToolsでのPDFデータ解析や編集をより詳細にできるようにします。
3.ドキュメント カタログ (Document Catalog)
カタログ(Catalog)ディクショナリは、PDF文書のオブジェクト階層のルート(最上位)です。
カタログ ディクショナリはトレイラーのRoot要素に記載されます。
多くの場合、カタログ ディクショナリへのリファレンスとしてRoot要素に記載されています。
ドキュメント カタログには以下が含まれます。
- 文書内容 (docoment contents)
- しおり (アウトライン、outlines)
- 記事スレッド (article threads)
- 名前の付いた到達先 (named destinations)
- 他の属性 (other attributes)
- PDF文書を表示する際の情報
右上の図は、PDFの構造をそのルートであるカタログ ディクショナリから示したものです。(PDF構造の拡大画像)
3.1 カタログ(Catalog) ディクショナリの項目
カタログ(Catrog)ディクショナリには以下の項目が記載されます。
キー | タイプ | 値 |
---|---|---|
Type | name | (必須)"Catalog"を指定 |
Version | name | (オプション)PDFファイルのヘッダー(Header)に記載されたバージョンより古い場合は、無視されます。PDF文書が更新され更新前のバージョンより新しくなった場合は、ここで指定されます。 |
Pages | dictionary | (必須)ページツリー(Page Tree) |
PageLayout | name | (オプション)文書を表示したときのレイアウトを指定
以下の値で指定します。
1ページを表示
1っのカラムでページを表示
2っのカラムでページを表示、奇数ページが左カラム
2っのカラムでページを表示、奇数ページが右カラム
2ページを同時に表示、奇数ページが左側
2ページを同時に表示、奇数ページが右側
|
PageMode | name | (オプション)文書を表示した時の全体構成を指定
以下の値で指定します。
しおり、サムネール画像を非表示
しおりを表示
サムネール画像を表示
フルスクリーン・モード表示
オプショナル コントロール パネル表示
アタッチメント パネル表示
|
Outlines | dictionary | (オプション)アウトライン(Outlines)のルートへの参照を指定 アウトラインは、文書の概要を階層で示した情報です。 |
Threads | array | (オプション)Articlesノード オブジェクトへの参照 |
OpenAction | array / dictionary | (オプション)文書を開くときの動作を指定します。 arrayの場合はDestinationsを表し、dictionaryの場合はActionsを表します。 |
AcroForm | dictionary | (オプション)Interactive Formディクショナリ(入力フォーム)を指定 |
Metadata | streams | (オプション)Metadata Streamsを表すインダイレクトオブジェクトへの参照 |
オブジェクトのタイプは「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 | (必須)直接の親オブジェクト |
Resources | dictionary | (必須)このページで必要とするリソース |
MediaBox | 四角形 | (必須)表示または印刷される際のページのサイズ |
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
>>
/ProcSet [ /PDF ]
>>
/Contents 12 0 R
/Thumb 14 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項目から参照されます。
記事をThreadで表しその記事に関連した参照をBeadを使ったチェーンで順番に表します。
3.5.1 Thread
Threadディクショナリには以下の項目が含まれます。
キー | タイプ | 値 |
---|---|---|
Type | name | (オプション)"Thread"を指定 |
F | dictionary | (必須)threadの最初のbeadオブジェクトへの参照 |
I | dictionary | (オプション)threadの情報を表すディクショナリ |
3.5.2 Bead
Beadディクショナリには以下の項目が含まれます。
キー | タイプ | 値 |
---|---|---|
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.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オブジェクト」を参照してください。