前回に引き続き、GhostScript/PostScriptを使って図形を描く。今回は計算結果の表示と、作成したファイルのPNG・PDFへの変換方法を解説する。GhostScript/PostScriptの扱いは今回でひと区切りとなる。
計算結果をページに表示する
GhostScript/PostScriptはプログラム言語のため、加減乗除などの演算が可能だ。加減乗除はいずれも2つの値が必要で、命令は以下のように対応する。
- 加算: add(一般的な数式では +)
- 減算: sub(一般的な数式では -)
- 乗算: mul(一般的な数式では ×)
- 除算: div(一般的な数式では ÷)
- 剰余: mod(一般的な数式では mod または %)
加算の例を示す。addが加算だが、計算結果をページ上に表示するには文字列に変換する必要がある。「100 string cvs」がその処理で、stringで文字列を確保し、cvsで変換する。100は最大文字数で、小さすぎると期待する数値範囲にならないかエラーの原因となる。確保した100文字分はスタックに積まれないため、大きな数値を指定してもスタックオーバーフローは発生しない。
12+34を計算するプログラムは以下の通り。
%!PS/Times-Roman findfont 24 selectfont12 34 add 100 string cvs 100 300 moveto showshowpage
減算はsub、乗算はmulを使う。除算はdivを使うが、整数同士でも自動的に浮動小数値に変換されて計算される。整数同士の除算結果は整数に、浮動小数値同士は浮動小数値に、というルールはGhostScript/PostScriptにはない。剰余はmodを使う。
逆ポーランド記法で計算する
PostScript言語は逆ポーランド記法のため、一般的なプログラム言語にあるようなカッコで計算の優先順位を指定することはない。言語の内部処理はシンプルだが、一般的な計算式に慣れた人間には少し考えさせられる。ただし、逆ポーランド記法は日本語と相性がよく、計算する手順をそのまま書けば良いというメリットがある。
例えば(12+34)*2を逆ポーランド記法にするには、「12と34を足して2を掛ける」という順番をそのまま命令に置き換える。
12 34 add 2 mul
1行で書かず、複数行に分けて書いても問題ない。実際のプログラムは以下の通り。
%!PS/Times-Roman findfont 24 selectfont12 34 add 2 mul 100 string cvs 100 300 moveto showshowpage
(12+34)*2-10のような複雑な計算式も、逆ポーランド記法ならシンプルに記述できる。
%!PS/Times-Roman findfont 24 selectfont12 34 add 2 mul 10 sub 100 string cvs 100 300 moveto showshowpage
PNG画像やPDFに変換する
作成した図をPNGやPDFに変換する方法を紹介する。PNG形式への変換はすでに説明済みだが、以下のコマンドでsample.psファイルがレンダリングされ、72dpiの解像度でresult.pngファイルが作成される。
gs -sDEVICE=png16m -r72 -o result.png sample.ps
印刷用途にはより高い解像度を指定する。以下の例では300dpiでレンダリングし、result2.pngとして保存する。
gs -sDEVICE=png16m -r300 -o result2.png sample.ps
JPEG形式にする場合は以下のように指定する。
gs -sDEVICE=jpeg -r72 -o result3.jpg sample.ps
GhostScript/PostScriptはPDFの元になっているため、PDFへの変換も可能だ。PDFに変換するには以下のコマンドを入力する。より綺麗に印刷したい場合は、PNGやJPEG形式ではなくPDFにすると良い。
gs -sDEVICE=pdfwrite -o result4.pdf sample.ps
古いmacOS(Sonomaより前)ではpstopdfコマンドがあり、これを使ってPostScriptからPDFに変換できる。変換するPostScriptファイルを指定すると、自動的に「ファイル名.pdf」が生成される。
pstopdf sample.ps
GhostScriptをインストールすると、以下のPDF変換コマンドも自動的に追加される。通常はps2pdfコマンドで十分だ。
- ps2pdf
- ps2pdf12(PDF1.2ベース)
- ps2pdf13(PDF1.3ベース)
- ps2pdf14(PDF1.4ベース)
使い方はps2pdfコマンドの後に変換元のファイル名、その後に半角空白で区切って出力するPDFファイル名を指定する。
ps2pdf sample.ps sample1.pdf
GhostScript/PostScriptはテキストベースで応用範囲が広いが、今となっては時代遅れの面もある。特にベクトルベースであればSVGの方が簡単で、同じテキストベースでありながらプログラミング言語ではないため学習も容易だ。
最後に、おまけとしてカラーを変化させながらテキストを円形に描くコードを紹介する。文字やサイズ、角度などを変えて試してみてほしい。文字の代わりに線を描画すればカラーホイールも描ける。
ps2pdf cwt.ps result5.pdf
cwt.psの内容は以下の通り。
%!PS/Times-Roman findfont 24 selectfont/rot 90 def %開始回転角度/hue 0 def %開始輝度/count 36 def %繰り返し回数/step 1 count div def %色の間隔/rstep 10 def %回転の間隔/bright 1 def %輝度/sat 1 def %彩度300 400 translatecount {gsaverot rotatehue sat bright sethsbcolor0 0 moveto (GhostScript Sample) show/rot rot rstep add def/hue hue step add defgrestore} repeatshowpage


