使用可能なグラフィックスステートは1つだけですが、PDFには全く異なることを行いたい多くのグラフィックスオブジェクトが含まれている可能性があります。そのため、オブジェクトストリームが何かを描画しようとする場合、通常は現在のグラフィックスステートが保存されます。グラフィックスステートは、q コマンドを使用してスタックに保存されます。大文字の Q は、以前に保存されたグラフィックスステートをポップバックします。
グラフィックスステートには、関連付けられたカラースペースもあります。カラースペースは、使用可能な色と、それらが現在のページにどのように描画されるかを基本的に記述します。カラースペースは自分で定義することもできますし、PDFビューアが知っておくべきデフォルトのものもあります。例えば、DeviceGray(グレースケールカラー)、DeviceRGB(赤-緑-青)などがあり、色を様々な方法で表現します。この記事では、DeviceRGBを使用します。カラースペースの詳細については、MarkがPDFファイルの色に関する記事を書いています。
カラースペースを選択する方法の1つは、ExtGState(外部グラフィックスステート)ディクショナリを使用することです。これは、「Hello World PDF」で説明したリソースディクショナリでフォントにアクセスするのと同じ方法で使用されます。ExtGStateを/GS1のような参照に関連付け、gs コマンドを使用してカラースペースにアクセスします。幸いなことに、デフォルトのカラースペースについては、そのような手間をかける必要はありません。次のようなオブジェクトストリームを使用すれば、画面にオレンジ色の四角形が描画されるはずです。
0.9 0.5 0.0 rg 100 400 300 300 re f
rg コマンドは、カラースペースをDeviceRGBに設定し、四角形を塗りつぶすために使用する色の赤/緑/青の成分(最大1.0、最小0.0)を記述します(大文字の RG を使用すると、ストロークに使用する色を表します)。以下のPDFドキュメントは、ページに3つの色付きの四角形を描画します。グラフィックステートが保存され、復元される方法に注目してください。
%PDF-2.0
% カタログオブジェクト
1 0 obj
<<
/Type /Catalog
/Pages 2 0 R
>>
endobj
% ページツリーオブジェクト
2 0 obj
<<
/Type /Pages
/Kids [3 0 R]
/Count 1
/MediaBox [0 0 500 800]
>>
endobj
% ページオブジェクト
3 0 obj
<<
/Type /Page
/Parent 2 0 R
/Resources <<>>
/Contents 4 0 R
>>
endobj
% コンテンツストリームオブジェクト
4 0 obj
<<
/Length 105
>>
stream
0.9 0.5 0.0 rg % 色の設定 (RGB)
100 400 300 300 re f % 四角形を描画して塗りつぶし
q % グラフィックステートを保存
0.1 0.9 0.5 rg % 別の色の設定
100 200 200 200 re f % 別の四角形を描画して塗りつぶし
Q % グラフィックステートを復元
350 200 50 50 re f % 別の四角形を描画して塗りつぶし
endstream
endobj
% クロスリファレンステーブル
xref
0 5
0000000000 65535 f
0000000010 00000 n
0000000069 00000 n
0000000161 00000 n
0000000250 00000 n
% トレーラー
trailer
<<
/Size 5
/Root 1 0 R
>>
% クロスリファレンステーブルの開始位置
startxref
837
%%EOF
色の変更
PDFでは、rgまたはRGコマンドを使用して色を設定します。rgは塗りつぶしの色、RGはストロークの色を設定します。これらのコマンドの後に、0から1の範囲で赤、緑、青の値を指定します。例えば、以下のように色を変更できます。
1 0 0 rg % 赤
0 1 0 rg % 緑
0 0 1 rg % 青
1 1 0 rg % 黄
0.5 0.5 0.5 rg % グレー
これらの色設定コマンドを、四角形を描画するコマンドの前に配置します。例えば、赤い四角形を描画するには、以下のようにします。
1 0 0 rg % 赤を設定
100 400 300 300 re f % 四角形を描画
四角形のサイズの変更
reコマンドは、四角形を描画するために使用されます。このコマンドの構文は以下の通りです。
x y width height re
x と y は四角形の左下隅の座標、width
と height
は四角形の幅と高さをそれぞれ指定します。これらの値を変更することで、四角形のサイズと位置を調整できます。例えば、以下のようにサイズを変更できます。
100 400 150 150 re f % 150x150の四角形を描画
200 600 400 100 re f % 400x100の四角形を描画
最後に
PDFの内部構造の複雑さと、その開発プロセスの難解さについて、一連の解説記事を読んで理解を深めることができましたか?
PDFは一見シンプルなドキュメントフォーマットに見えますが、その内部は複数のオブジェクトが入り組んだ階層構造となっており、それぞれのオブジェクトが文書の要素を表現しています。カタログ、ページツリー、ページ、リソース、コンテンツストリームなど、様々なオブジェクトが連携することで一つのPDF文書が形作られているのです。
また、PDFを一から開発するには、これらのオブジェクトの構造や関連性を深く理解した上で、適切な順序で記述していく必要があります。文書の構造を定義するためのオブジェクトの記述から始まり、ページ上の描画内容を記述するコンテンツストリームの生成、そしてクロスリファレンステーブルやトレーラーによる文書のまとめ上げまで、各要素を順を追って正確に定義しなければ機能するPDFファイルは生成できません。
さらに、テキストや図形の描画においても、フォントの指定や色の設定、グラフィックスステートの保存と復元など、やはり多様で複雑な手順が必要とされます。これらの構造や手順の全貌を理解し、実装するのは容易なことではありません。
このように、PDFの内部構造は複雑怪奇であり、ゼロからPDFを開発するのは極めて難解なプロセスを伴います。そこで実際の開発では、JPedalのようなPDF処理ライブラリを利用することが強く推奨されます。これらのライブラリは内部構造の隅々まで理解した専門家によって開発されており、私たちはその恩恵を享受できるのです。
PDFアプリ開発ツール(SDK)をお探しのみなさま、効率のよい開発作業のためにJPedal、BuildVu、JDeliがきっとお役に立つことと思います。
これら3製品は無料で試用していただけますので、まずはお試しのうえ、ぜひ導入をご検討ください。
JPedal、BuildVu、JDeliのシステム開発やプログラミング、無料トライアルの情報は下記の各製品のトライアルページをご覧ください。技術的なことから費用面まで、ご質問・ご相談も各製品ページの問合せボタンからお寄せください。