PDFってこうなってる? Part 7:色を操るグラフィックスステート
今回は、画面に色を付けてみましょう。その過程で、グラフィックスステート(グラフィックス状態)について説明します。PDFファイルには、グラフィックスステートというデータ構造が関連付けられています。

今回は、画面に色を付けてみましょう。その過程で、グラフィックスステート(グラフィックス状態)について説明します。
グラフィックスステートとは
PDFファイルには、グラフィックスステートというデータ構造が関連付けられています。このデータ構造には、グラフィックスの描画方法を記述する情報が格納されます。
具体的には以下の情報が含まれます:
- 現在の色や使用可能な色などの値
- 現在のクリップ
- 変換行列
- ユーザー空間(PDFの座標系)からデバイス空間(モニター)へのグラフィックスの描画方法
グラフィックスステートの保存と復元
使用可能なグラフィックスステートは1つだけですが、PDFには異なる描画を行う多くのグラフィックスオブジェクトが含まれている可能性があります。そのため、オブジェクトストリームが描画しようとする場合、通常は現在のグラフィックスステートが保存されます。
qコマンド:グラフィックスステートをスタックに保存Qコマンド:以前に保存されたグラフィックスステートをポップバック
カラースペース
グラフィックスステートには、関連付けられたカラースペースもあります。カラースペースは、使用可能な色と、それらが現在のページにどのように描画されるかを基本的に記述します。
デフォルトカラースペース
PDFビューアが知っておくべきデフォルトのカラースペースには以下があります:
- DeviceGray:グレースケールカラー
- DeviceRGB:赤-緑-青
このパートではDeviceRGBを使用します。
ExtGState(外部グラフィックスステート)
カラースペースを選択する方法の1つは、ExtGState(外部グラフィックスステート)ディクショナリを使用することです。これは、リソースディクショナリでフォントにアクセスするのと同じ方法で使用されます。
- ExtGStateを
/GS1のような参照に関連付ける gsコマンドを使用してカラースペースにアクセス
デフォルトのカラースペースについては、そのような手間をかける必要はありません。
色の設定コマンド
基本的な使い方
0.9 0.5 0.0 rg 100 400 300 300 re fこの例では:
rgコマンド:カラースペースをDeviceRGBに設定し、塗りつぶしに使用する色を記述RGコマンド(大文字):ストロークに使用する色を表す- 色の値:赤/緑/青の成分(最大1.0、最小0.0)
reコマンド:四角形を描画fコマンド:塗りつぶし
色の変更例
1 0 0 rg % 赤
0 1 0 rg % 緑
0 0 1 rg % 青
1 1 0 rg % 黄
0.5 0.5 0.5 rg % グレーPDFドキュメント例
%PDF-2.0
1 0 obj
<< /Type /Catalog /Pages 2 0 R >>
endobj
2 0 obj
<< /Type /Pages /Kids [3 0 R] /Count 1 >>
endobj
3 0 obj
<< /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792]
/Contents 4 0 R >>
endobj
4 0 obj
<< /Length 200 >>
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四角形のサイズの変更
reコマンドの構文:
x y width height rex,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製品は無料で試用していただけますので、まずはお試しのうえ、ぜひ導入をご検討ください。

開発者向けPDF入門ガイド
PDFの仕様や活用方法など、開発者に必要な情報をコンパクトにまとめました。初めてPDFを扱う開発者にも分かりやすく、基礎から応用までカバーしているため、PDFのポテンシャルを最大限に引き出し、アプリケーション開発やドキュメント管理の効率化を図るための手引きとなるでしょう。