PDFってこうなってる? Part 1:PDFの内部構造を理解する第一歩
PDFの仕組みを実践的に学ぶシリーズの第1回。PDFファイルの内部構造、オブジェクトの役割、8種類のデータ型について解説します。最終的にはテキストエディタでPDFを自作することを目指します。

この一連の記事は、PDFの仕組みを実践的に学ぶための学習シリーズです。PDFを作成するための基本的な要素から説明を始め、最終的にはテキストエディタとバイナリエディタを使って、簡単な「Hello World.pdf」ファイルを自作できるようになることを目指しています。普段なにげなく使っているPDFですが、その中身を知ることで、PDF関連の開発や技術選定において確かな判断ができるようになります。
PDFの基本的な仕組み
PDFファイルは、人間が読むための文書そのものではなく、コード(命令)の集まりです。Adobe AcrobatやJPedalのようなPDFビューアーは、このコードを解釈して文書として画面に表示するインタプリタとして機能しています。
つまり、ユーザーが画面上で目にするきれいなレイアウトのドキュメントは、実際には複雑なデータ構造から動的に生成されたものです。この仕組みは、HTMLとブラウザの関係に似ています。HTMLのソースコードをブラウザが解釈してウェブページを描画するように、PDFのコードをビューアーが解釈して文書を表示しているのです。
この「コードとインタプリタ」という構造を理解することが、PDFの内部構造を学ぶうえでの最も重要な出発点です。
PDFオブジェクトの構造
PDFファイルの中身は、ツリー構造で整理された多数の「オブジェクト」から成り立っています。それぞれのオブジェクトが文書の特定の要素(ページ、フォント、画像など)を担当しており、オブジェクト同士が参照関係でつながっています。
以下は、PDFオブジェクトの典型的なフォーマットです。
41 0 obj
<< /Type /Pages /Kids [34 0 R 43 0 R 52 0 R] /Count 3 >>
endobjこの例に含まれる各要素を分解して見ていきましょう。
41 0 obj- オブジェクト番号41を宣言しています。PDFファイル内のすべてのオブジェクトには一意の番号が割り当てられます0- リビジョン番号(世代番号)です。オブジェクトが更新されるたびにインクリメントされますが、通常は0のままです<<>>- この記号で囲まれた部分は「ディクショナリー」型のデータであることを示します/Type /Pages- このオブジェクトがページ管理の役割を持つことを示しています/Kids- 子ページへの参照を格納する配列です/Count- 管理しているページの総数を示します[34 0 R 43 0 R 52 0 R]- 他のオブジェクト(34番、43番、52番)への参照の配列ですendobj- オブジェクトの終了を示すキーワードです
このように、1つのオブジェクトの中に型情報、属性、他オブジェクトへの参照がまとめて記述されているのがPDFの特徴です。
参照オブジェクトの仕組み
PDFのオブジェクト同士は「間接参照」によってつながっています。34 0 R という記述は「オブジェクト番号34、リビジョン番号0への参照(Reference)」を意味します。
この参照の仕組みにより、PDFファイルはツリー構造を形成できます。たとえば、ルートオブジェクトがページツリーを参照し、ページツリーが個々のページオブジェクトを参照し、各ページオブジェクトがフォントや画像のリソースを参照する、といった階層構造です。
ビューアーはルートオブジェクトから参照をたどることで、文書全体の構造を把握し、ユーザーに視覚的な形で表示します。
8種類のデータ型
PDFファイルで使われるデータ型は、次の8種類に限定されています。この8種類の組み合わせだけで、テキスト、画像、フォント、レイアウトなどあらゆる要素が表現されています。
| データ型 | 説明 | 例 |
|---|---|---|
| 文字列(String) | テキストデータを表します。丸括弧 () またはアングルブラケット <> で囲みます | (Hello World) |
| 数値(Numeric) | 整数と実数の両方を含みます | 42, 3.14 |
| ブーリアン値(Boolean) | 真偽値を表します | true, false |
| 名前オブジェクト(Name) | スラッシュ / で始まる識別子で、PDFリーダーに特定の情報を伝えます | /Type, /Pages |
| 配列(Array) | 角括弧 [] で囲まれた、順序付きのオブジェクトの集まりです | [1 0 R 2 0 R] |
| ディクショナリー(Dictionary) | <<>> で囲まれた、キーと値のペアで構成される辞書形式のデータです | << /Type /Page >> |
| ストリーム(Stream) | ページ上に表示されるコンテンツの描画コマンドや、画像データなどのバイナリデータを格納します | stream ... endstream |
| NULL | 値が存在しないことを示す特殊な型です | null |
この中でも特に重要なのは「ディクショナリー」と「ストリーム」です。ディクショナリーはオブジェクトの属性情報を格納する中心的なデータ構造であり、ストリームは実際のページ描画命令やフォント、画像のバイナリデータを保持します。
PDFファイルの全体構成
PDFファイルは、大きく4つのセクションで構成されています。
- ヘッダー - PDFのバージョン情報(例:
%PDF-1.7) - ボディ - オブジェクトの集合体。文書の実体がここに格納されます
- クロスリファレンステーブル(xref) - 各オブジェクトのファイル内の位置(バイトオフセット)を記録したテーブル。ビューアーが目的のオブジェクトに素早くアクセスするために使います
- トレーラー - ルートオブジェクトの位置やxrefテーブルの開始位置など、ファイルの読み取り開始に必要な情報を格納します
ビューアーはファイルの末尾(トレーラー)から読み取りを開始し、xrefテーブルを参照してルートオブジェクトを見つけ、そこからツリーをたどって文書全体を描画します。この「末尾から読む」というPDF特有の仕組みは、インクリメンタルな更新を可能にするための設計です。
次のステップ
Part 1 では、PDFの基本的な仕組み、オブジェクトの構造、データ型、ファイル全体の構成について学びました。Part 2:PDFファイルの内部構造を理解するでは、これらの知識をもとにヘッダー、ボディ、クロスリファレンステーブル、トレーラーの各セクションをさらに詳しく解説します。
PDFアプリ開発ツール(SDK)をお探しのみなさま、効率のよい開発作業のためにJPedal、BuildVu、JDeliがきっとお役に立つことと思います。これら3製品は無料で試用していただけますので、まずはお試しのうえ、ぜひ導入をご検討ください。

開発者向けPDF入門ガイド
PDFの仕様や活用方法など、開発者に必要な情報をコンパクトにまとめました。初めてPDFを扱う開発者にも分かりやすく、基礎から応用までカバーしているため、PDFのポテンシャルを最大限に引き出し、アプリケーション開発やドキュメント管理の効率化を図るための手引きとなるでしょう。