fbpx

PDFってこうなってる? 実践でPDFの内部構造を学ぼう Part 7:色を操るグラフィックスステート

今回は、画面に色を付けてみましょう。その過程で、グラフィックスステート(グラフィックス状態)について説明します。PDFファイルには、グラフィックスステートというデータ構造が関連付けられています。このデータ構造には、グラフィックスの描画方法を記述する情報が格納されます。現在の色や使用可能な色などの値がグラフィックスステートに保存されます。また、現在のクリップ、変換行列、線に対して行える面白い操作、ユーザー空間(PDFの座標系)からデバイス空間(モニター)へのグラフィックスの描画方法を変更するその他の命令など、様々な要素が含まれます。
Part 7:色を操るグラフィックスステート

使用可能なグラフィックスステートは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 は四角形の左下隅の座標、widthheight は四角形の幅と高さをそれぞれ指定します。これらの値を変更することで、四角形のサイズと位置を調整できます。例えば、以下のようにサイズを変更できます。

				
					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のシステム開発やプログラミング、無料トライアルの情報は下記の各製品のトライアルページをご覧ください。技術的なことから費用面まで、ご質問・ご相談も各製品ページの問合せボタンからお寄せください。

    Facebook
    Twitter
    Email
    公式ブログロゴ

    製品に関する記事や開発者のブログ

    PDF用語集

    この記事ではPDF関連の一般的な用語を網羅し、それぞれの定義を解説します。

    PDFメタデータとは?開発者が知っておくべき基礎知識

    PDFファイルを扱う際、「メタデータ」という言葉を耳にすることが多いでしょう。メタデータとは、ドキュメントに関する情報を指し、ファイルの作成者や作成日、使用されたソフトウェアなど、ドキュメントを説明する情報が含まれています。この記事では、開発者向けにPDFメタデータの基本からその利用方法までをわかりやすく解説します。

    PDFを最適化して軽量化!使われないオブジェクト削除で得られる驚きの効果

    Javaでシステム開発を行う中で、PDFファイルのサイズが予想以上に大きくなり困った経験はありませんか?その原因の一つに「使われないオブジェクト」の存在があります。今回は、Javaの開発者でJPedalのプロダクトマネージャーのJacob氏の記事を元に、使われないオブジェクトとは何か、その削除方法、削除によるファイルサイズの削減効果、そしてその他のメリットについて解説します。

    PDFファイルを扱うシステム開発・ウェブ開発に役立つ

    開発者向けPDF入門ガイド

    開発者向けPDF入門ガイド

    PDFの基礎から応用まで開発者のための入門ガイド2024年版

    PDF の仕様や活用方法など、開発者に必要な情報がコンパクトにまとめました。初めてPDFを扱う開発者にも分かりやすく、基礎から応用までカバーしているため、PDF のポテンシャルを最大限に引き出し、アプリケーション開発やドキュメント管理の効率化を図るための手引きとなるでしょう。技術的な側面に興味がある開発者だけでなく、ビジネスでPDFを有効活用したい方にもおすすめの一冊です。

    MENU
    PAGE TOP