Japanese Printing mini HOWTO はねひでや wing@flatout.org wing@lain.org Rel.0.0.1a 1996/08/22 このドキュメントは、Linux 上で日本語を印字する方法について説明します。 英語版の Printing HOWTO (日本語訳 ) とは無関係に記述したものです。 Note: この文書はかなり以前に書かれたものなので、いまどきの Linux 環 境にはあてはまらない箇所があります。 (JF Project) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Table of Contents 1. プリンタ使用の基礎知識 1.1. テキストファイルの種類 1.2. プリンタの種類 2. lpr システム 2.1. lpr システムとは 2.2. lpr システムの仕組み 3. lpr によるテキストファイルの印字方法 3.1. /etc/printcap の設定 3.2. スプールディレクトリの作成 3.3. デーモンの起動 3.4. 印字テスト 4. PostScript の使用 4.1. PostScript とは 4.2. GhostScript とは 4.3. GhostScipt の動作 4.4. GhostScript + lpr による印字 5. 終わりに 1. プリンタ使用の基礎知識 まず始めに、プリンタを扱う上で、知っておいた方が良いことをまとめました 。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.1. テキストファイルの種類 テキストファイルの種類と言うと大げさですが、テキストファイルには、通称 で SJIS, JIS, EUC の 3 種類の漢字コードがあります。 SJIS 別名 MS 漢字、別名のとおり DOS/Windows 等で主に使用されます。 JIS Internet 上のメールやニュースで主に使用されます。 EUC UNIX マシン上での使用を考えてつくられたコード体系です。 これは全て互換性はありませんので、それぞれについて処理する必要がありま す。JE では、EUC を前提としています。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.2. プリンタの種類 よく、テキストファイルを cat file > /dev/lp1 等とやって、英数字は出るが漢字が出ません、と言った質問を目にします。こ れは、ファイル上の漢字コードをプリンタが理解できないために起こります。 例えば、EUC でエンコードされたファイルは、最上位ビットが立っていれば漢 字となりますが(正確にはチョッチ違いますので、興味がある方は調べて見て下 さい)、それをプリンタが理解できないわけです。そこで、プリンタが理解でき るようにテキストファイルを変換しなければなりません。変換は、プリンタ制 御コードの埋め込みと漢字コードの変換等の処理を行ないますが、これらはプ リンタが、どの制御コードをサポートしているかにより異なります。次に、国 内の主要なプリンタ制御コードを示します。 ESC/P EPSON が開発したドットプリンタ用の制御コード体系 ESC/Page EPSON が開発したページプリンタ用の制御コード体系 (ESC/Pとは互換性は 無い) LIPS II, II+, III Canon のページプリンタ用制御コード体系 PCPR201 NEC PC 型番プリンタの制御コード体系 NM NEC N 型番プリンタ用の制御コード 実際の変換は、次の章で説明する lpr のフィルタが行なってくれますから、普 段は意識する必要はありませんが、所有のプリンタが、どの制御コードを持っ ているかは * 必ず * 把握しておかねばなりません。 Important: また、ESC/P スーパー(ESC/PS)と言うモードがあるプリンタが あります。これは ESC/P, ESC/Page(ページプリンタのみ), PCPR201 を自 動的に区別するモードとなっています。しかし、実際には区別するのでな く、ソフトウェアからモード移行の制御コードを発行しているのです(希に 自動的に区別する場合もありますが)。 ですから、ESC/PS に対応したフィルタを使用しない場合は、プリンタのモ ードを手動で切り替える必要があります。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2. lpr システム lpr の概要について説明します。lpr は Linux 独自のものではないので、 UNIX 一般の書籍も参考になるでしょう。また、システムの設定は root (スー パーユーザ) で行うことを忘れないでください。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.1. lpr システムとは lpr は、BSD 系の UNIX 上で開発されたプリントジョブの管理システムです。 これを使うことにより、複数のユーザから、印字要求の受け付け/キャンセル/ 出力状況の確認などが出来ます。 もし lpr を使わなかったら、デバイスの取り合いになり複数のプリントジョブ を効率良く処理することは出来ないでしょう。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.2. lpr システムの仕組み lpr は、デーモンの lpd と、lpd に要求を出すコマンド群から構成されていま す (図が汚いのは勘弁してね:-)。 プリンタ(スペシャルファイル) ^ │ フィルタ │キューから一つづつ印字 │ コマンド群 <────> lpd ─────────> spool 出力要求 要求のキューイング 要求取消 印字内容の取り出し 出力状況 要求の削除 実際にユーザが使用するのは、コマンド群だけです。しかし、Linux では、ユ ーザ = システム管理者の場合が多いので、lpd 等の設定を行なう必要がありま す。この他の特徴として、ネットワーク上での使用も考えられており、他のマ シンの lpd と連携して、リモートプリンタに出力することも可能です。(本ド キュメントでは、これには触れません。) プリンタの違いは、フィルタが吸収する仕組みになっています。次の章からは 、この lpr を使用しての印字法を説明します。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3. lpr によるテキストファイルの印字方法 lpr を使い、テキストファイルを印字ための設定方法を説明します。2 章で説 明したとおり、ここでポイントとなるのは、印字しようとするテキストファイ ルの種類と、プリンタの種類です。プリンタは BJ10VLite を想定していますが 、 ESC/P の制御コードを持つものなら同様です。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.1. /etc/printcap の設定 使用するフィルタ、スプール等の定義を、/etc/printcap ファイルで行ないま す。printcap の記述例を示します。記述するとき、既に lp があった場合には 、削除するか、# でコメントアウトしておいて下さい。 1 lp| ESC/P filter :\ 2 :lp=/dev/lp1:\ 3 :sh:\ 4 :if=/usr/lib/escpf:\ 5 :of=/usr/lib/escpf:\ 6 :sd=/var/spool/lpr/lp:\ 7 :pw#90:pl#66:\ 8 :mx#0:\ 9 :lf=/var/spool/lpr/lp/lpr-error: これらは次のような意味になっています。 1. lp は lpr システム上のプリンタ名(エントリ)です。また、lp は、プリン タ名を指定しなかった場合にデフォルトで使用されます。| 以降はコメン トです。 2. スペシャルファイルを指定します。プリンタポートの I/O アドレスによっ て、 0x3bc:/dev/lp0, 0x378:/dev/lp1, 0x278:/dev/lp2 となります。 3. カバーシート(出力したホスト名やユーザ名が印字される)の出力を抑制し ます。 4. Input Filter です。文字通り入力データのフィルタです。例えば課金情報 等を処理する場合に使用されます。ここでは JE に含まれる ESC/P 用のフ ィルタを指定していますが、特別何もしていません。 5. Output Filter です。出力データのフィルタです。ここで 1.2 節で説明し た変換などをおこないます。JE に含まれる ESC/P 用のフィルタを指定し ていますが、特別何もしていません。 6. スプールディレクトリを指定します。これは 1 のプリンタ名毎に作成しま す。 7. pw が印字桁数、pl が印字行数の指定です。この指定は、escpf フィルタ における A4 でぎりぎりのサイズです。 8. スプールする最大ファイルサイズの指定です。0 を指定すると無制限にな ります。 9. ログファイルの指定です。エラー発生時に記録するファイルです。 書式の詳細は、man printcap で表示されます。 使用したフィルタ、escpf は、EUC と JIS コードのファイルを、ESC/P の制御 コードに変換します。 escpf は PCPR201 を処理できないので、同じく JE に含まれる pf コマンドを 利用して、次のようなシェルスクリプトをフィルタにすると良いでしょう。 #!/bin/sh /usr/bin/pf -DPCPR -IEUC exit 0 * 最近の NEC プリンタは、ESC/P をサポートするものも発売されており、 PCPR201 を使う機会は減ってきているでしょう。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.2. スプールディレクトリの作成 スプールディレクトリを作成します。単純に mkdir で作成するだけです。 # mkdir /var/spool/lpr # mkdir /var/spool/lpr/lp 注意: 以前は、作成後 chown root.lp と chmod 775 等としていたのです が、Slackware-3.0 では特に必要ないようです。 # chown root.lp /var/spool/lpr/lp # chmod 775 /var/spool/lpr/lp ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.3. デーモンの起動 Slackware では、デフォルトで lpd が起動するようになっているので、特に作 業する必要はありません。ps コマンドで確認し、もし lpd が起動していない ようであれば、/etc/rc.d/rc.inet2 の $IN_SERV を確認して下さい。 IN_SERV ="lpd" となっていれば大丈夫の筈です。 lpd が起動していることを確認したら、lpc コマンドで次のようにします。 # lpc lpc> restart all lp: no daemon to abort lp: daemon started lpc> quit # このとき、ロックファイルがオープンできないと言うメッセージが出るかも知 れませんが、無視して構いません。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.4. 印字テスト それでは、準備が出来たので早速印字してみましょう。印字には、次のコマン ド群を使用します。 lpr 印字要求 印字要求を lpr システムに発行します。 lpr プリンタ名 印字ファイル 例 # lpr EUC_file 前述のとおり、プリンタ名は lp ですから省略できます。よって、上記の ようになります。 もしも印字されない場合、次のことを確認します。 □ printcap の記述(フィルタやスプールディレクトリはちゃんと存在す るか?) □ lpd が起動しているか? (ps コマンドで確認) □ 印字しようとしたファイルは EUC か JIS のどちらかか? □ ESC/P スーパー機能つきプリンタの場合、ちゃんと解除されているか? lpq 印字待ちの表示 現在キューイングされている印字ジョブを表示します。 lpq プリンタ名 例 # lpq -Plp lp is ready and printing Rank Owner Job Files Total Size active wing 1 JPrinting-mini-HOWTO.jis 7470 bytes 1st wing 2 JPrinting-mini-HOWTO.jis 7470 bytes 2nd wing 3 JPrinting-mini-HOWTO.jis 7470 bytes # lprm 印字要求の取消 印字要求を取り消します。もちろん取り消せるのは、自分のジョブだけで す。 lprm プリンタ名 ジョブ番号 例 # lprm -Plp 1 dfA001Aa00918 dequeued cfA001Aa00918 dequeued # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4. PostScript の使用 4.1. PostScript とは PostScript とは、アドビが開発したページ記述言語です。一般の制御コードが (紙面上)シーケンシャルに制御コードを処理していくのに対して、紙面上のど こに何を置くと言うように処理します。置くものは、文字に限らず、図形やビ ットマップも可能です。 詳しく知りたい方は、工学書のコーナーに電話帳級の本が2冊置いてあるのです ぐにわかるでしょう。通常は、PostScript プリンタに対して使用します。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.2. GhostScript とは GhostScript とは、man ページから言葉を借りれば PostScript のエミュレー タです。PostScript とて、結局はビットイメージに展開しているだけですから 、ビットイメージが印字できるプリンタ(普通出来ないプリンタは無いでしょ う)ならエミュレートが可能なわけです。例えば ESC/P を PCPR201 にエミュレ ートすることも勿論可能ですが、それをやらないのはメリットが無いからです 。逆に言うと、わざわざエミュレートをすると言うのは、それだけ価値がある ということです。 その価値とは、TeX 等の印字や価格面等だと思います。TeX では dvi 形式のフ ァイルから印字することも可能ですが、EPS 等を取り込んでいる場合には、や はり PostScript で印字するほうが便利です。価格面でも、PostScript プリン タを買うのに比べ、はるかに安い価格で環境を構築できます。特に Color PostScript は非常に高価ですが、Canon や EPSON 等のインクジェットと組み 合わせることにより、非常に安価に Color PostScript を実現できます。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.3. GhostScipt の動作 GhostScript の動作は単純です。 ┌──────────────────────────────────┐ │ PostScript │ │ ↓ │ │ GhostScript にて処理 │ │ ↓ │ │ 各種プリンタ制御コード/画像フォーマットに変換 │ └──────────────────────────────────┘ これだけなのです。面倒なのは、各種プリンタ制御コード/画像フォーマットに 変換に変換する時の設定/指定です(設定/指定は次の節でやります)。 JE-0.9.7z に収録された GhostScript の、主な出力デバイスを次に示します。 これらは、gs -h で確認できます。 静的に組み込まれたもの ┌───────────────────────────────────┐ │ x11 S X Window System │ │ dmprt P dviprt 用のコンフィグレーションファイルを利用した印字│ └───────────────────────────────────┘ 動的に組み込まれたもの ┌─────────────────────────────────┐ │ bj10v P Canon BJ10系 │ │ bjc600j P Canon BJC600 用カラー対応(610 の 720dpi は不明) │ │ dj505j P HP Desk Jet 505 │ │ epag P EPSON ESC/Page │ │ linux S linux console │ │ lips P Canon LIPS │ │ lips2 P Canon LIPS II │ │ lips3 P Canon LIPS III │ │ mjc180 P EPSON MJ800C/700V2C/900C/5000C 等のカラー 180dpi │ │ mjc360 P EPSON MJ800C/700V2C/900C/5000C 等のカラー 360dpi │ │ mjc720 P EPSON MJ800C/700V2C/900C/5000C 等のカラー 720dpi │ │ pr150 P PC-PR150 │ │ tiffg3 S TIFF G3 FAX │ └─────────────────────────────────┘ dmprt が使用できるので、ほとんどのプリンタは使用できると思います。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.4. GhostScript + lpr による印字 GhostScript は、プリンタが即理解できるコードを生成しますから、直接スペ シャルファイルに入力しても印字は出来ます。しかし、これではスプーリング もできませんし効率良く使用できないと思います。ですから、GhostScript を lpr のフィルタとして使用します。 ここでは、True Type フォントを用いて、BJ10VLite + dmprt と LP1700 + epag で印字する例を紹介します。なお、GhostScript は JE-0.9.7z に収録さ れたものを使用します。 共通設定(その一) → BJ10 or LP1700の設定→共通設定(その二) の順で作業し ます。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.4.1. 共通設定(その一) まず共通設定として、GhostScript が使用する日本語フォントの設定を行ない ます。 kconfig.ps の設定 GhostScript は kconfig.ps により、どの日本語フォントを使用するか決 定します。kconfig.ps は、/usr/local/lib/ghostscript/kanji 以下に作 成するシンボリックリンクです(もちろんコピーしても構いませんが、それ はださいですよね:-)。/usr/local/lib/ghostscript/kanji 以下には、 zeit.ps や vflib.ps 等のファイルがあり、使用するものにリンクを張り ます。 ここでは、vflib.ps を使用します。vflib.ps とは、広島大学の角川さん が作成された、ベクトルフォントをビットマップデータに変換するライブ ラリ VFlib を使用するものです。 よって、次のようにシンボリックリンクを張ります。 # cd /usr/local/lib/ghostscript/kanji # ln -s vflib.ps kconfig.ps vfontcap の設定 VFlib を使用することを設定したので、こんどは VFlib が使用するフォン トの設定をします。つまり、 ┌────────────────────────────┐ │ GhostScript → VFlib → 各種ベクトルフォント │ └────────────────────────────┘ のようになっていて、GhostScript がみているのは VFlib だけなのです。 さて、VFlib が使用するフォントは、/etc/vfontcap ファイルで設定しま す。vfontcap の 70 行目付近の ff を次のように修正します。この例では 、フォントが /home/sys/fonts2/ 以下にある場合ですから、各自の環境に あわせてパスを設定して下さい。 ### TRUETYPE FONT (Windows fonts) r-microsoft-mincho|MicroSoft mincho:\ :ft=truetype:\ :ff=/home/sys/fonts2/msmincho: ← ここと r-microsoft-gothic|Microsoft gothic:\ :ft=truetype:\ :ff=/home/sys/fonts2/msgothic: ← ここね さらに、TrueType フォントの場合にはインデックスファイルが必要になり ます。フォントが存在するパス(例では /home/sys/fonts2/ )に移動したら 、 # ttindex msmincho.ttc # ttindex msgothic.ttc を実行してインデックスファイルを作成します。フォントが Windows3.1 の場合には、拡張子が ttc ではなく、ttf になります。 次に、160 行目付近の次の部分をコメントアウトします。 # zeit-maru min|min5|min6|min7|min8|min9|min10|min12|min17|Mincho Font:\ :fc=zeit-mincho: goth|goth5||goth6|goth7|goth8|goth9|goth10|goth12|goth17|Gothic Font:\ :fc=zeit-gothicMH: tmin|tmin5|tmin6|tmin7|tmin8|tmin9|tmin10|tmin12|tmin17|Mincho Font:\ :fc=zeit-mincho: tgoth|tgoth5||tgoth6|tgoth7|tgoth8|tgoth9|tgoth10|tgoth12|tgoth17|Gothic Font:\ :fc=zeit-gothicMH: bmin:\ :fc=zeit-mincho: bgoth:\ :fc=zeit-gothicMH: こんどは、209 行目付近の # TrueType から *次の行以降* のコメントを 外します。 # TrueType #min|min5|min6|min7|min8|min9|min10|min12|min17|Mincho Font:\ # :fc=microsoft-mincho: #goth|goth5||goth6|goth7|goth8|goth9|goth10|goth12|goth17|Gothic Font:\ # :fc=microsoft-gothic: #tmin|tmin5|tmin6|tmin7|tmin8|tmin9|tmin10|tmin12|tmin17|Mincho Font:\ # :fc=microsoft-mincho: #tgoth|tgoth5||tgoth6|tgoth7|tgoth8|tgoth9|tgoth10|tgoth12|tgoth17|Gothic Font:\ # :fc=microsoft-gothic: #bmin:\ # :fc=microsoft-mincho: #bgoth:\ # :fc=microsoft-gothic: 以上で共通設定(その一)は完了です。ここでテストをしてみましょう。 /usr/local/lib/ghostscript 以下に移動して、次のコマンドを実行してみ て下さい。 X Window System の場合 gs article9.ps Linux のコンソールの場合 gslx article9.ps 画面上に日本国憲法が表示されればOKです。もしうまく行かない場合、 which gs として、どこの gs を実行しているかチェックして下さい。JE の gs は、 /usr/local/bin/gs(gslx) です。 Canon BJ10VLite + dmprt driver dmprt は dviprt の設定ファイルを利用するドライバです。この設定ファ イルは、 /usr/local/lib/prtcfg/ 以下にあります。 cfg と src のサブ ディレクトリがありますが、前者は後者をバイナリ変換したものです。筆 者は変換が面倒なので、src (ソース)を利用しています。このファイルを 利用することは、 /usr/local/lib/ghostscript/dmp_site.ps で設定しま す。 dmp_site.ps には、 /printer (/usr/local/lib/prtcfg/src/bj_10v48.src) とだけ書いておけば、一応動きます。しかし、これだけでは大抵印字がず れるので、オフセットやマージンも定義します。 /margin [ 3.675 mm 12.7 mm 0.0 mm 0.0 mm ] /offset [ 0.0 mm -4.0 mm ] ですから、3 行もあれば十分でしょう。 dmp_site.ps が修正できたら、フィルタを作成します。フィルタは /usr/ local/lib/gsf に、次のように作成すると良いでしょう。作成後 chmod 755 とするのを忘れないで下さい。 #!/bin/sh /usr/local/bin/gs -q -dNOPAUSE -sDEVICE=dmprt -r360 \ -sPAPERSIZE=a4 -sOutputFile=- - exit 0 2 行目の -r360 は、解像度(dpi)ですから、プリンタにあわせて決定しま す。 EPSON LP1700 + epag driver この組合せでは、GhostScript 組み込まれたドライバがそのまま使用でき ますから、次のように /usr/local/lib/gsf でフィルタを作成し、 chmod 755 としておきます。 #!/bin/sh /usr/local/bin/gs -q -dNOPAUSE -sDEVICE=epag -r300 \ -sPAPERSIZE=a4 -sOutputFile=- - exit 0 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.4.2. 共通設定(その二) 残るは lpr の設定です。3.1 章, 3.2 章で説明したとおり、printcap とスプ ールディレクトリを作成します。 printcap の設定 /etc/printcap に、次のリストを追加します。記述するとき、既に ps の プリンタ名(エントリ)が無いことも確認して下さい。 1 ps|gs|GhostScript printer:\ 2 :lp=/dev/lp1:sh:mx#0:\ 3 :if=/usr/local/lib/gsf:\ 4 :sd=/var/spool/lpr/ps:\ 5 :lf=/var/spool/lpr/ps/lpr-error: スプールディレクトリの作成 スプールディレクトリを作成します。 # mkdir /var/spool/lpr # mkdir /var/spool/lpr/ps 作成したら、3.3 章と同様に lpc を実行して下さい。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.4.3. テスト印字 全ての設定が終ったので、テスト印字をします。さきほどと同様に /usr/local /lib/ghostscript 以下に移動して、次のコマンドを実行してみて下さい。 # lpr -Pps article9.ps これで、共通設定(その一)の画面と同様に、日本国憲法がプリンタから出力さ れます。 うまく印字されない場合、gs -h を起動して、ドライバーがサポートされてい るか確認して下さい。JE-0.9.7z の GhostScript では、次のようになります。 ┌───────────────────────────────────────┐ │ Ghostscript version 2.6.2 (4/19/95) │ │ Copyright (C) 1990-1995 Aladdin Enterprises, Menlo Park, CA. │ │ Usage: gs [switches] [file1.ps file2.ps ...] │ │ Available devices: │ │ x11 dmprt │ │ Dynamic modules: │ │ bit bj10v bj10vh bjc600j bjc600jc bmp16 bmp16m │ │ bmp256 bmpmono cdj560 dj505j dj505jc epag escp │ │ escpc jj100 linux lips lips2 lips3 mag16 │ │ mag256 mjc180 mjc360 mjc720 pbm pbmraw pcx16 │ │ pcx256 pcxgray pcxmono pgm pgmraw ppm ppmraw │ │ pr150 tiffg3 x11 dfaxhigh dfaxlow 以下省略 │ └───────────────────────────────────────┘ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 5. 終わりに 本ドキュメントのバグレポート/応用事例は歓迎します。うまくいかないときは 、使用した環境と設定を明確にして、fj.os.linux 等で質問すると良いでしょ う。直接質問することは御遠慮ください。 (SGML conversion: Mar 2001, Yuji Senda)