メモ帳でシンプルな PDF を作成する
PDF は専用ライブラリだけで作るものと思われがちですが、最小構成のファイルならテキスト エディターで構造を記述し、補助ツールで相互参照情報を整えることで作成できます。この作業は、PDF の内部構造を理解するうえで非常に有効です。
PDF を構成する三つの層
- ドキュメント構造: カタログ、ページツリー、ページ オブジェクトを定義します。
- ページ内容: テキストや図形を描くコンテンツ ストリームです。
- ファイル構造: オブジェクトの位置を示す相互参照表とトレーラーです。
基本的なオブジェクト
最小 PDF では、カタログ、Pages ノード、Page オブジェクト、フォント リソース、コンテンツ ストリームを用意します。各オブジェクトは番号で識別され、他のオブジェクトから間接参照されます。
構成要素 1
最小 PDF を構成するオブジェクトとページ内容の例です。
|
1 2 3 4 5 6 |
<< /Type /Page /MediaBox [0 0 612 792] /Resources 3 0 R /Parent 1 0 R /Contents [4 0 R] >> |
構成要素 2
最小 PDF を構成するオブジェクトとページ内容の例です。
|
1 2 |
/F0 36.0 Tf (Hello, World!) Tj |
構成要素 3
最小 PDF を構成するオブジェクトとページ内容の例です。
|
1 |
%PDF-1.4 |
構成要素 4
最小 PDF を構成するオブジェクトとページ内容の例です。
|
1 |
%PDF-1.0 |
ヘッダー、相互参照、トレーラー
PDF ビューアはファイル末尾付近の startxref から相互参照表を見つけ、必要なオブジェクトへ移動します。手作業で PDF を組み立てる場合、この位置情報を正確に保つことが重要です。
ファイル構造 1
ヘッダー、相互参照、トレーラーを含む PDF ファイル構造の例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
%PDF-1.0 1 0 obj << /Type /Pages /Count 1 /Kids [2 0 R] >> endobj 2 0 obj << /Type /Page /MediaBox [0 0 612 792] /Resources 3 0 R /Parent 1 0 R /Contents [4 0 R] >> endobj 3 0 obj << /Font << /F0 << /Type /Font /BaseFont /Times-Italic /Subtype /Type1 >> >> >> endobj 4 0 obj << >> stream 1. 0. 0. 1. 50. 700. cm BT /F0 36. Tf (Hello, World!) Tj ET endstream endobj 5 0 obj << /Type /Catalog /Pages 1 0 R >> endobj xref 0 6 trailer << /Size 6 /Root 5 0 R >> startxref 0 %%EOF |
ファイル構造 2
ヘッダー、相互参照、トレーラーを含む PDF ファイル構造の例です。
|
1 |
pdftk hello-broken.pdf output hello.pdf |
ファイル構造 3
ヘッダー、相互参照、トレーラーを含む PDF ファイル構造の例です。
|
1 |
pdftk existing-file.pdf output uncompressed-file.pdf uncompress |
pdftk を使う理由
手で書いた PDF 片を検証したり、相互参照を再構築したりするには、PDF Toolkit のような補助ツールが便利です。ツールに頼る部分と、内部構造として理解すべき部分を分けて学ぶと、PDF ライブラリを使うときのトラブルシューティングにも役立ちます。
まとめ
最小 PDF を自分で組み立てると、ページツリー、リソース、コンテンツ ストリーム、相互参照表の役割が明確になります。この理解は、PDF の生成、修復、分割、結合を実装するときの基礎になります。