技術記事

シンプルな PDF ドキュメントを最初から作成する

· PDF構造

メモ帳でシンプルな 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 の生成、修復、分割、結合を実装するときの基礎になります。