#! /usr/bin/perl # # xv-ps-tombow.pl -- xv で出力した PostScript ファイルにトンボを入れる # (pnmtops にも対応) # # 0.0: Jul. 22, 1999 by Dai ISHIJIMA # 0.1: ???. ??, 2000 (Y2K patch :-) # # # 使い方 # 1. xv で画像ファイルを開き、そのファイルを PostScript 形式で保存する # - normal size にチェックを入れないと (たぶん) 解像度が落ちる # - ファイル形式は PostScript / grayscale を選択するとよい # 元の画像が二値画像なら B/W dithered がよい # - 用紙は A4 を選択し、寸法やレイアウトを確認する # - 画像が横長の場合は、あらかじめ回転して縦長にしておく # 2. 保存した PostScript ファイルをこのフィルタに通す # 3. 確認のため、プレビューしてみる # 4. フィルタに通したファイルを印刷する # # 例 # % xv foo.gif # % perl xv-ps-tombow.pl -f 60 < foo.ps > foo+t.ps # % gs -sPAPERSIZE=a4 foo+t.ps # % lpr -Pps foo+t.ps # # 例2 # % giftopnm foo.gif | ppmtopgm | GIFをPGMに変換 # pnmtops -rle -dpi 300 -scale 0.25 -center | PGMをPSに変換 # perl fix-ps-dpi.pl -240 | サイズ調整 # perl xv-ps-tombow.pl -f 60 > /tmp/a.ps トンボを入れる # % gs -sPAPERSIZE=a4 /tmp/a.ps 確認 # % lpr -Pps /tmp/a.ps 印刷 # # # 書式 # perl xv-ps-tombow.pl [オプション] [< 入力ファイル] [> 出力ファイル] # # オプション # -x 倍率 ハーフトーン周波数を # プリンタデフォルトの <倍率> 倍に設定する # -f 周波数 ハーフトーン周波数を <周波数> に設定する # # Apple LaserWriter16/600PS2 では 106 lpi がデフォルト。 # LaserPress 2100PS2 では 90 lpi。 # LBP-B406PS では 30 lpi。 # # 印刷できれいに仕上るのは、30〜90 ぐらい。60ぐらいが適当かも # - (もちろん印刷屋に依存するんだけど :-) # $halftone = "ABSOLUTE"; #$halftone = "RELATIVE"; $freq = 60; #$freq = 1.0; if ($ARGV[0] eq '-x') { $halftone = "RELATIVE"; if ($ARGV[1] =~ /[.0-9][.0-9]*/) { $freq = $ARGV[1]; } else { $freq = 1.0; } } elsif ($ARGV[0] eq '-f') { $halftone = "ABSOLUTE"; if ($ARGV[1] =~ /[.0-9][.0-9]*/) { $freq = $ARGV[1]; } else { print STDERR "halftone frequency required\n"; exit 1; } } while () { if (/^%%Page:/) { print ; print <<'EOF'; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % アミ点の細かさ %/Halftone 1.0 def % Halftone = 1 : プリンタのデフォルトを使う %/Halftone 1.5 def % Halftone > 1 : デフォルトより細かくする %/Halftone 0.75 def % Halftone < 1 : デフォルトより荒くする % アミ点を細かくする or 荒くする %currentscreen 3 2 roll Halftone mul 3 -2 roll setscreen %currentscreen 3 2 roll pop 60 3 -2 roll setscreen %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% EOF if ($halftone eq "ABSOLUTE") { print "currentscreen 3 2 roll "; print "pop $freq "; print "3 -2 roll setscreen\n"; } else { print "currentscreen 3 2 roll "; print "$freq mul "; print "3 -2 roll setscreen\n"; } print <<'EOF'; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% EOF } elsif (/^showpage/) { print "%%%% showpage\n"; } elsif (/^%%Trailer/) { print <<'EOF'; %%%% %%Trailer %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % xv で出力したPostScriptファイルにトンボを入れる % % revision history: % 0.0: Dec. 3, 1997 by Dai ISHIJIMA % % 使い方: % xv で PostScriptファイルを出力 % PostScriptファイルをエディタで開いて、showpage をコメントアウト % ファイル末尾にこのファイルを付け加える % % 補足: % ghostview などでトンボが表示されない場合は、 % ファイル先頭部の BoundingBox をコメントアウトする % % うーん、パッチ化した方が便利かなぁ % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /mm { 72 mul 25.4 div } bind def /inch { 72 mul } bind def % % 用紙サイズの指定 % /PaperWidth 210 mm def /PaperHeight 297 mm def /PageWidth 182 mm def /PageHeight 260 mm def /TextWidth 150 mm def /TextHeight 220 mm def /TombowOfs 3 mm def /TombowLen 15 mm def % % 用紙隅のトンボ % /CornerTombow { newpath 0 0 moveto TombowLen 0 rlineto stroke newpath 0 0 moveto 0 TombowLen rlineto stroke newpath 0 TombowOfs neg moveto TombowLen 0 rlineto stroke newpath TombowOfs neg 0 moveto 0 TombowLen rlineto stroke } bind def % % 解像度の取得 -> 線幅決定 % /Resolution 300 def systemdict /currentpagedevice known { currentpagedevice /HWResolution get 0 get /Resolution exch def } if 72 Resolution div setlinewidth % % % % 原点を用紙の真中に PaperWidth 2 div PaperHeight 2 div translate % 中心線 newpath 0 PageHeight 2 div TombowOfs add moveto 0 TombowLen rlineto stroke newpath 0 PageHeight 2 div TombowOfs add neg moveto 0 TombowLen neg rlineto stroke newpath PageWidth 2 div TombowOfs add 0 moveto TombowLen 0 rlineto stroke newpath PageWidth 2 div TombowOfs add neg 0 moveto TombowLen neg 0 rlineto stroke % 四隅のトンボ gsave PageWidth 2 div TombowOfs add PageHeight 2 div TombowOfs add translate CornerTombow grestore gsave PageWidth 2 div TombowOfs add PageHeight 2 div TombowOfs add neg translate 1 -1 scale CornerTombow grestore gsave PageWidth 2 div TombowOfs add neg PageHeight 2 div TombowOfs add translate -1 1 scale CornerTombow grestore gsave PageWidth 2 div TombowOfs add neg PageHeight 2 div TombowOfs add neg translate -1 -1 scale CornerTombow grestore EOF # print "gsave\n"; print "/Helvetica findfont TombowOfs scalefont setfont\n"; print "0.7 setgray\n"; ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); print "PageWidth 4 div "; print " PageHeight 2 div TombowOfs 2 mul add moveto\n"; printf "(%04d/%02d/%02d %02d:%02d:%02d) show\n", $year + 1900, $mon + 1, $mday, $hour, $min, $sec; print "180 rotate\n"; print "PageWidth 4 div "; print " PageHeight 2 div TombowOfs 2 mul add moveto\n"; printf "(%04d/%02d/%02d %02d:%02d:%02d) show\n", $year + 1900, $mon + 1, $mday, $hour, $min, $sec; printf "grestore\n"; print <<'EOF'; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% showpage %%Trailer EOF } else { print; } }