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
>
endobj

% ページツリーオブジェクト
2 0 obj
>
endobj

% ページオブジェクト
3 0 obj
>
  /Contents 4 0 R
>>
endobj

% コンテンツストリームオブジェクト
4 0 obj
>
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
>

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

PDF フォントの仕組みと表示方法

この記事では、PDF フォントの仕組みと JPedal での表示方法について説明します。フォントの埋め込みとは何ですか?PDF ファイルには 2 種類のフォントを含めることができます。埋め込みPDF フォントには、すべてのフォント文字を描画するための実際の詳細がすべて含まれていますが、非埋め込みフォントにはフォントの名前のみが含まれており、システムがそのフォントを利用できる環境にあることを期待しています。フォントを埋め込むと、PDF ファイルが大きくなります。過去の PDF

JavaのコードからPDF Viewerの機能にアクセス

PDF Viewerコンポーネントを統合した後、独自のJavaコードからその機能にアクセスしたいと思うかもしれません。このセクションでは、その方法を説明します。PDF Viewerには、Viewerの機能にアクセスしたり、Viewerから情報を取得したりするための2つのメソッドがあります。ビューアからの情報の取得現在のページ/表示に関する情報を取得するには、以下のメソッドを使用します。Object Viewer.getViewerValue(ViewerValues) - こ

JPedalインスペクタでPDFファイルの内容を検査

コマンドラインまたは他の言語からPDFファイルの内容を表示しますTo start JPedal in inspect mode, pass the --inspect parameter via the command line:機能クロスリファレンスを表示「View」をクリックし、次に「Xref」をクリックします。相互参照ビューアでは、相互参照テーブルと相互参照ストリームに保存されている オブジェクトのリストを表示することができ

Java PDF Viewerでユーザーインターフェイスをカスタマイズ

JPedalビューアは、PDFの閲覧、検索、抽出、変換などの機能を備えたPDFビューアです。全ての機能がユーザーにとって必要であるとは限らないため、Viewerはプロパティファイルを使って、Viewerの外観やどの機能がViewerに含まれるかをコントロールすることができます。独自のプロパティファイルの使用Viewerは、3つの方法でプロパティファイルを読み込むことができます。org.jpedal.Viewer.Prefs "VM引数でプロパティファイルの場所を指定します。

Facebook
Twitter
Email
公式ブログロゴ

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

開発チームに最適なJava画像ライブラリとは?

画像処理は現代のJavaアプリケーションにおいて避けて通れない機能の一つです。Webサービスでのサムネイル生成、ドキュメント管理システムでのファイル変換、データ分析での可視化出力など、様々な場面で画像ライブラリの品質がシステム全体の安定性を左右します。

多くの開発チームが最初に手を伸ばすのは、Java標準のImageIOやオープンソースのライブラリでしょう。確かに導入は簡単で、基本的な画像処理には十分に見えます。しかし、プロダクション環境で実際に運用を始めると、思わぬ落とし穴に遭遇することがあります。

開発チームに最適なJava PDFライブラリとは?

「オープンソースで十分じゃない?」
そう考えるエンジニアは少なくありません。確かに無償のライブラリは機能が豊富で、改変も自由です。しかしバグ修正やセキュリティパッチを自分たちで追い続ける労力、サードパーティのパッケージを呼び出すリスク、そしてライセンス条件の判断に迷う時間などを考えると、コードを書かない”隠れコスト”が静かに膨らんでいきます。

「保守や脆弱性対応に追われて本来の開発が進まない!」

そんな声が聞こえてきたら、商用ライブラリへの切り替えどきかもしれません。

開発チームに最適なPDF-HTML変換ツールとは?

開発チームに最適なPDF-HTML変換ツールとは?PDFからHTMLへの変換において開発者が直面する課題と、それを解決するBuildVuの特長を解説。正確な変換品質、スケーラビリティ、セキュリティ、開発者フレンドリーな出力、そしてシンプルな料金体系で、チーム開発の効率を高める方法をご紹介します。

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

開発者向けPDF入門ガイド

開発者向けPDF入門ガイド

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

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

MENU
PAGE TOP