« ^ »

PDFをもう少しだけ掘り下げる

所要時間: 約 2分

PDFの理解を深めるため、PDFをもう少しだけ掘り下げようと思う。簡単なPDFをorg-tangleで生成できる事が今回のゴールだ。

PDFの構造

ヘッダ

ファイルの先頭にはPDFのバージョンを指定する。最新は2.0のようだった。

%PDF-2.0

ボディ

1 0 obj
<<
  /Type /Catalog
  /Pages 2 0 R
>>
endobj
2 0 obj
<<
  /Type /Pages
  /Kids [4 0 R]
  /Count 1
>>
endobj

フォントを設定する。フォントは埋め込む事もできるが、この場合は、埋め込まれている訳ではないため、指定したフォントが、PDFを表示するシステムにインストールされている必要がある。

3 0 obj
<<
  /Font <<
    /F0 <<
      /Type /Font
      /BaseFont /Arial
      /Subtype /Type1
    >>
  >>
>>
endobj

ページを設定する。 /Parent には、親となるページツリーの要素番号を指定する。 /Contents には、そのページに表示するコンテンツの要素番号を指定する。

4 0 obj
<<
  /Type /Page
  /Parent 2 0 R
  /Resources 3 0 R
  /MediaBox [0 0 595 842]
  /Contents 5 0 R
>>
endobj

ページに表示するためのコンテンツを設定する。ここでは「Hello, world!」という文字を表示している。要素番号を定義している行の直後に << >> という所がある。これは後に続くストリームの長さを指定する。ここでは計算が面倒なので省略する。

5 0 obj
<< >>
stream
1. 0. 0. 1. 50. 720. cm
BT
/F0 36 Tf
(Hello, world!) Tj
ET
endstream
endobj

クロスリファレンステーブル

本来はクロスリファレンステーブルを挿入するべきだけれど、位置を計算する事が面倒だったので省略する。

xref

トレイラー

trailer
<<
  /Size 6
  /Root 1 0 R
>>
startxref
0
%%EOF

org-tangleでの出力とできあがったPDF

これは直接PDFとは関係ない。この文書はOrg-modeで記述している。org-babel-tangleを使うと、この記述をファイルに書き出す事ができる。

M-x org-babel-tangle

これで出力されたPDFはここから取得できる。

./main.pdf