« 2006年02月17日 | メイン | 2006年02月19日 »

2006年02月18日

線の太さについてのPDFの仕様

昨日までは、PDFを作成する際の解像度設定、特に線の太さ、について検討してきました。これをまとめてみます。

PDFの仕様 (PDF Reference)では、線の太さはLine Widthというパラメータで指定することになっています。

Line Width に設定する値は0以上の数値です。このときの座標の単位はPDFを書くプログラムが自由に設定できます。なお、Line Width 0はデバイスで表示できる最小の幅という特別な意味があり、表示するときは常に1ドットの幅となります。

※PDF Reference Ver. 1.6 p.185 Line Widthを参照

1.PDFを作成する際のLine Width値の設定
(1) WindowsのGDIを経由する場合は、線の幅はGDIで設定するデバイス(ディスプレイ、プリンタ)の解像度から計算されるドット幅の倍数になります。WindowsのGDIもPDFと同様に幅が0の線は1ピクセル幅になります。従って、PDFでLine Widthが0になることはないはずです。

(2)直接PDFの命令を出力する、あるいは、PostScriptを経由する場合は、論理的な寸法を指定できます。この時、次のような場合に、PDFで線のLine Widthが0に設定されることが起こり得ます。
a. 幅をもたない線を引くことができるアプリケーションが、意図的にPDFにLine Widthを0に設定したとき。
b. 外部から入力された線の幅が、PDFを作成するアプリケーションが扱える最小の論理幅より小さいため丸めた結果0になってしまう事態などが起きる、など。これらの場合には、意図しない結果としてPDFの中の線のLine Widthが0になります。

2.PDFを表示・印刷する際のLine Widthの取り扱い
(1) PDFの中の線にLine Widthに0が設定されている場合は、デバイスで表示できる最小の幅、すなわち1ドット幅の線になります。この線は、例えばAdobe ReaderでPDFを表示してズーミングしていっても太さは変わらず、常にディスプレイ上では1ドット幅になります。解像度の小さいプリンタでは太い線になり、解像度の大きいプリンタでは極細い線になります。

このように線幅0の線の太さはデバイス依存となりますのであまり良くないとされています。

(2) 次に、PDFに0以外のLine Width が設定されている場合、PDFに設定されているLine Width は表示、印刷されるときどのように処理されるかを調べてみます。

PDFを作成したツールと表示・印刷するツールは別のものになることが多いと思います。そうなりますと、PDF作成時の解像度と、PDFを表示・印刷する時の解像度は異なることが多いでしょうし、完全に一致したとしても線の位置がデバイスのドットの並びと一致しないこともあるでしょう。

次の図に、このような例を幾つか挙げてみました。

図1 Line Widthはドットの幅の整数倍で位置がずれている例 (左)
LineWidth-Dot-1.PNG

図2 Line Widthがドットの幅よりも狭い例
LineWidth-Dot-2.PNG

スキャン・コンバージョン
図のような論理的な太さ(幅)を持つ線を、表示・印刷デバイスはドット単位の塗り潰しに変換します。この処理をスキャン・コンバージョン(Scan Conversion)と言います。スキャン・コンバージョンのアルゴリズムは、PDFの仕様の一部として定義されているのではなく、各製品あるいはデバイス毎に最適な実装をすることになっています。
※PDF Reference Ver. 1.6 6.5 Scan Conversion Details (pp. 478~482)を参照

PDF ReferenceにはAcrobat製品のスキャン・コンバージョンについて記述されています。これはPostScript製品にも共通です。以下の説明は、PDFの仕様ではなく、Acrobatの実装のついての説明となります。

スキャン・コンバージョンの方法は、線、イメージ図形、フォントでは異なります。今回のような線の場合は、まず、PDFの中の論理的な座標系を、デバイスのドット単位の座標形にマップします。次に、論理的な座標系における線と少しでも重なるところがあるドットを塗り潰すという方法をとっています。こうすると、スキャン・コンバージョンの結果、線が消えてしまうことがなくなります。

つまり、上の図で示したような線は、デバイスの上では次のようなドット幅の倍数の太さの線になります。

図3 Line Widthはドットの幅の整数倍で位置がずれている例 (左)
LineWidth-Dot-1-Scan.PNG

図4 Line Widthがドットの幅よりも狭い例
LineWidth-Dot-2-Scan.PNG

この方法では、図3のように、PDFでは同じ太さの線が、画面やプリンタに出力すると太さが変わってしまうことがあります。特に、解像度が低いデバイスに出力する時は、線の太さのばらつきが目立ってしまう可能性があります。そこで、PDF 1.2以降で、自動ストローク調整機能を用意しています。これがONの時は、線の太さを可能な限り均一になるように調整します。
※Acrobat6.0は、自動ストローク調整機能がPDFの中でON/OFFのどちらに設定されていても、常にONとして処理します。(PDF Reference V1.6 実装ノート 70 (p.1018))

投票をお願いいたします

投稿者 koba : 08:00 | コメント (0) | トラックバック