Postscript関連のTips

複数のPSファイルを連結

psmergeがうまくいかないので、

gs -q -dNOPAUSE -dBATCH -sDEVICE=pswrite -sOutputFile=出力ファイル名 \
-c save pop -f 元ファイル列

とする。

グレイスケール化

 convert -colorspace GRAY filename.ps filename2.ps
 $ bw_convert color.eps bw.eps

eps2eps

PS(EPS)ファイルを、単純で、標準的な、そしてより速い(サイズの小さい) PostScriptファイルに変換する。フォントをアウトライン化するが、フォント サイズが小さいとラスタ化されるので、下記のように解像度を上げて変換する。

 eps2eps -r6000  入力.eps 出力.eps

Misc

Firefoxの印刷機能で「ファイルに保存」を選んでWebページをhoge.psを出力し、

$ psnup -n 2 hoge.ps fuga.ps
$ grep PaperSizes fuga.ps
%%DocumentPaperSizes: A4
$ ps2pdf fuga.ps
$ pdfinfo fuga.pdf |grep 'Page size'
Page size: 612 x 792 pts (letter)

と強制的にletterにされてしまいます。 これを解決するには

$ ps2pdf -sPAPERSIZE='a4' JDS.ps
とします。-dと-sを間違わないように。

EPS から PNG への変換

α(アルファ)チャンネルを使った透過機能附きの PNG に EPS を変換する場 合には,

$ gs -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE=pngalpha -dEPSCrop -r600 \
   -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sOutputFile=output.png input.eps

Postscript言語

コマンド 概要
newpath 新しいpathを開始
moveto 描画点の移動(絶対座標)| 72 72 moveto
lineto 線を描く(絶対座標)| 72 144 lineto
rlineto 線を描く(相対座標)| 0 72 rlineto
closepath 自動的にpathを閉じる
fill pathの内部に色を塗る
stroke pathの内部はなし
end 不明。eps特有?
showpage 図形描画の終了宣言
setgray グレー階調の指定(0-1の値を指定)| 0.8 setgray
setrgbcolor 色指定(RGB)| 1 0 0.5 setrgbcolor
setcymkcolor 色指定(CMYK)gsだとエラー 0 1 0 0.5 setcymkcolor
rotate 回転 45 rotate (45度回転)
for forループ 0 10 360 {...} for (0から10刻みで360までまわす)
translate 原点の移動(図形を移動させるときに使う) 72 72 translate
() 文字列 (hoge) show
clip 切り取り
findfont フォントの取得
scalefont フォントサイズ指定
setfont フォント指定
def マクロ /hoge {...} bind def
matrix 6個の数字の配列?
currentmatrix CTM, Current Transformation Matrix, をmatrixに与える?
setmatrix CTMをmatrixで置換?
neg 負の値を戻す算術演算子
repeat 繰り返し 5 {...} repeat (5回繰り返す)

EPSの書式

  1. 一行目に %!PS-Adobe-3.0 EPSF-3.0 と書く
  2. BoundingBoxのコメントが必ず必要
  3. 単ページにする( %%Page 0 または 1
  4. 全体に影響するコマンドは書いてはいけない
  5. showpage の使用は避ける

Helveticaのテスト

Rで出力したepsをpdfにすると、Helveticaが文字化け(中黒で表示される)た め、試行錯誤をした。

%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 0 0 200 200
gsave
/Helvetica findfont 12 scalefont setfont
100 100 moveto (Test) show
grestore
%%EOF

このepsファイルを epstopdf でpdfファイルに変換すると下記のように、Helveticaを埋め 込まないpdfができる。

$ pdffonts /tmp/test.pdf
name                                 type         emb sub uni object ID
------------------------------------ ------------ --- --- --- ---------
Helvetica                            Type 1       no  no  no       9  0

これをLinux版Adobe Readerで開くと正しく表示される

カラーepsをグレー階調に

$ convert  -type Grayscale color.eps gray.eps

これでもグレー階調化されたepsを得ることができるが、せっかくのベクター が、ラスター化されてしまう。ファイルサイズも100倍近くになった。

ベクター形式を保ちつつグレー階調化するには、bw_convertというPerlスクリ プトを使う。bw_convertは引数にカラーepsファイル名を必要とし、パイプに 対応していたないため、dev.copy2eps()からは直接利用できない。そこで、 bw_convertのアイデアを拝借して、sedで対応する。

> dev.copy2eps(file="| sed -e 's/\bsetrgbcolor\b/add add 3 div setgray/g' > グレー階調.eps")

これでベクター形式の軽いグレー階調epsファイルを得ることができる。

昔のスライド風

$ sed -e 's/\bsetrgbcolor\b/pop pop pop 0 0 0.6 setrgbcolor/g' \
  -e 's/\b1 setgray\b/0 0 0.6 setrgbcolor/g' \
  -e 's/\b0 setgray\b/1 setgray/g' \
  org.eps > new.eps

変換前 変換後

PostScriptフォント一覧

ページ抽出

$ psselect -p1 form2.ps form2-1.ps

1ページ目だけを抽出

PDFを見開きでeps化

pdftopsだと白紙のpsファイルができたので、pdf2psを使う

$ psnup -m1cm -n 2 hou07-281c.ps output.ps
# $ pstopnm -xmax 100000 -ymax 100000 -xsize 2100 -ysize 2970 output.ps
$ convert -antialias -density 150x150 -rotate 90 output.ps output.jpg
$ convert output.jpg eps3:hou07-281c.eps

pstopnmを使うよりconvertを使った方が小回りがきく。psnupでは上端が切れ たので、-m1cmでマージンを追加した。output.psは11MBだが、jpegで圧縮する ことにより、1.3MBにできた。オリジナルのPDFは243KBだったので、改善の余 地があると考えられるが、画像がしなければ11MBのままになったので、今回は やむを得ない(PDFに含まれる画像が伸張してファイルサイズが増大したため)。 ちなみに、-density 100x100にすると651KBに収まる。

けれども、いずれにしても画像が汚い。Linuxでは限界があるのでMacOSXに持っ ていく。MacOSXからLinuxに持ってくると埋め込まれていないフォント部分が 化ける。仕方がないので、MacOSX上でスクリーンショットをとる (Command+Shift+4+Space)、マウスポインタがカメラの絵になるので、スク リーンショットをとりたいWindowsをクリック。キャプチャ画像はDesktopに保 存される。 


更新:2009年 3月 24日 火曜日 13:32:06 JST  Top