どんな古いPDFでも、テキストエディタで開けば、表示されるテキストの大部分がストリームオブジェクト内に含まれていることがわかります。ストリームのフォーマットは他のオブジェクトとは少し異なり、ディクショナリーで始まります。このディクショナリーには、ストリームの長さをバイト数で示す/Lengthエントリが必要です。ストリームの長さとは、streamキーワードとendstreamキーワードの間(最後の改行文字を除く)の全てを指します。通常、PDFを開いた時点ではストリーム内のデータは圧縮されています。その圧縮形式は、ストリームの主ディクショナリー内の/Filterキーで確認できます。
例えば:
10 0 obj<>
stream
…圧縮された内容…
endstream
endobj
この内容を解凍すると、一連の命令が現れます。これらの命令は、PDF内の全コンテンツを生成するためのコマンドなのです。以下は解凍後のストリームの内容です:
vBT
/F1 24 Tf
175 720 Td
(Hello World!)Tj
ET
BTはテキストの開始を、ETはテキストの終了を意味します。その間の部分では、フォント、位置、表示するテキストを設定しています。命令はTf、Td、Tjです。これらの命令に必要な値は、命令の前に書かれます。例えば、最初の命令Tfにはフォントの参照(/F1、これについては後で説明します)とフォントサイズ24が必要です。Tdオペレータはテキストの位置を設定します。1番目のパラメータは左からの単位、2番目のパラメータは下からの単位を表します。これらの単位は面白いもので、プリンタやモニタなど実際のデバイスにレンダリングされる時だけ、現実世界の座標に変換される論理的な座標系に関連しています。これにより、異なる出力媒体でもテキストのサイズと位置を一定に保つことができるのです。最後にTj命令があり、カッコ内の文字列がPDFドキュメントに描画されます。
これをPDFドキュメントに追加する前に、/F1参照を解決しなければなりません。ストリーム内では、ストリーム外で使うようなオブジェクト参照(例: 10 0 R)は使えません。/F1をオブジェクトにマッピングし、それを/Resources辞書で利用可能にする必要があります。このリソース辞書は、ストリームオブジェクトを指す/Contentsエントリと関連付けられています:
3 0 obj
<>
endobj
4 0 obj
<>
endobj
5 0 obj
<>
endobj
6 0 obj
<>
endobj
7 0 obj
<>
stream
BT
/F1 24 Tf
…..
ここでは/Pageオブジェクトを使っています。ページの/Contentsエントリは、テキストを描画するストリームオブジェクトを指しています。ストリームは/F1オブジェクトが何を指しているのかを知る必要があります。/Resources辞書は4 0 Rにあり、/Fontエントリのみを含んでいます。これが/F1のマッピング先を指しています。5 0 objを見ると、/F1がHelveticaというデフォルトフォントの一つを表すオブジェクトにマッピングされていることがわかります。一見回りくどく感じるかもしれませんが、実はPDFビューアの速度向上に役立っています。フォントを読み込む代わりに参照を保持しておき、そのフォントが実際に使われない(そのページが表示されない)場合は読み込む必要がないのです。
これらを全て組み合わせることで、Hello_World.pdf ドキュメントを作成する方法が得られます。ここでは構造と内容がより分かりやすく記載しています。
%PDF-2.0
% カタログオブジェクト
1 0 obj
<>
endobj
% ページツリーオブジェクト
2 0 obj
<>
endobj
% ページオブジェクト
3 0 obj
<>
endobj
% リソースオブジェクト
4 0 obj
<>>>
endobj
% フォントオブジェクト
5 0 obj
<>
endobj
% コンテンツストリームオブジェクト
6 0 obj
<>
stream
BT
/F1 24 Tf
175 720 Td
(Hello World!) Tj
ET
endstream
endobj
% クロスリファレンステーブル
xref
0 7
0000000000 65535 f
0000000009 00000 n
0000000056 00000 n
0000000111 00000 n
0000000212 00000 n
0000000250 00000 n
0000000317 00000 n
% トレーラー
trailer
<>
% クロスリファレンステーブルの開始位置
startxref
406
%%EOF
PDFアプリ開発ツール(SDK)をお探しのみなさま、効率のよい開発作業のためにJPedal、BuildVu、JDeliがきっとお役に立つことと思います。
これら3製品は無料で試用していただけますので、まずはお試しのうえ、ぜひ導入をご検討ください。
JPedal、BuildVu、JDeliのシステム開発やプログラミング、無料トライアルの情報は下記の各製品のトライアルページをご覧ください。技術的なことから費用面まで、ご質問・ご相談も各製品ページの問合せボタンからお寄せください。