気の向くままに辿るIT/ICT
webzoit.netウェブサイトホームページ
PC

lp/lpr/lpd...

ウェブ造ホーム前へ次へ
サイト内検索
カスタム検索
周辺機器を使う

lp/lpr/lpd...

いろいろなOSでプリンタを使う

lp/lpr/lpd

 近年、WindowsやMac OS/Mac OS Xのみならず、*BSD/PC-UNIX/Linuxでも接続された周辺機器を自動検出しますし、USB接続ならホットスワップに対応していれば、起動中でも任意のタイミングで接続した周辺機器を認識することができ、Linux/*BSD/PC-UNIXの印刷においては、特にCUPSの登場でFedoraのようにプリンタを利用するのも簡単になりました。

 ここでは、そこに至るまでの変遷の一端を書き記してみようと思います。

 BSD/PC-UNIX/Linuxにおける印刷システムは、UNIX System V系のlp/lpd、BSD lpr/lpd、BSD lpr/lpdの次世代印刷システムLPRng、CUPS/Common Unix Printing Systemの順に変遷してきた経緯があり、順次ページを変えて書きますが、ここでは、まず、初期のSystem V系lp/lpdについて少しだけ触れ、おもに伝統的なBSD lpr/lpdについて記します。

 この過程こそが、印刷プレビューや印刷における根本部分でもあります。

 なお、ここでは、NetBSD/i386がインストールされたマシンを前提としますが、LinuxもBSD lpr/lpdから始まってLPRng、CUPSという同じ道を歩んできていますので各種*BSDやLinuxでもパスや変数、設定値が微妙に、稀に大きく異なることもありますが、基本的な仕組みは同じです。

 留意すべきことは、LPRngは、BSD lpr/lpdと同じインターフェースを維持しつつ、実は、同名のコマンドながら、別であったり、構成ファイルの書き方などについても同じ設定値であっても推奨される方法や指定方法が異なる場合もあること、CUPSでは、lpcは同名ながら機能が絞られた別物、さらにCUPS lprも別物であることです。

【BSD lpr/lpd】
lpr/line printer
lpd/line printer spooler daemon
lpc/line printer controller
lpq/line printer queue
lpstat/line printer status
lprm/line printer remover
lptest/line printer test

【System V系lp/lpd】
lp/line printer
lpd/line printer spooler daemon
lpstat/line printer status
cancel

 lp/lprは、line printer、lpdは、line printer spooler daemonの略でlp/lprは、印刷データをスプールディレクトリに送信、lpdは、スプールディレクトリ内の印刷ジョブを管理・印刷します。

 System V系のlp/lpdには、この他、スプールディレクトリの状態を表示する[lpstat]、ジョブをキャンセルする[cancel]コマンドがあります。

 BSD系のlpr/lpdには、この他、印刷操作の制御をする[lpc]、スプールディレクトリの状態を表示する[lpq]/[lpstat]、ジョブをキャンセルする[lprm]、印刷テストを行う[lptest]コマンドがあり、[lpstat]は、System V系lpstatをエミュレートしています。

プレビュー・印刷はすぐにできる

$ sudo mkdir -p /var/spool/lpd/lp
$ sudo chown daemon:daemon /var/spool/lpd/lp
$ sudo chmod 770 /var/spool/lpd/lp
$ vi /etc/printcap
# 欧文テキスト用プリンタ設定
lp|local printer|HP_DeskJet:\
:lp=/dev/ulpt0:\
:sd=/var/spool/lpd/lp:\
:mx#0:\
:sh:
$

または、1行で書いても可
lp|local printer|HP_DeskJet:lp:/dev/ulpt0:sd:/var/spool/lpd/lp:mx#0:sh:

 初期のBSD lpr/lpdとは言え、例えば、NetBSD/i386をインストールすれば、[/etc/printcap]というファイルの編集とちょっとした作業により、コマンドラインから欧文の印刷ができるようになります。

 まず、スプールディレクトリを作成し、適切な所有者とグループ、そしてパーミッションを設定します。

 ここでは、スプールディレクトリ名をlpとしていますが、[/etc/printcap]でそのファイルパスを書きさえすれば任意の名称でOKです。

 [/etc/printcap]は、1行または、複数行で記述することができ、何れも先頭は、プリンタ設定名で[lp]は慣例的に使われる標準プリンタ設定名、これに[ | ](パイプ/縦棒)を使って別名を記述することもできます。

 1行で書く場合には、設定の区切り文字として[ : ]を使い、複数行で書く場合には、先頭行以外は、設定値の先頭と末尾にコロン[ : ]、さらに最終行以外の行末には、行継続を意味するバックスラッシュ[ \ ](Winでは円マーク)を記述します。

 [mx#0]は、許容する印刷ファイルの最大サイズ指定で[0]は、無制限を表わし、[sh]はバナー印字抑止指定(デフォルトがfalseで[sh]と書かなければfalse、書けばtrue)です。

 また、X Window System上の統合デスクトップ環境はもとより、ウィンドウマネージャ単体をデスクトップ環境として使う場合でも各ソフトウェアアプリケーションが、[印刷プレビュー]、[印刷]やこれに類するメニューやアイコンを持っているのでGUI(グラフィカルユーザーインタフェース)でも基本的にすぐに印刷プレビューも印刷もできます。

$ su -
password:
# pkg_add -v xpdf
# exit
$ sudo find / -name gtkrc
...
/usr/pkg/share/themes/Mist/gtk-2.0/gtkrc
...
$ sudo cp /usr/pkg/share/themes/Mist/gtk-2.0/gtkrc ~/.gtkrc-2.0
$ vi ~/.gtkrc-2.0
...
...
gtk-printpreview-command="xpdf -q %f"

 まれにLeafpadのように、ちょっとした追加設定を要するものもあります。

 Leafpadには、[印刷プレビュー]機能自体はありますが、これを利用するためには、別途PDFビューワ(ここでは、xpdf)をインストールし、Leafpadのグラフィカルインタフェースを作っているGUI開発ツールキットGTK用の構成ファイル(gtkrc)を[sudo find / -name gtkrc]などとして探し、複数検出されるはずのものの内、任意のgtkrcをホームディレクトリにコピー、[~/.gtkrc-2.0]として保存、最終行にでも[gtk-printpreview-command="xpdf -q %f"]と追記するだけです。

 GTKはいろんなソフトウェアで使われており、このgtkrcは、見た目の装飾に関わる指定などもできるようになっていますし、NetBSDでもそうですが、GTKのテーマを切り替えるパッケージもあり、GTK2.0用のそれを使うと~/.gtkrc-2.0が自動的に上書きされてしまったりもしますが、~/.gtkrc-3.0など複数使っても何れも読み込まれるようなので先のxpdfの指定も上書きされない方に指定しておいたりすることもできます。

 少なくともLeafpad 0.8.17では、この指定が効かず、別途[evince]をインストールする必要がありました。

 言い換えると別途[evince]をインストールするだけでLeafpadの[印刷プレビュー]機能を利用できるようになりました。

フィルタ

$ sudo mkdir -p /usr/local/libexec
$ sudo vi /usr/local/libexec/lpfilter
#!/bin/sh
# 階段現象対策
printf "\033&k2G" && cat && exit 0
exit 2
$ vi /etc/printcap
# 欧文テキスト用プリンタ設定
lp|local printer|HP_DeskJet:\
:lp=/dev/ulpt0:\
:sd=/var/spool/lpd/lp:\
:mx#0:\
:sh:\
:if=/usr/local/libexec/lpfilter:
$ sudo chmod 755 /usr/local/libexec/lpfilter
$

 ただ、そのままでは、印刷したときに階段現象と言われる改行位置が行を追うごとにズレていってしまうという状況となるので、これを回避するために多くの場合、フィルタと呼ばれる簡単なshellスクリプトを書き、[/etc/printcap]でそのフィルタパスを指定する必要があります。

 まず、フィルタを置いておくディレクトリを作成し、フィルタとなるshellスクリプトを作成します。

 階段現象対策の方法は特に決まっていませんが、印刷都度実行されますので効率のよい方法に越したことはありません。

 [/etc/printcap]にフィルタを指定する場合には、[if](input filter)を使って[if=]の右辺にフィルタパスを指定します。

 ここでは、フィルタファイル名をlpfilterにしていますが、[/etc/printcap]でそのファイルパスを書きさえすれば任意の名称でOKです。

 なお、パスはOSによって異なるかもしれませんし、ここで使っている/usr/local/libexecは、というより、[local]は、NetBSD/i386としては異例ですが、NetBSDのドキュメントにまさに[/usr/local/libexec]とあったこと、パッケージが自動作成したのなら/usr/pkg/libexecでもよいかもしれませんが、自分で作成したという意味では、pkgとlocalで区別できるので、このパスで良さげと思って使っているだけで別に絶対コレという決まりはありません。

 これで欧文テキスト文字の印刷はできるようになります。

[訂正]

 階段現象対策において[&& cat]を入れ忘れていました。

 このcatがないとプリンタが対応に困って一向に印刷できませんでした。。。

 これを参考にしてハマってしまった方がいらしたとしたら、本当に申し訳ありませんでした。

画像のプレビュー・印刷も簡単

 Ghostscriptというソフトウェアをインストールし、そのコマンド[/usr/pkg/bin/gs]を使うと画像などのバイナリデータの表示、印刷もできるようになります。

日本語などのマルチバイト文字のプレビュー・印刷ももちろんできる

 また、Ghostscriptと合わせてCMapやCIDFont他、いくつかのパッケージをインストールし、適宜設定すると日本語などのマルチバイト文字を表示、印刷することもできるようになります。

 よって、これだけで日常、事前にプレビューしたり、プリンタを使って印刷するにあたって一通りのことができるようになります。

 以後、Ghostscriptの概要に加え、具体的な作業を交えていくことにします。

Ghostscriptとは

 Ghostscriptとは、Adobe社が開発したPDF/Portable Document Formatのベースでもある同社開発のPostscriptを解釈するためのPostscriptインタプリタです。

 なお、Ghostscriptには、テキスト、PDFや各種フォーマットの画像を相互に変換する機能もあります。

 Postscriptの技術は公開はされていたものの、かなり複雑で、また、これを利用できるプリンタは、当時、相当高価な一部のレーザープリンタ程度、PCが爆発的に普及する以前だったこともあり、一部の企業くらいしか利用できませんでしたし、デジタルデータの文字や記号情報を表示(表現)するには、『フォント』が必要ですが、このフォントも当初有償かつ高価だったため、ユーザーは極々限られていました。

 そこで大学などの教育機関、個人、中小零細企業でも利用できるような安価なプリンタでもPostscript仕様のレーザープリンタ並に印刷できるようにということである開発者がGNUに参画し、開発プロジェクトが始動、オープンソースとしてGPL/GNU Public LicenseでリリースされたのがGPL(GNU) Ghostscriptであり、のちにその開発者が、商用としてのプロプライエタリライセンスを発行できるようにとAladdin Enterprises社を設立、Aladin Licenseでリリースしたものは、その後、Affero社が権利を保有するに至り、世界中の有志と共に、やはり、オープンソースとしてAffero GPL(AGPL) Ghostscriptをリリースしているという経緯があるようです。

 日本語などマルチバイト文字を使いたいユーザーにとっては、そんなGhostscriptをインストールするにあたって、ちょっとした注意が必要なので画像ではなく、まず、日本語について見ておくことにします。

Ghostscriptで日本語の表示と印刷

 Ghostscriptで日本語などのマルチバイト文字を表示、印刷するには、NetBSD/i386では、[ghostscript-*](*はgplかagpl、これらをインストールするためのメタパッケージとして同時にインストールされる[ghostscript])のほか、[ghostscript-cidfonts-ryumin](とこれと同時にインストールされる[ghostscript-cidfonts])と[ghostscript-cmaps]が必要となります。

 ただし、[pkg_add]できるパッケージとして[ghostscript-cidfonts-ryumin]は存在しないので[pkgsrc](Linuxのように他から持ってきても良いですが、NetBSD/i386のようにpkgsrcで管理している場合、賢明なのは、pkgsrc)からインストールする必要があります。

$ su -
password:
# vi /etc/mk.conf
...
PKG_OPTIONS.ghostscript+=disable-compile-inits
...
# cd /usr/pkgsrc/print/ghostscript-gpl
# make install package clean
# cd /usr/pkgsrc/fonts/cidfonts-ryumin
(# cd /usr/pkgsrc/fonts/ghostscript-cidfonts-ryumin)
# make install clean
# cd /usr/pkgsrc/fonts/cmaps
(# cd /usr/pkgsrc/fonts/ghostscript-cmaps)
# make install clean
# exit
$

 しかも[ghostscript-cidfonts-ryumin]をインストールするためには、 (gplまたは、agpl何れかの)ghostscript自体を[disable-compile-inits]オプション付きでパッケージを作成する必要があります。

 また、そのためには、[/etc/mk.conf]に[PKG_OPTIONS.ghostscript+=disable-compile-inits](イコールではなくプラスイコール)という行を追記の上、[/usr/pkgsrc/print/ghostscript-*](*はgplかagpl)に移動[cd]してパッケージの作成とインストール([make install package clean])を行う必要があります。

 ちなみにLinux含め、ソースをダウンロードして展開した場合には、[./configure --disable-compile-inits]として[make]、[make install]します。

 [mk.conf]に書いた設定は、システム構築中に使われた様々なパラメータを上書きします。

 [/etc/mk.conf]が存在しなければ、新たに作成するとよいでしょう。

 [foomatic*]や、もし、必要で、かつインストールするタイミングによっては、[mupdf]でも[/etc/mk.conf]の設定が必要になることもあります。

 ちなみに[pkgsrc]をインストール済みであれば、[/usr/pkgsrc/mk/defaults/mk.conf]もありますが、PKG_OPTIONSという変数が設定されているわけでもありませんし、システム全体の調整でもするのでなければ、雛形としてコピーする必要はありません。

 このようにしないと[ghostscript-cidfonts-ryumin]をインストールできないばかりでなく、CMapとCIDFontをインストールしても参照するパスの(接頭辞に展開パスが謎の[%rom%]が付く)関係で上手く利用できないので意味がありません。

 よって欧文を母国語とする人など欧文だけ使うことができればよいという人々以外は、[pkg_add]を使ってghostscirptをインストールしたところで日本語を含むマルチバイト文字を表示・印刷できず要求を満たさないので意味がありません。

 とは言え、NetBSD/i386においては、何れのパッケージも用意されており、少なくとも検証時点では、[pkg_add]を使って[pkg_add -v ghostscript]としてインストールする場合には、Postscriptインタプリタとして[ghostscript-gpl]、これをインストールするためのメタパッケージ[ghostscript]、PostscriptフォントとしてAladdin Ghostscript用の[ghostscript-fonts]が併せてインストールされたように見受けられました。

 特に選択基準もなかったので、これを理由に[pkgsrc]で[make install package clean]するGhostscriptについても[ghostscript-gpl]を選びました。

$ ls /usr/pkg/share/ghostscript/バージョン/Resource
$ ls /usr/pkg/share/ghostscript/バージョン/Resource/Font
$ ls /usr/pkg/share/ghostscript/バージョン/Resource/CMap
...
GothicBBB-Medium-H
GothicBBB-Medium-EUC-H
...
Ryumin-Light-H
Ryumin-Light-EUC-H
...
$ ls /usr/pkg/share/ghostscript/バージョン/Resource/Init
...
cidfmap
...
gs_res.ps
...
$ su -
password:
# pkg_add -v ipaex
# exit
$ cd /usr/pkg/share/ghostscript/fonts
$ sudo ln -s /usr/pkg/share/fonts/X11/TTF/ipaexm.ttf
$ sudo ln -s /usr/pkg/share/fonts/X11/TTF/ipaexg.ttf
$ ls
...
ipaexg.ttf
ipaexm.ttf
...
$

 さて、一連のインストールが終わったら[/usr/pkg/share/ghostscript/バージョン/Resource]、[/usr/pkg/share/ghostscript/バージョン/Resource/Font]、[/usr/pkg/share/ghostscript/バージョン/Resource/CMap]といったパス及びそこにファイルがあることを確認します。

 また、日本語を表示させるためには、日本語対応用のフォントが必要です。

 最も手軽に利用できるのは、IPA(独立行政法人情報処理推進機構)のTrueTypeフォントであるIPAフォントやIPAexフォントでしょう。

 これを使う場合、findで検索するなどしてそのファイル[ipam.ttf]、[ipag.ttf]や[ipaexm.ttf]、[ipaexg.ttf](何れも前者が明朝体、後者がゴシック体)があるか確認し、なければ、NetBSD/i386の場合は、パッケージが用意されているのでそれを、用意されていないLinuxなどの場合には、IPAのサイトから入手し、サイト上の手順に沿って入れておくとよいでしょう。

 ここでは、IPAexフォント([ipaexm.ttf]/[ipaexg.ttf])を使用しますが、その他、いくつでも利用したいフォントがある場合には、あらかじめ入手するなどして[man gs]や[gs -h]などで表示される内容を参考に[gs]のフォント探索パス内におくか、シンボリックリンクを作成します。

$ cd /usr/pkg/share/ghostscript/バージョン/Resource/Init
$ vi cidfmap
...
%% 使用するフォントの定義
%% ([(Japan1) 6]はAdobe-Japan1-6)
/IPAexMincho << /FileType /TrueType /Path (/usr/pkg/share/ghostscript/fonts/ipaexm.ttf) /SubfontID 0 /CSI [(Japan1) 6]  >>
/IPAexGothic  << /FileType /TrueType /Path (/usr/pkg/share/ghostscript/fonts/ipaexg.ttf) /SubfontID 0 /CSI [(Japan1) 6]  >>
 
%% 認識されるフォントと使用するフォントのマッピング
/GothicBBB-Medium    /IPAexGothic
/Ryumin-Light               /IPAexMincho
 
%% 同一フォントの別名マッピング
/ipaexm           /IPAexMincho
/ipaexg            /IPAexGothic
...
$ cd /usr/pkg/share/ghostscript/バージョン/Resource/Font
$ ls
...
GothicBBB-Medium-H
GothicBBB-Medium-EUC-H
...
Ryumin-Light-H
Ryumin-Light-EUC-H
...
$ ls /usr/pkg/share/ghostscript/バージョン/Resource/Init
...
cidfmap
...
gs_res.ps
...
$ ls /usr/pkg/share/ghostscript/fonts
...
ipaexg.ttf
ipaexm.ttf
...
$

 前述の一連のインストールが終わった状態では、日本語用のフォントとして[Ryumin-Light](明朝体)と[GothicBBB-Medium](ゴシック体)が関連付けられることになるでしょう。

 これらのフォントが実際どのようなものなのかは、さておき、これらに[ipaexm.ttf]、[ipaexg.ttf]を割り当ててIPAexフォントとして表示されるようにしてみます。

 割り当てるためには、[Resource/Init]にある[cidfmap](より以前は[CIDFnmap])を開き、[ipaexm.ttf]、[ipaexg.ttf]のパスを指定した使用するフォント名称を定義し、それぞれ先頭にスラッシュ[ / ]をつけて[TAB]区切りで対象となるフォントを左、使用したいオリジナルフォントを右に一行ずつ追加していきます。

 この時、マップする名称は、大文字・小文字含めてファイル名と同一でなければならないのですが、先ほどと同様にして[/ipaexm]を[/IPAexMincho]、[/ipaexg]を[/IPAexGothic]とマッピングすることもできるので、その要件を満たすことができます。

 [Resource/Font]や[Resource/CMap]にあるのは、フォントファイルで末尾に[-H](Horizontal/水平の・水平)や[-V](Vertical/垂直の・垂直)とあるのは、それぞれ横組み/横書き・縦組み/縦書き用を、[-EUC]、[-UTF8]、[-RKSJ](Shift_JISらしい)は、文字エンコード方式を表わします。

 また、[Adobe-Japan1-*]と[*]部に0から6が付くファイルは、数字の小さい順にAdobe社が1993年から2004年にかけて順次収録してきた和文用の文字集合であり、[cidfmap]で使用するフォントの定義で[(Japan1) 6]とあるのは、この内の最新版である[Adobe-Japan1-6]を表わしています。

 CIDフォント(CID Font/FID-keyed Font/CID-based Font)は、それまでのOCFフォントに代わり、欧米文字と比べ、異体字、異形字、縦書き・横書きなど特に膨大な文字量となるCJK(Chinese/Japanese/Korea)/CJKV(CJK/Vietnam)文字をほぼすべて収録すべくAdobe社が開発したPostscriptフォントファイルの形式でType1ではCIDフォント、Type2では、PostscriptフォントとTrueTypeフォントを包含するAdobe社とMicrosoft社が共同開発、のちにApple社も賛同合流したOpenTypeフォントも利用可能となっています。

 つまり、CIDは、文字ではなく、文字の形状(字形・グリフ・glyph)で識別するためにCharacter IDを割り振ることで膨大な量の文字種を網羅することができる仕組みになっています。

$ cd /usr/pkg/share/ghostscript/バージョン/Resource/Font
$ sudo cp GothicBBB-Medium-EUC-H GothicBBB-Medium-UniJIS-UTF8-H
$ sudo vi GothicBBB-Medium-UniJIS-UTF8-H
...
...
:%s/EUC-/UniJIS-UTF8-/
$ sudo cp GothicBBB-Medium-UniJIS-UTF8-H GothicBBB-Medium-UniJIS-V
$ sudo vi GothicBBB-Medium-UniJIS-UTF8-V
...
...
:%s/-H/-V/
$ sudo cp GothicBBB-Medium-EUC-H Ryumin-Light-UniJIS-UTF8-H
$ sudo vi Ryumin-Light-UniJIS-UTF8-H
...
...
:%s/GothicBBB-Medium/Ryumin-Light/
$ sudo cp Ryumin-Light-UniJIS-UTF8-H Ryumin-Light-UniJIS-V
$ sudo vi Ryumin-Light-UniJIS-UTF8-V
...
...
:%s/-H/-V/
$

 ここでシステムで使用している文字エンコード方式を持つフォントを[Resource/Font]に作成します。

 検証中のシステム環境は、UTF-8なので[Resource/CMap]にある[UniJIS-UTF8-H]と[UniJIS-UTF8-V]を[Ryumin-Light]及び[GothicBBB-Medium]とを組み合わせて[Ryumin-Light-UniJIS-UTF8-H]と[Ryumin-Light-UniJIS-UTF8-V]、[GothicBBB-Medium-UniJIS-UTF8-H]、[GothicBBB-Medium-UniJIS-UTF8-V]、さらに[Ryumin-Light-V]と[GothicBBB-Medium-V]を既存のファイルをコピー・編集するなどして、それぞれ[Resource/Font]内に作成します。

 [:%s///]はviにおける全行対象の置換方法で、何れも数行でたいしたボリュームではありませんが、それぞれファイル内容にあるフォント名称がファイル名と同じになるように置換しているだけです。

 これで、UTF-8、縦組み・横組み、明朝、ゴシック(IPAexフォント)で日本語・和文が表示可能となるはずです。

$ cd /usr/pkg/share/ghostscript/バージョン/examples/cjk
$ gs gscjk_aj.ps
gsでサンプルgscjk_aj.psを表示
$ gs article9.ps
gsでサンプルarticle9を表示
$

 これは、gs(ghostscript)コマンドで表示したGhostscriptのサンプルで欧文・和文、縦組み・横組み、注釈(しおり?)のサンプルgscjk_aj.psとarticle9.psです。

 また、同じくサンプルのiso2022.ps、iso2022v.psについては、例えば、xtermから起動していれば、そこに足りないフォントが表示されていると思いますので、それらのフォントをすべて追加するか、マッピングすれば、すべて表示できるでしょう。

$ gs iso2022.ps
gsでサンプルiso2022.psを表示
$ gs iso2022v.ps
gsでサンプルiso2022v.psを表示
$
$ gs all_aj1.ps
...

Ghostscriptのビューに何やらエラーが
...
Error in /CIDFont findresource: HeiseiKakuGo-W5
...

$ cd ../../Resource/Init
$ sudo vi cidfmap
...
/HeiseiKakuGo-W5     /IPAexGothic
...

 [cjk]ディレクトリには、他にもajの付く日本語と思われるファイルがありますが、そのまま表示すると[/CIDFont]内に[HeiseiKakuGo-W5]がないといったような旨のエラーが表示されることでしょう。

 この場合も、やはり、[cidfmap]で定義したフォント(ここでは、IPAexフォント)とマッピングすれば表示されるようになります。

$ gs all_aj1.ps
gsでサンプルall_aj1.psを表示
$ gs all_aj2.ps
gsでサンプルall_aj2.psを表示
$

 この時、この手順通りにやっていて、例えば、xtermから起動している場合、xtermを見ると「CIDフォントであるIPAexGothicをエミュレートするために[/usr/pkg/share/ghostscript/fonts/ipaexg.ttf]からTT(TrueType)フォントを読み込んでいます。」といった旨のメッセージが表示されていることでしょう。

$ sudo mkdir /var/spool/lpd/ps
$ sudo chown daemon:daemon /var/spool/lpd/ps
$ sudo chmod 770 /var/spool/lpd/ps
$ sudo mkdir -p /usr/local/libexec
$ sudo vi /usr/local/libexec/psfilter
#!/bin/sh
printf "\033&k2G" && cat || exit 2
 
gs -dSAFER -dNOPAUSE -dBATCH\
-sPAGESIZE=a4 -sDEVICE=pdfwrite\
-sOutputFile=/home/foo/bar.pdf\
-q - && exit 0
exit 2
$ vi /etc/printcap
...
ps|Postscript_Printer:\
:lp=/dev/ulpt0:\
:sd=/var/spool/lpd/ps:\
:mx#0:\
:sh:\
:if=/usr/local/libexec/psfilter:\
...
$

 次に印刷ですが、そのためには、Postscript文書処理用に[/etc/printcap]にプリンタ設定を1つ追加、階段現象対策とPostscript対応プリンタでなくても印刷できるようにPDFに変換(、必要なら、そのまま印刷)する処理を書いたフィルタを1つ作成、さらに適切なグループ・ユーザー及びパーミッションを適切に設定したそれ用のスプールディレクトリを作成の上、[/etc/printcap]にそれらを指定し、PDFに出力した場合には、[$ lpr -P ps ...pdf]のようにして印刷します。

 [gs]コマンドでPDFに変換する場合には、[gs ...-sDEVICE=pdfwrite...-sOutputFile=xxx.pdf]のようにデバイスとして[pdfwrite]、出力ファイルとして保存したい任意のパス及び名称のPDFファイル(というか、まだ存在しないでしょうが、拡張子.pdfを持つファイル名)を指定します。

 印刷する場合には、[gs ...-sDEVICE=hpdj890c...-sOutputFile=%pipe%lpr]のようにデバイスとして利用するプリンタのドライバ、出力ファイルとしてパイプ[ | ]に変換される[%pipe%]に[lpr]としたり、[%stdout%]、もしくは、標準入力同様、[ - ](ダッシュ・ハイフン)として[-q - && exit 0]の[&& exit 0]の前にパイプ経由などで継続する処理を記述したりするなどします。

 なお、[/etc/printcap]の[ps]における[gs]の引数[-sOutputFile=]の右辺は、[~/]とすると処理できなかったので例のようにホームディレクトリとする場合には、[foo]を適切なユーザー名にします。

[訂正]

 階段現象対策において[&& cat]を入れ忘れていました。

 このcatがないとプリンタが対応に困って一向に印刷できませんでした。。。

 これを参考にしてハマってしまった方がいらしたとしたら、本当に申し訳ありませんでした。

$ xpdf gscjk_aj.pdf
xpdfでgscjk_aj.pdfを表示
$ xpdf all_aj1.pdf
xpdfでall_aj1.pdfを表示
$ xpdf all_aj2.pdf
xpdfでall_aj2.pdfを表示
$

 PDFは、gsでも表示できますが、ここでは、冒頭、Leafpadの印刷プレビュー用にインストールしたxpdfを使ってPDFを表示させてみます。

 これは、[gscjk_aj.ps]、[all_aj1.ps]、[all_aj2.ps]を[gs -sDEVICE=pdfwrite]を使って、それぞれ[gscjk_aj.pdf]、[all_aj1.pdf]、[all_aj2.pdf]に変換したものです。

 all_aj1.pdfについては、3ページめ、all_aj2.pdfについては、2ページめのスクリーンショットを撮ってみました。

$ mupdf article9.pdf
mupdfでarticle9.pdfを表示
$

 ただ、mupdfなら表示できますが、xpdfでarticle9.pdfを表示しようとするとエラーとなります。

 起動に使ったxterm上のエラー内容を見ると、どうやら「[Adobe-Japan1]に[V]なんて見つからないよ」といった旨のエラーのようです。

$ xpdf article9.pdf
xpdfでarticle9.pdfを表示
$

 これは古くから知られる症状のようでNetBSDなら[xpdf-japanese]パッケージ(他なら、これに類するものを)インストールすればよく、インストール後は、単に[$ xpdf article9.pdf]とすれば表示できます。

 ただ、一様に.psでは、旧字体だったものが、pdfでは、現代文字?に置き換わっていたり、.psでは、丸囲み数字の部分が、.pdfでは、丸と数字が別になっていたり、.pdfの方は、句読点の位置がどうやら横書き用の字形になっている模様だったりと違いがあります。

 この辺りは、フォントを精査するなどして必要なフォントを拡充させるなり、調整が必要となりますが、ここでは、スルーすることにします。

$ sudo vi /usr/local/libexec/psfilter
#!/bin/sh
printf "\033&k2G" && cat || exit 2
 
gs -dSAFER -dNOPAUSE -dBATCH\
-sPAGESIZE=a4 -sDEVICE=hpdj890c\
-sOutputFile=%stdout%\
-q - && exit 0
exit 2
$ lpr -P ps xxx.pdf
$

 PDFであれば、Postscript対応プリンタでなくても印刷でき、印刷するには、gsコマンドを使うとよいでしょう。

 とりあえずならコマンドラインからgsを実行しても構いませんし、lprを使うなら、先のps設定を書き換えるか、新たに追加するなどして、[-sDEVICE]には、プリンタドライバを、[-sOutputFile]には、[ - ]、[%stdout%]、[%pipe%lpr]([man gs]を参照)などを設定し、[lpr -P ps xxx.pdf]とすればよいでしょう。

[訂正]

 階段現象対策において[&& cat]を入れ忘れていました。

 このcatがないとプリンタが対応に困って一向に印刷できませんでした。。。

 これを参考にしてハマってしまった方がいらしたとしたら、本当に申し訳ありませんでした。

$ xpdf gscjk_aj.pdf
xpdfでgscjk_aj.pdfを表示
$ mupdf article9.pdf
xpdfでarticle9.pdfを表示
$

 上記は、Ghostscript 9.05での状況ですが、バージョンが9.06になったからなのか、以前できたときの設定と何か違うのか、再現できない状況になってしまいました。

 結構時間をかけてlpr/lpd、LPRng、CUPSと一通り、最初の記事を書き上げ、HTMLとしてバランスを整え、よし、あとはアップするだけ。。。と思った瞬間、作業中のWindows VistaマシンのHDDが壊れ、起動不能(PHOENIX BIOSにバックアップとHDD交換を促される状態)になり、手持ちの作業に使える現役Windowsマシンがなくなってしまったと同時に印刷に関する文書が消滅してしまい、急遽、前からOSを決めかねていたXPマシンをNetBSDに入れ替え、環境を整え、数時間後には物理マシンのNetBSD上で検証を再開するとともに改めて一から書き直したのですが、その物理マシン上のNetBSDにGhostscriptをインストールしてみたら9.06だったという状況です。

 ただ、はっきりしませんが、以前も何やかやで9.05と9.06が入れ替わってたことがあったような。。。いや、以前、9.05を使っていたとき、一度削除して再インストールした際、ごたごたしてインストールに成功したり、失敗したりしたことがあって、その時は、確実に9.06で、最終的に失敗したので9.05だと思い込んでいたのですが、その時に設定ファイルだけが9.05のまま残ってたから9.05だと思い込んでいただけで実は、そもそも9.06だったのかも・・・?

 以前と違う点は、思いつく限り下記の通りです。

  • gscjk_aj.pdfが、変換がps2pdfか[gs ...-sDEVICE=pdfwrite...]か、表示がxpdfかmupdfかに関わらず、まったく同じ状況で正常に表示できなくなった
    (本文の日本語と注釈・しおりの英語のみ表示され、本文中の欧文が表示されない)
     => 以前は、xpdfでもmupdfでも表示できた
  • article9.pdfが、変換がps2pdfか[gs ...-sDEVICE=pdfwrite...]か、表示がxpdfかmupdfかに関わらず、まったく同じ状況で正常に表示できなくなった
    (枠線内の右上に横書きで「本」が欠けており、かろうじて「日本」と判読できる状態)
     => 以前は、ps2pdfで変換した際に同様になったが、その時は、[gs -DEVICE=pdfwrite]なら正常に出力された
  • article9.pdfを表示しようとすると「[Adobe-Japan1]に[H]なんて見つからないよ」といった旨のメッセージが表示される
     => 以前は、[H]ではなく[V]でxpdf-japaneseを入れたら正常に表示されたが、今回はこれを入れても改善されない

 xpdf/mupdf何れも正常に表示できなくなり、症状が同様となったことは、ある意味、正しい挙動?

 幸いスクリーンショットはサーバに上げていたので残っており、(誰に急かされるわけでもないものの、)翌日、ここまで書き上げたのですが、急ぎすぎて途中何か抜けたところがあってそれが原因となっているのでしょうか?

Ghostscriptで画像の表示と印刷

$ gs /usr/pkg/share/ghostscript/バージョン/examples/tiger.eps
gsでサンプルtiger.epsを表示
$

 ページ上は、最後の方になってしまいましたが、先の事情に関わらず、Ghostscriptさえインストールすれば、欧文の表示、印刷同様、画像の表示もできるようになっています。

 スクリーンショットにおいて仮想マシン上のデスクトップが変わってますが、デスクトップ以前に仮想マシン自体が別物、何れもHDD容量が厳しく、2つの異なる仮想マシン上のNetBSDで検証した結果、こういうことに。。。やり直すハメになるなら新たに仮想マシンを作成してもよかったですが・・・

 Ghostscriptをインストールすると[/usr/pkg/share/ghostscript/バージョン/examples]以下に[.ps]、[.eps]、[.pdf]といった拡張子のついたファイルがいくつかあるので[gs xxx.ps]、[gs xxx.eps]、[gs xxx.pdf]などとすれば、それらを表示することができます。

マジックフィルタとapsfilter

 ここまでの過程でNetBSD上で欧文/和文及び画像のプレビューと印刷はできるようになりましたが、このままだと欧文印刷時と和文や画像(和文と画像の混合)印刷時でコマンドライン引数を変更し、使い分けなければならず、まして、そのたびに/etc/printcapを書き換えるとなると面倒この上ありません。

 それを解消する為に登場したのが、マジックフィルタです。

 マジックフィルタとは、lprでPオプションを指定しなくても単に[lpr file]とするだけで欧文テキスト文書かPostscript文書かを自動判別して必要な処理を行った上で印刷データをスプールディレクトリに投げてくれるものです。(後はlpdの仕事です。)

$ su -
password:
# pkg_add -v apsfilter
...
# exit
$

 NetBSD/i386には、マジックフィルタとしてapsfilterがパッケージリストにありますから、これをインストールします。

 インストールが終わるとxtermの画面上に[/usr/pkg/etc/apsfilter/apsfilterrc]がコピーされており、構成ファイルとして利用できそうなこと、それに加えて[/usr/pkg/share/apsfilter/SETUP]の実行を促すメッセージが表示されています。

apsfilterの印刷テスト結果をスキャナでスキャン

 実行してみるとシェルベースですが、対話式でapsfilterの初期設定ができるようになっています。

 進んでいくと[ ]や[r300x300]などがありますが、前者は何か設定ができること、後者は、初期設定値が入っており、変更もできることを表わしており、カーソルを合わせて[Enter]キーを押せば、設定画面に遷移し、画面上の案内に沿って[ESC]キーなどを押せば、元の画面に戻ったりするので適宜設定します。

 途中、テスト印刷もでき、紙面に印刷したものをSANEを使ってスキャナで取り込んでみたのがこの画像です。

 マジックとはいえフィルタですし、その役割からして[/etc/printcap]に設定できるスクリプトがあるに違いありません。

 そこでfindで探してみると複数ある中に[/usr/pkg/share/apsfilter/bin/apsfilter]と[bin]にある[apsfilter]が見つかるはずなのでそれを標準プリンタ設定lpの[if=](input filter)に設定します。

 その後、[lpr foo.txt]、[lpr bar.ps]、[lpr hoge.pdf]、[hogehoge.png]などとして印刷できれば、完了です。

備考

 当サイト検証では、プリンタにHP DeskJet 970Cxiを使っていますが、HPプリンタには、HPLIPやHPIJSといったプリンタドライバサポートがあり、NetBSD/i386のパッケージリストにも含まれています。

 これを利用すれば、より近いドライバを利用することもできますが、ここまでは、lpr/lpdの検証であり、プリンタの性能を発揮させることに主眼を置いていないこともあり、使用しませんでしたが、gsがサポートしている中で最も近そうなhpdj890cドライバでも十分、事足りました。

ウェブ造ホーム前へ次へ