PDFってこうなってる? Part 6:パスで図形を描画する仕組み
PDFの描画コマンドを使って図形を描く方法を解説します。直線・曲線・長方形を描くパスオブジェクトの仕組みと、テキストエディタでPDFを自作する具体的な手順を紹介します。

Part 4:白紙のPDFページを自作するで示したように、PDFはストリームオブジェクト内にある一連のコマンドを使って描画されます。PDFビューアーは、これらのコマンドを順番に読み取り、ページ上に表示される全コンテンツを描画します。Part 6となるこの記事では、グラフィックコマンドの中でも基本となる「パス」に焦点を当て、ページ上に直線・曲線・長方形を描画するPDFをテキストエディタで実際に作成します。
パスオブジェクトとは
パスオブジェクトは、PDF内で図形を描くための基本的な仕組みです。「点のリスト」という概念で理解するとわかりやすいでしょう。
パスには必ず始点(開始座標)があり、そこから新しい座標がリストに順次追加されていきます。パスの各セグメント(区間)は、直線、曲線、または長方形の形態を取ることができます。重要なのは、複数のセグメントであっても「単一のパス」として扱われる点です。パスに対して適用されるペインティング操作(ストロークや塗りつぶし)は、すべてのセグメントに対して一括で実行されます。
この仕組みにより、複雑な形状を1つのパスとして効率よく表現できます。たとえば、複数の直線と曲線を組み合わせた図形でも、1回のペインティング操作で描画が完了します。
座標系について
PDFの座標系は、一般的なプログラミングの画面座標とは異なります。PDFでは、ページの**左下が原点(0, 0)**で、右方向がX軸の正、上方向がY軸の正です。たとえば、レターサイズ(612 x 792ポイント)のページでは、左上の座標は (0, 792) となります。
この座標系を理解しておくことが、以降のコマンドを正しく読み解くために不可欠です。
グラフィックコマンドの詳細
直線の描画
最も基本的なパス描画の例を見てみましょう。
175 720 m 175 50 l h Sこのコマンドラインには、4つの操作が含まれています。
| コマンド | 動作 |
|---|---|
| m(moveto) | 指定座標 (175, 720) でパスを開始します。ペンを紙に触れずに移動させるイメージです |
| l(lineto) | 前の点 (175, 720) から新しい座標 (175, 50) への直線セグメントを描画します |
| h(closepath) | パスを閉じ、現在の点から始点へ直線を引いて接続します |
| S(stroke) | パスに沿ってストローク(線)を描画します |
この例では、座標 (175, 720) から (175, 50) まで垂直な直線が描かれます。h で始点に戻るため、結果としてページ上に1本の縦線が表示されます。
曲線の追加
次に、直線と曲線を組み合わせた例です。
175 720 m 175 700 l 300 800 400 720 v h Sここで新たに登場するのが v コマンド(ベジェ曲線)です。v コマンドは3次ベジェ曲線を描きますが、最初の制御点は現在の座標と同じになります。
300 800- 2番目の制御点で、曲線の形状(膨らみ具合)を決定します400 720- 終点の座標です
ベジェ曲線は、制御点の位置を変えることで直線から急カーブまでさまざまな形状の曲線を表現できます。PDFでは c(curveto)コマンドもあり、こちらは2つの制御点を独立して指定できるため、より自由度の高い曲線が描けます。
長方形の描画
さらに長方形を追加した例です。
175 720 m 175 700 l 300 800 400 600 v 100 650 50 75 re h Sre(rectangle)コマンドは、4つのパラメータを取ります。
100- 長方形の左下X座標650- 長方形の左下Y座標50- 幅75- 高さ
つまり、座標 (100, 650) を左下の角として、幅50ポイント、高さ75ポイントの長方形を描画します。この長方形は前の直線や曲線と物理的に接続されていませんが、同じパスの一部として扱われます。最後の S コマンドが実行されると、直線・曲線・長方形のすべてに対してストロークが描画されます。
ペインティング操作の種類
パスの描画方法は S(ストローク)だけではありません。PDFには以下のペインティング操作が用意されています。
| コマンド | 動作 |
|---|---|
| S | パスに沿ってストローク(線)を描画 |
| f | パスの内側を塗りつぶし(非ゼロワインディング規則) |
| f* | パスの内側を塗りつぶし(偶奇規則) |
| B | ストロークと塗りつぶしの両方を実行 |
| n | パスを描画せずに終了(クリッピングパスの定義に使用) |
ストロークは線の輪郭だけを描き、塗りつぶしは囲まれた領域を色で満たします。これらを組み合わせることで、枠線付きの色付き図形なども表現できます。
完成したPDFコード
以下のコードをテキストエディタに貼り付け、draw-line.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 100 >>
stream
175 720 m % 移動
175 500 l % 直線
300 800 400 600 v % 曲線
100 650 50 75 re % 四角形
h % 最後の点を最初の点に接続
S % ストローク
endstream
endobj
xref
0 5
0000000000 65535 f
0000000010 00000 n
0000000059 00000 n
0000000140 00000 n
0000000202 00000 n
trailer
<< /Size 5 /Root 1 0 R >>
startxref
598
%%EOFこのPDFファイルの構造を簡単に確認しましょう。オブジェクト1がカタログ(ルート)、オブジェクト2がページツリー、オブジェクト3がページ定義、オブジェクト4がコンテンツストリーム(描画命令)です。ストリーム内の命令で、直線、ベジェ曲線、長方形を1つのパスとして描画しています。
上記コードを保存し、PDFビューアーで開くと、複数の線分と1つの長方形が表示されます。コマンドの座標値を変更して再保存すれば、図形の形や位置が変わることを確認できます。
次のステップ
Part 7:色を操るグラフィックスステートでは、パスを塗りつぶすさまざまな方法と、描画の色や線幅を制御する「グラフィックスステート(グラフィックス状態)」について探索します。
PDFアプリ開発ツール(SDK)をお探しのみなさま、効率のよい開発作業のためにJPedal、BuildVu、JDeliがきっとお役に立つことと思います。これら3製品は無料で試用していただけますので、まずはお試しのうえ、ぜひ導入をご検討ください。

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