PDF 構文 ディクショナリー

PDF構文 (PDF Syntax ISO 32000-2)

PDF1.7は、ISO技術委員会によって2008年1月に“ISO 32000-1規格”として承認されました。2017年7月にはPDF2.0の規格ISO3200-2が承認され、2020年12月にはそれが第二稿に更新されました。
ここでは32000-2規格に基づいたPDF1.7の構文(構造)について説明しています。
PDFファイルは8-bitデータを単位として構成されていて一般の文書編集アプリケーションで開くことができその内容を読取ることができます。ただし、バイナリのデータもそのまま(表示可能な文字に変換されずに)格納されていますので文字化けしているように表示されますが、これはPDFの仕様です。
ここではそのデータの一部を読み解くことでPDF文書へのデータ追加などPDF再構成の意味を説明し、PDF-ToolsでのPDFデータ解析や編集をより詳細にできるようにします。

11.各種ディクショナリー (Dictionary)

PDF構造

PDFでは数多くのディクショナリが定義されています。
各ディクショナリは右図のようにPDFを構成する要素でもあります。

ここでは、以下のディクショナリを説明します。

11.1 ストリーム オブジェクト (Stream Object)

dictionaryタイプのインダイレクト・オブジェクトにはストリーム(Stream)を付加できます。このストリームが付加されたオブジェクトをストリーム オブジェクトといいます。
ストリームには大きなサイズのバイトデータ(画像データや描画用のデータ)を格納できます。多くの場合このバイトデータは圧縮されています。
ストリームはディクショナリ オブジェクトでなければならずそのディクショナリ オブジェクトはLength項目を含まなければなりません。この項目はストリームのバイトサイズ(データが圧縮されている場合は圧縮されたデータのバイト数)を表します。
以下はストリーム オブジェクトの例です。

3 0 obj
<< /Filter /FlateDecode /Length 72 >>
stream
... 72バイトのデータ...
endstream
endobj

このオブジェクトは72バイトのストリーム データを含みそのデータはFlateDecodeで圧縮されていることがDictionaryに示されています。

ストリーム(Strem) オブジェクト ディレクトリの項目
以下の項目が追加されます。

キータイプ
Lengthinteger(必須)ストリーム(Stream)に記載されたデータのバイト数
Filtername /
array
(オプション)ストリーム データが圧縮された場合のフィルター名
複数フィルターの場合はarrayで記載
DecodeParmsdictionary /
array
(オプション)フィルターのパラメータを指定

オブジェクトのタイプは「2.5オブジェクト」を参照してください。

11.2 文書情報(Document Information)ディクショナリー

文書情報(Document Information)ディクショナリーはトレイラーのInfo項目にその参照先が記されています。
このディクショナリーはPDF文書のメタデータのひとつで以下の情報が含まれます。

キータイプ
Titletext string文書のタイトル
Authortext string文書を作成した人の名前
Subjecttext string文書のサブジェクト
Keywordtext string文書に関するキーワード
Creator text stringPDF以外の形式から変換した場合に、そのオリジナルの作成ツール
Producertext stringPDF以外の形式から変換した場合に、その変換ツール
CreateDate日付文書が生成された日時(人が読める形式)
ModDate日付文書が更新された最終の日時
Trappedname文書がトラッピング情報を含むように変更されたかどうかを示す
名前オブジェクト

オブジェクトのタイプは「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)ディクショナリには以下の項目が記載されます。

キータイプ
Typename(必須)"Catalog"を指定
Versionname(オプション)PDFファイルのヘッダー(Header)に記載されたバージョンより古い場合は無視されます。PDF文書が更新され更新前のバージョンより新しくなった場合はここで指定されます。
Pagesdictionary(必須)ページ・ツリー(Page Tree)
PageLayoutname(オプション)文書を表示したときのレイアウトを指定
以下の値で指定します。
SinglePage1ページを表示
OneColumn1っのカラムでページを表示
TwoColumnLeft2っのカラムでページを表示、奇数ページが左カラム
TwoColumnRight2っのカラムでページを表示、奇数ページが右カラム
TwoPageLeft2ページを同時に表示、奇数ページが左側
TwoPageRight2ページを同時に表示、奇数ページが右側
既定値はSinglePageです。
PageModename(オプション)文書を表示した時の全体構成を指定
以下の値で指定します。
UseNoneしおり、サムネール画像を非表示
UseOutlinesしおりを表示
UseThumbsサムネール画像を表示
FullScreenフルスクリーン・モード表示
UseOCオプショナル コントロール パネル表示
UseAttachementsアタッチメント パネル表示
既定値はUseNoneです。
Outlinesdictionary(オプション)アウトライン(Outlines)のルートへの参照を指定
アウトラインは、文書の概要を階層で示した情報です。
Threadsarray(オプション)Articlesノード オブジェクトへの参照
OpenActionarray /
dictionary
(オプション)文書を開くときの動作を指定します。
arrayの場合はDestinationsを表し、dictionaryの場合はActionsを表します。
AcroFormdictionary(オプション)Interactive Form Dictionary(入力フォーム)を指定
Metadatastreams(オプション)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項目から参照されます。

ページ・ツリー ディクショナリには以下の項目が含まれます。

キータイプ
Typename(必須)"Pages"を指定
Parentdictionary(必須)親オブジェクトへの参照
Kidsarray(必須)子ノード オブジェクトへの参照
Arrayの要素はページ(Page)またはページ・ツリー(Page Tree)オブジェクトです。
各要素はインダイレクト・オブジェクトです。
Countinteger(必須)この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文書内の単一ページの属性を指定します。

ページ ディクショナリには以下の項目が含まれます。

キータイプ
Typename(必須)"Page"を指定
Parentdictionary(必須)直接の親オブジェクト
MediaBox四角形(必須)表示または印刷される際のページのサイズ
Contentsstream /
array
(オプション)ページの内容
もし、この要素がない場合ページは空です。
Rotateinteger(オプション)表示または印刷される際のページの回転角度
回転は時計方向とします。角度は、90の倍数でなければなりません。既定値は、0です。
Thumbstream(オプション)このページのサムネール画像のストリーム オブジェクトを指定
Annotsarray(オプション)このページに関連するアノテーションを指定

オブジェクトのタイプは「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 ディクショナリーには以下の項目が含まれます。

キータイプ
Typename(オプション)"Thread"を指定
Fdictionary(必須)threadの最初のbeadオブジェクトへの参照
Idictionary(オプション)threadの情報を表すディクショナリ

オブジェクトのタイプは「2.5オブジェクト」を参照してください

11.7 Bead ディクショナリー

Bead ディクショナリーはThread ディクショナリーから参照されThread(記事)に関連した参照を順に表すものです。

キータイプ
Typename(オプション)"Bead"を指定
Tdictionary(threadの最初のbeadの場合に必須;それ以外はオプション)このbeadが所属するthread
Ndictionary(必須)次のbeadへの参照
Vdictionary(必須)直前のbeadへの参照
Pdictionary(必須)このbeadが含まれているpageへの参照
Rrectangle(必須)このbeadのpage上の領域(rectangle)

オブジェクトのタイプは「2.5オブジェクト」を参照してください

ご質問 ・ お問い合わせ

 メールで support@TrustSS.co.jp 宛てに、または 質問のページからお送りいただくようお願いします。
ご要望も受け付けております。


PDF Toolsライト

PDF 構文解説

(ISO32000-2より)

PDF Tools製品概要