(2005.3.11. 記)
いいかげんに Classic なんて捨てろよ、と思われるかもしれないが、Mac を日常の仕事道具として使っている以上そうもいかない場合が出てくる。常用しているソフトで、OS X 版が出る見込みのないやつとか、出ているけど重くて使いにくいとか、そういうのが結構あるんです。従って、Classic 環境は欠かせない。わりと最近まで Mac OS 9 で立ち上げているマシンも存在していた。この混在環境で、ちょっと悩まされたのがプリンタである。ネットワーク対応の Postscript プリンタは簡単なのだが、USB 接続の HP psc2150 でずいぶん苦労した。
これはあちこちで紹介されている有名なネタだし、うちの日記でも何度か取り上げているのだが、一応メモしておく。ポイントは、OS X 側で純正のドライバではなく hpijs と ESP ghostscript を使うことと、lpd (Line Printer Daemon) を走らせること。Hpijs は HP のプリンタ用のオープンソースのドライバだが、非常に優秀で、純正ドライバと比べて何の遜色もない。Lpd については、Mac OS 10.2 以降のプリントシステムは CUPS で、cups-lpd という簡易デーモンがついているので、これを生かしてやる。
以下、具体的な手順。
(1) ESP ghostscript と hpijs の最新版を上記リンクからダウンロードしてインストールする。
(2) プリンタ設定ユーティリティを立ち上げ、optionキーを押しながら「追加」をクリックし、ポップアップメニューから「詳細」を選ぶ。「装置」ポップアップメニューの一番下に "PSC 2150 Series" というのがあるはずなのでそれを選び、「プリンタの機種」を「HP」にしてリストから psc2150 を選ぶ。これで OS X から psc2150 に hpijs 経由でプリントする準備が整った。
(3) /etc/xinetd.d
に次の内容で printer
というファイルを作る(owner = root, group = wheel)。
service printer { disable = no socket_type = stream protocol = tcp wait = no user = root server = /usr/libexec/cups/daemon/cups-lpd server_args = -o document-format=application/octet-stream groups = yes flags = REUSE }
(4) xinetd を再起動。
% sudo killall -HUP xinetd
(5) 共有したいプリンタのキュー名を知るため、lpstat -v
でプリンタ名をリストする。"device for" の次に書いてあるのがキューの名前。10.3 の「プリンタ設定ユーティリティ」の「情報を見る」でも見ることができる。(10.2 の「プリントセンター」でもできたと思うが未確認)
(6) プリンタ記述ファイル (PPD) を OS 9 に持っていく必要があるので、/etc/cups/ppd
から対応するファイル(たぶん、上記のキュー名と同じ名前で .ppd
がついたファイルがあるはず)をコピーする。mi などで改行コードを Mac 形式に変え、ファイルタイプを 'TEXT' にしておく。このファイルを、印刷を実行する OS 9(または Classic 環境)マシンに持っていき、システムフォルダの「機能拡張/プリンタ記述ファイル」フォルダにコピーする。
(7) 印刷を実行する OS 9(または Classic 環境)マシンで「デスクトッププリンタ Utility」を立ち上げる。新規デスクトッププリンタの作成画面になるので、ドライバを LaserWriter8、リストから「プリンタ (LPR)」を選ぶ。プリンタ記述ファイルと LPR プリンタを指定する画面になる。プリンタ記述ファイルは先ほど入れたものを選ぶ。LPR プリンタは、OS X マシンの IP アドレスと、先に調べたキュー名で指定する。適当な名前をつけてデスクトッププリンタを保存する。OS 9 ならデスクトップにプリンタのアイコンが現れる。Classic 環境ではどこにも現れないが、Classic アプリケーションで印刷するときに、プリンタを選択するポップアップメニューの中にちゃんと出てくる。
両面印刷やレイアウト機能も含め、hpijs ドライバの全機能が使えるはず。ただ、カスタム用紙設定がうまくいかなかったことがあった。これは lpd を通しているからではなく、hpijs 自体の問題であったようである。最新版で改善されているかどうかは未確認。
設定をしくじっておかしくなってしまったら、OS 9 (Classic) の「システムフォルダ/初期設定/プリンタ初期設定」フォルダを捨てればよい。ただし、それまで作ったプリンタの設定は全部消えてしまう。
なお、psc2150 の純正ドライバでは未だに 10.3 では両面印刷ができないそうです。スキャナソフトも出来は良くないし、HP の Mac 対応はお粗末なものです。初代 DeskWriter に感動したオールド Mac ファン(なんて言ったら本物のオールドファンにお叱りを受けそうだが)としては寂しい限り。まあ、一時 USB への移行期あたりでは Mac ドライバを出してなかった時期もあったぐらいだし、今は曲がりなりにも OS X には対応しているのだからまだマシだと思うことにしている。それでも、HP のハードウェアは好きなのだけどね。
実はこちらの方がやっかいだった。上のセットアップがうまくいくのなら、同じマシン上の Classic 環境から印刷するには IP アドレスを 127.0.0.1 にしてやればよさそうなものだが、これはうまくいかない。理由はよくわからない。仕方なく、LaserWriter8 や AdobePS ドライバを使って Postscript ファイルを作り、それをターミナルから lp
コマンドで印刷する、という荒技を使っていた(参考:2003/10/24の日記)。一応使えていたのだが、何となく手数が多くて面倒だし、あちこちに使い終わった Postscript ファイルが散乱するのも見苦しい。また、両面印刷とかレイアウト機能を使うときは lp
コマンドに手でオプションを打ち込むことになり、それがまた覚えにくいのでいちいち CUPS のオンラインマニュアルで確かめる、といういかにも UNIX 的なことをやっていた。よく一年以上続いたものだ…
なんとかならないものかといろいろ探していたら、最近の Mac OS X Hints に Print from Classic using native OS X printer drivers という投稿があった。これこそ求めていたものである。アイデアは、LaserWriter8 または AdobePS ドライバを使って作成した Postscript ファイルを特定のフォルダに保存し、そのフォルダに AppleScript のフォルダアクション(10.3 で復活した!)を添付して、フォルダに入ってきたファイルを OS X ネイティブのプリンタドライバに渡す、というものである。
投稿そのままでは、いちいちプリンタを手で選ばないといけなかったりして二度手間なので、少し自分なりに改良した。手順は以下の通り。
(1) ホームの「ライブラリ」フォルダの中に Scripts
フォルダを(なければ)作り、その中に Folder Action Scripts
フォルダを作る。
(2) スクリプトエディタ(ルートの「アプリケーション」中の AppleScript
フォルダにある)を開き、このスクリプトを「開く...」で読み込んで、「スクリプト」形式で先ほどの Folder Action Scripts
フォルダに適当な名前(たとえば "classic print.scpt"
)で保存する。
(3) Scripts
フォルダにこの Perl スクリプトを classic_print_wrapper
という名前で保存し、chmod +x
しておく。
(4) 「ホーム→ライブラリ」フォルダに Classic Print
というフォルダを作り、その中に PSC 2150 Series
というフォルダを作っておく。このフォルダの名前は、プリンタ設定ユーティリティでつけた名前(キュー名ではない)と合わせておく。(より正確に言うと、~/Library/Printers/
の中にある各プリンタに対応するアプリケーションの名前と合わせておく。)
(5) Finder で PSC 2150 Series
フォルダのコンテキストメニューを開き(コントロール+クリック)、「フォルダアクションを使用可能にする」を選ぶ。もう一度コンテキストメニューを開き、「フォルダアクションを設定...」を選び、フォルダとして PSC 2150 Series
、スクリプトとして classic print.scpt
を選ぶ。
(6) Classic 環境で「デスクトッププリンタ Utility」を立ち上げ、ドライバを LaserWriter8、リストから「変換 (Postscript)」を選ぶ。プリンタ記述ファイルと保存先フォルダを指定する画面になる。プリンタ記述ファイルは 1. と同様に /etc/cups/ppd
から取り出して改行コードとファイルタイプを変更/設定して「システムフォルダ→機能拡張→プリンタ記述ファイル」に入れておき、それを選択する。保存先フォルダは「ホーム→ライブラリ→Classic Print
→PSC 2150 Series
」を指定する。適当な名前をつけて保存する。
(7) Classic アプリケーションから印刷するには、プリンタとして (6) で作ったデスクトッププリンタを選んで、ファイルの保存先として「ホーム→ライブラリ→Classic Print
→PSC 2150 Series
」を選ぶ(1回目はこれがデフォルトで出てくるが、必ずしもこのフォルダの位置を覚えていてくれるわけではないらしい)。「保存」を押すと Postscript ファイルが書き込まれ、やがて OS X のプリンタドライバが立ち上がって印刷が始まる。印刷が正常に終了すると Postscript ファイルは自動的に消される。
(8) 技術的な補足をいくつか。
classic print.scpt
は、フォルダアクションとして設定されたフォルダに新しいファイルが作成されると起動される。フォルダと同じ名前のプリンタを ~/Library/Printers/
の中で探し、見つからなければエラーメッセージを出して終了する。見つかれば、プリンタ名(=フォルダ名)と新しいファイルのリストを classic_print_wrapper
に渡す。classic_print_wrapper
は、各ファイルについて %%EOF という文字列が現れるまで待ち、現れたらこのファイルを ~/Library/Printers/printer_name.app
というアプリケーションに渡す。このアプリケーションは、プリンタ設定ユーティリティでプリンタ名をダブルクリックしたときに立ち上がるもの。/tmp/user_id/TemporaryItems/
の中にこのファイルへのハードリンクを作ってから削除する。このフォルダは一時ファイルの置き場なので、そのうち自動的に消されるはず。(どのタイミングで消されるかは知りませんが…)