Entry

印刷環境を整えよう

2004年12月01日

しばらく FreeBSD のあるパソコンでは,印刷していなかったんですけれど,使わないのもなんなんで設定することにしました。

その昔,UN*X で印刷するには Postscript なプリンタが必要だったけれど,今では Canon や Epson みたいな主要メーカーがドライバを出してくださっています。あたしの場合,はじめて買ったレーザープリンタが,極悪 WPS プリンタだったという苦い経験があることから,感慨も一入だったりします。

ここでは,主要メーカーのドライバはともあれ,Brother の HL-1440 というレーザープリンタを使ってみます。どこかで紹介したかもしれませんけど,個人で持つモノクロレーザープリンタとしては,手頃でおすすめのプリンタです。もちろん,WPS みたいなケチ臭いものは入っていません。

そういえば,印刷環境というと,この頃は CUPS なる印刷システムがあるようですね……。システムに依存しない印刷システムということで,主流になりつつあるようです。もっとも,うちでも CUPS を入れてみたところ,どうも上手く動きませんでした。そんなわけで,ここではこれまでの伝統的な方法で印刷することにします。

印刷の仕組みはとてもややこしいので,ここでは,仕組みの説明は最小限にとどめておきます。やることは,次の4点です。

  • Ghostscript をインストールする
  • /etc/printcap を編集する
  • Ghostscript 用のフィルタを書く
  • lpd を起動する

lpr は,Postscript プリンタに繋がっていることを前提にしていますから,通常,そのままでは印刷できません。つまり,非 Postscript なプリンタで印刷するには,lpr から印刷データを見ると Postscript に見えて,プリンタからデータを見ると,そのプリンタのページ言語で見えるような仕組みが必要になってくるわけです。こういったデータの仲介役を担当するのが Ghostscript で,ここでのキモだったりします。

まずは,Ghostscript をインストールしておきます。おなじみの Ports から make install ですね。うちに入っているのは,以下の通りです。

  • ghostscript-gnu-7.07_11
  • ghostscript-gnu-commfont-7.07
  • ja-ghostscript-gnu-jpnfont-7.07_1

日本語を使うために japanese/ja-ghostscript-gnu-jpnfont を入れれば,必要なアプリケーションも依存性で追加されると思います。一応,自分のプリンタドライバが含まれているか,見ておきましょう。

% gs -h
(snip)
Available devices:
   alc1900 alc2000 alc4000 alc4100 alc8500 alc8600 ap3250 appledmp atx23
   atx24 atx38 bbox bit bitcmyk bitrgb bj10e bj10v bj10vh bj200 bjc600
   bjc800 bjc880j bjccmyk bjccolor bjcgray bjcmono bmp16 bmp16m bmp256
   bmp32b bmpgray bmpmono bmpsep1 bmpsep8 ccr cdeskjet cdj1600 cdj500 cdj550
   cdj670 cdj850 cdj880 cdj890 cdj970 cdjcolor cdjmono cgm24 cgm8 cgmmono
   cif cljet5 cljet5c cljet5pr coslw2p coslwxl cp50 declj250 deskjet
   dfaxhigh dfaxlow djet500 djet500c dmprt dnj650c epag epl2050 epl2050p
   epl2120 epl2500 epl2750 epl5800 epl5900 epl6100 eps9high eps9mid epson
   epsonc epswrite escpage faxg3 faxg32d faxg4 fs600 gdi hl1240 hl1250 hl7x0
   hpdj ibmpro ijs imagen inferno iwhi iwlo iwlq jetp3852 jpeg jpeggray
   laserjet lbp1310 lbp1510 lbp1610 lbp1710 lbp1810 lbp1910 lbp8 lex2050
   lex3200 lex5700 lex7000 lips2p lips3 lips4 lips4v lj250 lj4dith lj5gray
   lj5mono ljet2p ljet3 ljet3d ljet4 ljet4d ljetplus lp1800 lp1900 lp2000
   lp2200 lp2400 lp2500 lp2563 lp3000c lp7500 lp7700 lp7900 lp8000 lp8000c
   lp8100 lp8200c lp8300c lp8300f lp8400f lp8500c lp8600 lp8600f lp8700
   lp8800c lp8900 lp9000b lp9000c lp9100 lp9300 lp9400 lp9500c lp9600
   lp9600s lp9800c lq850 lx5000 lxm3200 lxm5700m m8510 md1xMono md2k md50Eco
   md50Mono md5k mgr4 mgr8 mgrgray2 mgrgray4 mgrgray8 mgrmono miff24 mj500c
   mjc180 mjc360 mjc720 necp6 npdl nullpage oce9050 oki182 okiibm paintjet
   pam pbm pbmraw pcl3 pcx16 pcx24b pcx256 pcxcmyk pcxgray pcxmono pdfwrite
   pgm pgmraw pgnm pgnmraw photoex pj pjetxl pjxl pjxl300 pkm pkmraw pksm
   pksmraw plan9bm png16 png16m png256 pngalpha pnggray pngmono pnm pnmraw
   ppm ppmraw psgray psmono psrgb pswrite pxlcolor pxlmono r4081 rpdl sgirgb
   sj48 st800 stcolor sunhmono t4693d2 t4693d4 t4693d8 tek4696 tiff12nc
   tiff24nc tiffcrle tiffg3 tiffg32d tiffg4 tifflzw tiffpack uniprint x11
   x11alpha x11cmyk x11cmyk2 x11cmyk4 x11cmyk8 x11gray2 x11gray4 x11mono
   x11rg16x x11rg32x

上記の hl1250 というドライバが HL-1440 用のドライバです。ばっちり組込まれています。

次に,/etc/printcap を編集します。大体次のように書いておきます。

# HP-1440 with ghostscript
lp|ps|gs|Ghostscript PS2 printer:\
  :lp=/dev/lpt0:sh:mx#0:\
  :lf=/var/log/lpd-errs-gs:\
  :sd=/var/spool/lpd/gs:\
  :if=/usr/local/libexec/gsif:

`if=/usr/local/libexec/gsif:' というのが Ghostscript に渡すフィルタになっています。またスプール用のディレクトリ(ここでは /var/spool/lpd/gs)がない場合は,あらかじめ作っておく必要があります。

printcap が書けたら,フィルタを書きましょう。フィルタの場所や名前は自由に決められます。ここでは /usr/local/libexec/gsif にしました。このフィルタはハンドブックに載っていたものを少し書き変えたものです。

#!/bin/sh
#
#  gsif - Print Ghostscript-simulated PostScript
#

#  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 -dSAFER -dNOPAUSE -q -sDEVICE=hl1250 \
                      -sPAPERSIZE=a4 -r600x600 -sOutputFile=- - \
        && 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

シェルスクリプトなので,実行属性を与えておかないとフィルタにならないことに注意です。

ここまでできたら,あとはプリンタ用のデーモンを起動するだけです。root になって,

# lpd

で立ち上がると思います。適当なアプリケーションから印刷してみて,無事印刷できれば終了です。うちでは OpenOffice.org や Gimp なんかから印刷できました。そうそう…… lpd を起動の度に手動で立ち上げるのが面倒な方は,/etc/rc.conf に

lpd_enable="YES"

と書いておきましょう。ちょっと幸せになれます。

駆け足で説明しちゃったけれど,詳しくはハンドブック参照ということで……。あたしの場合,印刷環境とオフィスアプリケーションがもう少し整うと,Windows と完全に別れられるんですけれど,そうなるにはまだまだ時間がかかりそうですね……。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN