PDF 構文 ディクショナリー
PDF構文 (PDF Syntax ISO 32000-2)
ここでは32000-2規格に基づいたPDF1.7の構文(構造)について説明しています。
PDFファイルは8-bitデータを単位として構成されていて一般の文書編集アプリケーションで開くことができその内容を読取ることができます。ただし、バイナリのデータもそのまま(表示可能な文字に変換されずに)格納されていますので文字化けしているように表示されますが、これはPDFの仕様です。
ここではそのデータの一部を読み解くことでPDF文書へのデータ追加などPDF再構成の意味を説明し、PDF-ToolsでのPDFデータ解析や編集をより詳細にできるようにします。
11.各種ディクショナリー (Dictionary)
PDFでは数多くのディクショナリが定義されています。
各ディクショナリは右図のようにPDFを構成する要素でもあります。
ここでは、以下のディクショナリを説明します。
- 11.1 ストリーム オブジェクト
- 11.2 文書情報(Document Information)ディクショナリー
- 11.3 カタログ(Catalog) ディクショナリ
- 11.4 ページ・ツリー(PageTree) ディクショナリー
- 11.5 ページ(Page) ディクショナリー
- 11.6 Thread ディクショナリー
- 11.7 Bead ディクショナリー
11.1 ストリーム オブジェクト (Stream Object)
dictionaryタイプのインダイレクト・オブジェクトにはストリーム(Stream)を付加できます。このストリームが付加されたオブジェクトをストリーム オブジェクトといいます。
ストリームには大きなサイズのバイトデータ(画像データや描画用のデータ)を格納できます。多くの場合このバイトデータは圧縮されています。
ストリームはディクショナリ オブジェクトでなければならずそのディクショナリ オブジェクトはLength項目を含まなければなりません。この項目はストリームのバイトサイズ(データが圧縮されている場合は圧縮されたデータのバイト数)を表します。
以下はストリーム オブジェクトの例です。
3 0 obj << /Filter /FlateDecode /Length 72 >> stream ... 72バイトのデータ... endstream endobj
このオブジェクトは72バイトのストリーム データを含みそのデータはFlateDecodeで圧縮されていることがDictionaryに示されています。
ストリーム(Strem) オブジェクト ディレクトリの項目
以下の項目が追加されます。
キー | タイプ | 値 |
---|---|---|
Length | integer | (必須)ストリーム(Stream)に記載されたデータのバイト数 |
Filter | name / array | (オプション)ストリーム データが圧縮された場合のフィルター名 複数フィルターの場合はarrayで記載 |
DecodeParms | dictionary / array | (オプション)フィルターのパラメータを指定 |
オブジェクトのタイプは「2.5オブジェクト」を参照してください。
11.2 文書情報(Document Information)ディクショナリー
文書情報(Document Information)ディクショナリーはトレイラーのInfo項目にその参照先が記されています。
このディクショナリーはPDF文書のメタデータのひとつで以下の情報が含まれます。
キー | タイプ | 値 |
---|---|---|
Title | text string | 文書のタイトル |
Author | text string | 文書を作成した人の名前 |
Subject | text string | 文書のサブジェクト |
Keyword | text string | 文書に関するキーワード |
Creator | text string | PDF以外の形式から変換した場合に、そのオリジナルの作成ツール |
Producer | text string | PDF以外の形式から変換した場合に、その変換ツール |
CreateDate | 日付 | 文書が生成された日時(人が読める形式) |
ModDate | 日付 | 文書が更新された最終の日時 |
Trapped | name | 文書がトラッピング情報を含むように変更されたかどうかを示す 名前オブジェクト |
オブジェクトのタイプは「2.5オブジェクト」を参照してください。
文書情報ディクショナリの例を以下に記します。
1 0 obj << /Title (PDF Easy Parse Reference) /Author (Trust Software System) /Creator (PDF Easy Parse) /Producer (Trust Software System, PDF Easy Parse) /CreationDate (D:20241221010203+09'00') /ModDate (D:20241221040506+09'00') >> endobj
PDF Imager-LP(無償版)で「文書情報」を表示するソースコード
C# | C/C++ | Python |
11.3 カタログ(Catalog) ディクショナリ
カタログ(Catalog)ディクショナリはPDF文書のオブジェクト階層のルート(最上位)です。カタログ ディクショナリはトレイラーのRoot項目に記載されます。
カタログ(Catrog)ディクショナリには以下の項目が記載されます。
キー | タイプ | 値 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Type | name | (必須)"Catalog"を指定 | ||||||||||||
Version | name | (オプション)PDFファイルのヘッダー(Header)に記載されたバージョンより古い場合は無視されます。PDF文書が更新され更新前のバージョンより新しくなった場合はここで指定されます。 | ||||||||||||
Pages | dictionary | (必須)ページ・ツリー(Page Tree) | ||||||||||||
PageLayout | name | (オプション)文書を表示したときのレイアウトを指定
以下の値で指定します。
| ||||||||||||
PageMode | name | (オプション)文書を表示した時の全体構成を指定
以下の値で指定します。
| ||||||||||||
Outlines | dictionary | (オプション)アウトライン(Outlines)のルートへの参照を指定 アウトラインは、文書の概要を階層で示した情報です。 | ||||||||||||
Threads | array | (オプション)Articlesノード オブジェクトへの参照 | ||||||||||||
OpenAction | array / dictionary | (オプション)文書を開くときの動作を指定します。 arrayの場合はDestinationsを表し、dictionaryの場合はActionsを表します。 | ||||||||||||
AcroForm | dictionary | (オプション)Interactive Form Dictionary(入力フォーム)を指定 | ||||||||||||
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 |
11.4 ページ・ツリー(PageTree) ディクショナリー
ページ・ツリー(PageTree)はPDFのリーダーがその文書を順番どおりにアクセスするための情報です。カタログ ディクショナリのPages項目から参照されます。
ページ・ツリー ディクショナリには以下の項目が含まれます。
キー | タイプ | 値 |
---|---|---|
Type | name | (必須)"Pages"を指定 |
Parent | dictionary | (必須)親オブジェクトへの参照 |
Kids | array | (必須)子ノード オブジェクトへの参照 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 |
11.5 Page ディクショナリー
ページ ツリーの枝葉に当たる部分がページ(Page) オブジェクトです。それぞれのページオブジェクトはPDF文書内の単一ページの属性を指定します。
ページ ディクショナリには以下の項目が含まれます。
キー | タイプ | 値 |
---|---|---|
Type | name | (必須)"Page"を指定 |
Parent | dictionary | (必須)直接の親オブジェクト |
MediaBox | 四角形 | (必須)表示または印刷される際のページのサイズ |
Contents | stream / array | (オプション)ページの内容 もし、この要素がない場合ページは空です。 |
Rotate | integer | (オプション)表示または印刷される際のページの回転角度 回転は時計方向とします。角度は、90の倍数でなければなりません。既定値は、0です。 |
Thumb | stream | (オプション)このページのサムネール画像のストリーム オブジェクトを指定 |
Annots | array | (オプション)このページに関連するアノテーションを指定 |
オブジェクトのタイプは「2.5オブジェクト」を参照してください。
以下はページ(Page) オブジェクトの例です。
4 0 obj << /Type /Page /Parent 4 0 R /MediaBox [ 0 0 612 792 ] /Contents 5 0 R /Resources << /ProcSet 6 0 R /Font << /F1 7 0 R >> >> >> endobj
以下はコンテンツ(Contents) オブジェクトの例です。
5 0 obj << /Length 73 >> stream BT /F1 24 Tf 100 100 Td (Hello World) Tj ET endstream endobj
PDF Imager-LP(無償版)でPageオブジェクトとContentsオブジェクトを表示するソースコード
C# | C/C++ | Python |
11.6 Thread ディクショナリー
Thread ディクショナリーは一般的な記事(ニュース)のように物理的には順番が無いけれども論理的にはそれらに関連があるような項目をまとめるためのディクショナリです。Threadsは記事を表しその記事に関連した参照をBeadチェーンで順に表します。
Threadディクショナリーはカタログ ディクショナリのThreads項目から参照されます。
Thread ディクショナリーには以下の項目が含まれます。
キー | タイプ | 値 |
---|---|---|
Type | name | (オプション)"Thread"を指定 |
F | dictionary | (必須)threadの最初のbeadオブジェクトへの参照 |
I | dictionary | (オプション)threadの情報を表すディクショナリ |
オブジェクトのタイプは「2.5オブジェクト」を参照してください
11.7 Bead ディクショナリー
Bead ディクショナリーはThread ディクショナリーから参照されThread(記事)に関連した参照を順に表すものです。
キー | タイプ | 値 |
---|---|---|
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オブジェクト」を参照してください