ghostscriptという名前で呼ばれるのが普通だが、タイプするときに長い名前は面倒なためか、実行ファイル名は gs となっている。
gs -h と入力すると、サポートされているデバイス名の一覧などが表示されるので、自分の使用したいデバイス名が表示されているのを確認しよう。 パッケージによっては、極端にサポートデバイスを削ってコンパイルされているものがある。 もし、自分の望むデバイスが表示されなかった場合は、再コンパイルか、標準配布に含まれていない新しいドライバがあるかどうかの情報収集が必要になる。 プリンタの利用からリンクしている「ghostscriptでサポートされているデバイス一覧」のページは英語だが、最新情報もよくフォローしているので要チェックだ。
私が持っているインクジェットプリンタのHP DeskJet 880Cはデバイス名 cdj550 でモノクロ、カラー印刷ともに可能だった。 基本的な設定方法はFreeBSD Handbook(プリンタ編)に譲るが、簡単に設定方法を以下に示す。
# # Simple entry for HP Desktop 880C with gs # dj|deskjet880c|lp|local line printer:\ :sd=/var/spool/output/dj:\ :mx#0:\ :ct#0:\ :sh:\ :lp=/dev/lpt0:\ :lf=/var/log/lpd-errs:\ :if=/usr/local/libexec/hpif:\ :vf=/usr/local/libexec/hpvf: # Banner pages are now suppressed by default. Remove the :sh: # capability to turn them back on. # #lp|local line printer:\ # :sh:\ # :lp=/dev/lpt0:sd=/var/spool/output/lpd:lf=/var/log/lpd-errs: #上記設定ファイルのうちプリンタ名が書いてある行以外は、行の先頭がTABで始まっている必要があるらしい(未確認)。 ブラウザからカット&ペーストしたり、/usr/bin/eeを使うとタブがスペースに変換されてしまうので注意が必要だ。
各種アプリケーションからデフォルトのプリンタとして使われるプリンタ名は「lp」なので、DeskJetを意味する「dj」「deskjet880c」という名前に加えて「lp」という名前でも定義している。 かわりに、標準で定義されている「lp」「local line printer」をコメントアウトする。 lprは同じ名前のエントリの存在、または、違う名前のエントリが同じスプールディレクトリを使用すること)を許さないので、標準状態で書き込まれているlpを放置しておくとエラーになる。 英単語2文字で表現される機能の意味は以下の通り。
#!/bin/sh
#
# ifhp - Print Ghostscript-simulated PostScript on a DeskJet 500
# Installed in /usr/local/libexec/hpif
#
# Treat LF as CR+LF:
#
printf "\033&k2G" || exit 2
#
# Read first two characters of the file
#
read first_line
first_two_chars=`expr "$first_line" : '\(..\)'`
if [ "$first_two_chars" = "%!" ]; then
#
# It is PostScript; use Ghostscript to scan-convert and print it
#
/usr/local/bin/gs -sOutputFile=/dev/fd3 \
-dSAFER -dNOPAUSE -q -sDEVICE=cdj550 \
-dBitsPerPixel=24 \
3>&1 >&2 && exit 0
else
#
# Plain text or HP/PCL, so just print it directly; print a form
# at the end to eject the last page.
#
echo "$first_line" && cat && printf "\f" && exit 0
fi
exit 2
色々と書いてあるが、印刷ファイルの先頭2文字が %! ならば PostScript ファイルとみなして印刷し、そうでなければプリンタに直接送るという動作をおこなっている。
余談だが、すべてのPSファイルが %! から始まっているわけではないので、この条件ではしばしば誤動作する(苦笑)。 ja-vfghostscript-5.10に付属のサンプルPSファイルは /usr/local/share/ghostscript/5.10vflib/examples/ 以下に置いてある。 この中で、 %! から始まっていないPSファイルは、alphabet.ps waterfal.ps と2つある。
もう一つチェックポイント。 gs(ghostscript)で、なぜ -sOutputFile=-を使うべきでないかによれば、PostScriptには標準出力へ文字列を出力するコマンドがあるらしい。 また、とあるドライバによって作成されるPostScriptには、標準出力に現在印刷中のページ番号を出力するものがあるようだ。 よって、ghostscriptのオプションで -sOutputfile=- などとして、単純に変換結果を標準出力に出力すると、PostScript内部で出力されるページ番号出力と混ざってしまってうまく印刷できないことがある模様。
root@magi /home/george #lpc restart all
dj:
no daemon to abort
dj:
daemon started
ここでなんらかのエラーが発生した場合は、 FreeBSD Q and A が助けになるはずだ。
余談だが、ghostscriptのパッケージの種類は沢山ある。 それぞれのパッケージごとに、サンプルのPostScriptファイルが入っているディレクトリが異なっている場合がある。 上記のディレクトリにサンプルファイルが入っているとは限らないので注意。 一般に、pkg_add でインストールされたファイルは /var/db/pkg/[パッケージ名]/+CONTENTS というファイル内部に保存されている。 どこに tiger.ps がインストールされたか分からない場合は、/var/db/pkg/ja-vfghostscript-5.10/+CONTENTS の内容をチェックしよう。 さらに、ちなみに、+CONTENTS内部に書いてあるディレクトリ名は、先頭の /usr/local を省略してあるか、 X11アプリケーションならば /usr/X11R6 を省略してある。 そのままでは利用できないが、どこにインストールしたかの見当をつけたい時に有効だと思う。
#
# Simple entry for HP Desktop 880C with gs via samba
#
dj|lp|local line printer:\
:sh:\
:mx#0:\
:ct#0:\
:sd=/var/spool/output/dj:\
:lp=/dev/null:\
:if=/usr/local/libexec/hpif-samba:\
:vf=/usr/local/libexec/hpvf:\
:lf=/var/log/lpd-errs:
ここで、唯一上の設定と異なるのがif=で指定されているデフォルトフィルタの部分だ。
ここでは、 hpif-samba を指定している。
このフィルタ内部でWindowsマシンにプリント内容を転送するように設定するわけだ。
#!/bin/sh
#
# hpif-samba - Print Ghostscript-simulated PostScript on a DeskJet 880c
# Installed in /usr/local/libexec/hpif-samba
#
# Treat LF as CR+LF:
#
printf "\033&k2G" || exit 2
#
# Read first two characters of the file
#
read first_line
first_two_chars=`expr "$first_line" : '\(..\)'`
if [ "$first_two_chars" = "%!" ]; then
#
# It is PostScript; use Ghostscript to scan-convert and print it
#
/usr/local/bin/gs -sOutputFile=/dev/fd/3 \
-dSAFER -dNOPAUSE -q -sDEVICE=cdj880 \
3>&1 >&2 | /usr/local/bin/smbclient //casper/hp880c -U george -N -c 'print -' > /dev/null && exit 0
else
#
# Plain text or HP/PCL, so just print it directly; print a form
# at the end to eject the last page.
#
exit 2
fi
exit 2
印刷ファイルの先頭2文字が %! ならば PostScript ファイルとみなしてgsで処理し、パイプでsmbclientに流し込んでいる。
smbclientのオプションでgeorgeというのがWindows98SE上での私のログイン名、casperというのがWindows98SEが動作しているマシン名、hp880cという名前でプリンタをパスワード無しで公開共有している設定となっている。
the printmode is now graphics