こんにちは。流れのプリンター愛好家ことおがさわらなるひこと申します。プリンターのことしかわからない変わり者ですが、どうぞよろしくお願いします。
新年度も始まり、新しい環境での生活をスタートされた方も多いかと思います。配属先や研究室などで楽しいUbuntu生活を送るためには、所属先にあるいろいろな機器、例えばプリンターなどを使えるようにしたいですよね。……という書き出しは第218回 からのコピペです。
さて、1年前のRecipeではUbuntuで最初からサポートされているPostScriptやその他Ghostscriptが標準でサポートしているプリンターの使い方を説明しました。今回は、そうでないプリンターしか手元にない、けれどもUbuntuから印刷したい場合、Windowsを踏み台にして「まるでそのプリンターがPostScriptプリンターであるかのように」Ubuntuから印刷する方法をご紹介します。第218回の知識と補完する形になるので、できれば両方お読みいただけると幸いです。
なお筆者の所有するWindows環境はWindows 7 Home Premium 64bit版になります。エディション違いや32bit版、Vistaでも多分同様の操作で実現できると思います。残念ながらWindows 8での操作は確認できませんでしたので、各自お試しになって結果をお知らせください。
用語の確認
ここは第218回の復習になりますが、念のためもう一度ご説明しましょう。
Ubuntuの印刷システムがCUPSというソフトウェアを中心にしているのは、みなさまもご存知かと思います。ここで詳しくは説明はしませんが、次のことを抑えておきましょう。
CUPSベースの印刷システムはAdobe社のPostScriptやPDFを内部データとして使っている
CUPSはそれぞれのプリンターごとに、「 PPD」と「印刷データフィルター」の組を管理している。併せてプリンタードライバーと呼ぶ(こともある)
PPDとはプリンターごとに、印刷について設定する項目と、それぞれの項目の選択肢を記述するファイル
印刷データフィルターはCUPSの内部データから、プリンターが解釈することができる画像を示すデータ(PDL)に変換するモジュール
システムメニューから「システム設定」を選んで、「 プリンター」をクリックすると表示されるダイアログ「プリンター - localhost」は、system-config-printer(通称SCP)という名前のプログラムです[1] 。プリンターを追加したり設定したりするときにはSCPを活用することになります。
[1] 実はUbuntuの上流であるGNOME 3では、プリンターの設定を行うプログラムを新たに再設計しています。しかしUbuntuではSCPに色々と手を加えていることもあって、当面SCPを利用し続けることになっています。本稿執筆時点で追い込みに入っている13.04でも、当初は機能のいくつかをGNOME側に移植してGNOMEの印刷設定モジュールを使おうという議論もあったのですが、結局SCPを継続して利用することに決まりました。
図1 system-config-printerを起動した画面
それから、ちょっとややこしいのですが、先に述べた「PPD」と「印刷データフィルター」の組である「プリンタードライバー」というソフトウェアをインストールすることと、それらを使ってプリンターを利用できるようにすることは、厳密にいえば異なる操作です。この記事では前者を「ドライバーのインストール」 、後者を「プリンターの追加」と呼びます。
また、今回はWindows側を踏み台にして印刷を行うことになるので、そちらのほうも確認しておきましょう。
Windowsの場合はCUPSベースの印刷システムと違い、アプリケーションからの描画指定に対して、GDIというモジュールを介して「プリンタードライバー」( 注2 ) が呼ばれ、プリンターが解釈可能なデータが生成されます。
生成したデータを実際にプリンターに届けるために、Windowsスプーラーでは「ポート」という概念を用意しています。通常は、1つのポートは1つの物理的なプリンターに対応します[3] 。いくつかあるポートは、その「種類」によって「ポートモニター」と呼ばれるモジュールが管理します。例えば「標準TCP/IPポート」などはWindows標準のポートモニターですし、特別な種類のポートを作成・管理するために、専用のポートモニターを自前でインストールすることもできます(今回はこの操作を行います) 。
[3] 古典的には、ポートはプリンターにではなく「プリンターに情報を流すPC側の出口」に対応していました。具体的にいえば、IEEE 1284ポート(俗にいうパラレルポートとかセントロ、セントロニクスと呼ばれるもの)です。これらは先にどんなデバイスつながっているかを関知せず、データの受け渡しだけを標準化しています。今でもWindowsはソフトウェア的にはこれらを標準でサポートしており、LPT1などといった「ポート名」が存在しています。USBなどが「つながっている物理的な場所」ではなく「つながっているデバイス」で認識されているのとは大きく異なります。
ここで注意したいのは、異なるOSのプリンター共有においては、クライアント側ですべての印刷データを作成し、サーバー側のプリンタードライバーは使われない(プリンターポートからの出力だけ用いられる)ということです。つまり、例えばUbuntuからWindowsのプリンターに印刷する場合は、Windows側で使われるのはスプーラーとポートモニター(とその管理下にあるポート)だけということになります。
ちょっと言葉だとわかりにくいので簡単な説明図を描いてみました。
図2 Windowsの印刷システムにおけるポートモニターとポート
今回やりたいことの確認
今回のRecipeでやりたいことをもう一度、いままで説明してきた概念を用いて振り返ってみます。
ある程度自由にできるWindowsマシンを1台用意します。そのWindowsマシンは印刷可能なプリンターアイコンを持っていなければなりません。
Windows版のGhostscript をインストールし、そのWindowsマシンでPostScriptをレンダリングして印刷可能にします。
特別なポートモニター「Redirection Port Monitor(RedMon) 」をインストールします。名前のとおり、「 ポートモニターとして印刷データを受け取って、それを何か別のものにリダイレクトする」ポートモニターです。今回はこれを使ってGhostscriptを動かすことを狙っています。
RedMonをポートとする適当なプリンターアイコンを1個作り、それを適当な共有名をつけて登録します。
Ubuntuからの作業は、このプリンターを共有して、WindowsにPostScriptの印刷データを流せるように設定するだけです。
実はWindowsの作業のほうが長くなってしまうのですが、一度共有プリンターを作ってしまえばネットワーク内のすべてのUbuntuから印刷が可能になるので効果は大きいです。
この方法は実のところ、比較的古くから知られていたのですが、鍵となるモジュールであるRedMonの開発がしばらくの間、停止しており、そのために64bit環境とVista以降のOSでは利用できない状態が続いていました。2012年6月に長い空白を破ってRedMonがバージョンアップしたので、今回ご紹介できるようになったというわけです。
Windowsマシンの用意
今回のRecipeでは、Ubuntuと、ネットワーク共有できるWindowsマシンが1台必要になります。読者の皆さんはそのWindowsマシンに管理者権限を持っていて、なおかつWindows Vista以降の場合は、UAC(ユーザーアカウント制御)を一時的にオフにできる必要があります。具体的に言えば、次のことができなければなりません。
アプリケーション(Ghostscript、RedMon)のインストールができる
印刷できるプリンターアイコンを持っている、あるいは作ることができる
そのプリンターアイコン以外に、自分でプリンターアイコンを追加できる
追加したプリンターアイコンを「共有」できる
自分のデスクトップのPCについては管理者権限を与えている組織も多いとは思います。しかし、Active Directoryによる集中管理を行なっており、一般ユーザーにはアプリケーションの追加・削除も禁止しているような組織も少なからずあります。そういった場合、組織の中で相談して、ネットワーク上で見えるどこかに、今回のRecipeで紹介するようなプリンターアイコンを追加させてもらうことができるかどうか確認しましょう。
なお、物理的にマシンが足りなくても、WindowsのライセンスとIPアドレスが1つずつあれば、Ubuntuマシン内にWindowsの仮想マシンを1台分立てて、それをBridgedネットワークで直接外に見せることで同じことができます。逆に、組織のポリシー上Windowsを使うことが必須であっても、仮想マシンでUbuntuを使うことが禁止されていなければ、その「親マシン」であるWindowsを今回のRecipeに用いて、Ubuntu側のネットワークをBridgedにすれば、仮想マシン上のUbuntuから親マシンのWindowsを経由して印刷は可能です[4] 。
以降の手順で最終的に印刷したいプリンターのアイコン名[5] が必要になります。ここでは筆者の環境にあわせて“ Brother DCP-J940N Printer” として説明しますが、実際のプリンター設定によって適宜読み替えてください。
[5] 実際に印刷したいプリンターをWindowsの「デバイスとプリンター」で見たときに、そのプリンターアイコンの直下に表示されている名称のことです。右クリックしてプリンターの「プロパティ」を表示し、「 全般」タブの一番上にあるテキストボックスの値からコピー&ペーストすることで確実な名称を得ることができます。
Windows版のGhostscriptのインストール
Ghostscriptは、Artifix社が開発しているPostScript互換インタープリターです。GNU Affero General Public License (AGPL)/Artifix Commercial Licenseのデュアルライセンスですが、今回の利用であればAGPLで困ることはないので、自分のWindowsが32bitか64bitかに合わせて、Ghostscript 9.07 for Windows(32 bit)か同(64 bit)の適切なほうを選んでダウンロードしましょう。
ダウンロードしたファイルは*.exeの実行可能形式になっているので、右クリックで「管理者として実行」を選んで実行しましょう(図3) 。
図3 Ghostscriptのインストーラー起動
基本的にはウィザードの通り進んで行けばよいのですが、最後のところの「Generate cidfmap for Windows CJK TrueType fonts」はオンにしておきましょう(図4) 。
図4 ここの上のチェックボックスをオンに
インストールが正常に終わったかどうか、コマンドラインを起動して、以下のように確かめてみます(筆者の環境はWindows 7 64bitなので実行ファイル名がgswin64となっています) 。
C:\Users\naruhiko>cd "\Program Files\gs\gs9.07"
C:\Program Files\gs\gs9.07>dir
ドライブ C のボリューム ラベルは Windows7_OS です
ボリューム シリアル番号は XXXX-XXXX です
C:\Program Files\gs\gs9.07 のディレクトリ
2013/04/06 19:40 <DIR> .
2013/04/06 19:40 <DIR> ..
2013/04/06 19:40 <DIR> bin
2013/04/06 19:40 <DIR> doc
2013/04/06 19:40 <DIR> examples
2013/04/06 19:40 <DIR> gs
2013/04/06 19:41 <DIR> lib
2013/04/06 19:40 60,398 uninstgs.exe
2013/04/06 19:40 <DIR> zlib
1 個のファイル 60,398 バイト
8 個のディレクトリ 190,994,268,160 バイトの空き領域
C:\Program Files\gs\gs9.07>cd bin
C:\Program Files\gs\gs9.07\bin>gswin64 ..\examples\tiger.eps
GhostscriptのexamplesフォルダーにはPostScriptやEncapsulated PostScript(EPS)のサンプルがいくつかおいてあるので、適当に開いてみましょう。Ghostscriptにファイル名だけを指定すると、レンダリング結果は画面に表示されます。図5はtiger.epsを開いたところです。
図5 tiger.epsを開いてみたところ。正しく表示されている
次に、Windows版Ghostscript専用の「ドライバー」であるmswinpr2が正しく動くか確認します。このドライバーは「Windows GDIを叩いてプリンターに出力する」という特別なドライバーです。さきほどに引き続いて、次のようにタイプしてください。
C:\Program Files\gs\gs9.07\bin>gswin64c -sDEVICE=mswinpr2 -dNoCancel -dSAFER -dBATCH -dNOPAUSE -sOutputFile="%printer%Brother DCP-J940N Printer" ..\examples\tiger.eps
-sOutputFileの“ %printer%” に続くプリンター名は皆さんの環境で印刷したいプリンターアイコン名で適宜置き換えてください。もし、印刷したいプリンターがそのWindows環境のデフォルトプリンターならば、-sOutputFileの指定自体を省略できます。これで先ほど表示された虎の絵がプリンターから正しく出力されたらGhostscriptのインストールは成功です。
なおGhostscriptのbinフォルダーの下にはgswinNN.exeとgswinNNc.exeとがありますが(NNは32ビットか64ビットか) 、基本的にはgswinNNc.exeを使うもの、と思ってください。gswinNN.exeは対話モードやエラー出力を別ウィンドウに出すもので、過去の互換性のために残っています。
RedMonのインストール
RedMonの配布ページ に最新版のバージョン1.9のダウンロードリンクがあります。ここからZIPファイルをダウンロードして、適当な方法で解凍しましょう[6] 。なおバージョン1.7へのリンクもありますが、これはWindows 7や64ビット版に対応していないので古い環境を利用する人向けです。
[6] 筆者が試したところ、ExplorerのZIP解凍機能を用いると一部のファイル(具体的にはヘルプファイル)が正常に解凍できないということがあったので、もしうまくいかないようだったら別の解凍方式を試してみてください。
解凍したフォルダーにあるインストール用ファイルのうち、自分の環境にあったほう(筆者の場合は64ビット版)のインストーラを右クリックで「管理者として実行」します(図6) 。
図6 RedMonを展開したフォルダーでインストーラを実行
基本的にはYesで答えていけばOKなはずです。
ダミープリンターの作成
ここで、RedMonを使ってGhostscriptに出力する架空のポートを用いて、UbuntuからPostScriptを受け取って印刷する「ダミーのプリンター」を作ります。
一点注意が必要なのは、Windows Vista以降のOSを利用している場合、通常はUAC(ユーザーアクセス管理)がオンになっていると思いますが、この状態だと「ポートの作成」や「ポートの設定」が一切禁止された状態になっています。つまりRedMonでポートを作ったり、そのポートを設定することができません。そこで、この操作を行う間だけでも、UACをオフにしておく必要があります。
UACをオフにする方法は、コントロールパネルから「ユーザーアカウント」で自分自身のアカウントの「ユーザーアカウントの制御設定の変更」を選び、その先で出てくるダイアログのスライダーを一番下まで引き下げます(図7、図8) 。
図7 ユーザーアカウントの制御設定の変更をクリック
図8 スライダーを一番下まで引き下げる
ここで一度再起動を要求されるので、Windowsを再起動してください。
再び起動してきたら、スタートメニューから「デバイスとプリンター」を選び、「 新しいプリンター」をクリックします(図9) 。
図9 新しいプリンターの追加
すると「ローカルプリンターの追加」と「ネットワーク・ワイヤレスプリンターの追加」と出てきます。今回はRedMonポートなので「ローカルプリンターの追加」を選びます[7] 。すると今度は「プリンターポートの選択」という画面になりますが、今回はGhostscriptにリダイレクトするポートを新たに作成するので「新しいポートの作成」を選び、ポートの種類として「Redirected Port」を選んで「次へ」を押します(図10) 。するとポート名を入力するダイアログが出ますがこれはデフォルトの「RPT1」でよいでしょう。さらに進んでください。もしここでエラーが出るようならUACが無効になっていないためポート作成に失敗しているかもしれません。改めてチェックしてみてください[8] 。
[7] 今回は関係ないですが、ここはWindows独特の用語なので気を付けたいです。Windowsでは「ネットワーク共有」で接続されないプリンターは「ローカルプリンター」とされます(別の言い方をすれば、ローカルのポートモニターを用いるプリンターはローカルプリンターです) 。ですからPort 9100やIPPといった、PCとプリンターが直接ネットワーク越しに通信するようなものであっても、あくまでも「ローカルプリンター」ということになります。
[8] UACの無効化がどうしてもうまく行かない場合、かなり強引な方法ですが、次のような方法があります。➀Ctrl+Alt+Delでタスクマネージャーを出します。➁プロセス一覧でExplorerを探して、プロセスを停止します。➂最初のタブに戻って「新しいタスク」をクリックし、「 選択...」を押してファイル選択の画面を出して、C:\Windowsに移動してexplorer.exeを見つけ、右クリックで「管理者として実行」で起動します。コントロールパネルはExplorerの権限を引き継ぐため、「 プリンターとデバイス」以下の操作も管理者権限で動くことになります。
図10 Redirected Portの新規作成を選ぶ
ポート作成が終わったら、今度はそのポートに出力するプリンタードライバーの選択になります。先ほど述べたとおり、今回の使い方では利用されるのはポートだけであって、プリンタードライバーは使わないためなんでも構いません。ここではGenericから「Generic/Text Only」を選びました(図11) 。
図11 プリンタードライバーの選択。なんでも構わないのでWindows標準の物を選ぶ
プリンター名はなんでも好きなものをつけてもらってよいですが「普段は使わないもの」とはっきりわかるようにしておいたほうが混乱がなくて良いでしょう。「 プリンターの共有」は当然オンにして、共有名はUbuntuから見えるようなわかりやすいものにします。今回は「DummyPS」としました(図12) 。
図12 プリンター共有の設定
さてダミーのプリンターができたところで、今度はリダイレクトポートRPT1の設定をしなければなりません。「 デバイスとプリンター」を再び開いて、先ほど作ったプリンターのアイコンを右クリックしてプリンターの「プロパティ」を開きます。タブ3枚目の「ポート」を選び、「 ポートの設定」をクリックしてください(図13) 。するとRedMonの設定画面が開きます(図14) 。
図13 プリンターのプロパティ「ポート」
図14 RedMonの設定画面。ここでGhostscriptにデータを送る設定を行う
「Redirect this port to the program:」には、当然今回はGhostscriptを選びます。「 Browse」でgswinNNc.exeを探して選んでください。通常のインストールならばC:\Program Files\gs\gs9.07\bin以下にあると思います。
「Arguments for this program are:」はGhostscriptに与える引数です。先ほどmswinpr2をテストしたときの結果を元に、次のように書いてください。
-sDEVICE=mswinpr2 -dNoCancel -dSAFER -dBATCH -dNOPAUSE -sOutputFile="%printer%Brother DCP-J940N Printer" -
最後に“ -” が入っています。見落としがちですが、これはRedMonから標準入力経由でデータを受け取ることを意味するので忘れないでください。また前述の通り、-sOutputFile……の“ %printer%” 以降はそれぞれの環境に合わせて書き換えていただく必要があります。デフォルトプリンターに出力したい場合は-sOutputFile……まるごと省略可能ですが、明示的に指定しておいたほうが安全かと思います。
ほかのオプションはそのままで構いません。これでようやっと、ダミープリンターの設定が終わりました。
Windowsのほうの作業はこれで終わりです。UACの設定を元に戻しておくのを忘れないようにしましょう。
Ubuntu側の設定
さて、いよいよUbuntuのほうの設定です。当然ですがWindows側とネットワーク的に接続できることを確認しておいてください。
システム設定から「プリンター」の画面を開けて、左上の「追加」ボタン(図15)を押下してプリンター追加の画面に行きます。「 ネットワークプリンター」のプルダウンを開いて(多分)一番下にある「Samba経由のWindowsプリンター」を選択してください(図16) 。ここで共有プリンターを選びます。「 閲覧...」を押すと、このPCからアクセスできるワークグループが開きます[9] 。
図15 system-config-printerの「追加」ボタン
図16 ネットワークプリンターの「Samba経由のWindowsプリンター」を選ぶ
筆者の環境ではWindowsマシンが1台しかないワークグループ構成なので、表示は図17のような感じになります。Windowsマシンの共有名をクリックして中を覗いてみましょう。共有リソースへのアクセスなのでログインが要求されますので、適切なログイン名とパスワードを入力してください。その結果は図17のような感じになるはずです。
図17 ワークグループを閲覧したところ。1台マスクしているのはプリンターのSMB共有用
ここで先ほど共有名として選んだ「DummyPS」を選んで「OK」で戻ると、先ほど表示された「Samba経由のWindowsプリンター」のURIのところに値が入った状態になっています。このまま終了でも良いのですが、ネットワークリソースにアクセスに行く(=印刷する)たびにパスワードを入力するのも面倒なので、「 詳細な認証情報を入力する」で入力しておきましょう(図18) 。
図18 SMBプリンターを選択したところ。認証情報も入力しておく
あとはごく普通のプリンター設定です。PPDの選択のところでは「Generic」-「PostScript」-「Generic PostScript Printer Foomatic/PostScript [en]」を選んでおけば良いでしょう。プリンター名称はなんでも構いませんが、「 Windows経由で印刷するダミーのプリンター」ということがはっきりする名前にしたほうが良いと思います。
ここまでくれば終わりです。テストプリントをしてみて、正しくインストールできたか確認してみてください。
まとめ
Redirection Port Monitor(RedMon)とGhostscriptを用いて、Windowsを踏み台にしてUbuntuから印刷する方法を紹介しました。
ただ、お気付きかもしれませんがこの方法には1つ大きな欠点があります[10] 。それは、プリンターの設定をUbuntu側から簡単にコントロールする方法がないことです。ちょっと醜いやり方ではありますが、リダイレクト先のプリンターアイコンをたくさん作っておき(通常、両面用、モノクロ印刷用、など) 、それぞれのリダイレクト用ダミープリンターを用意して、Ubuntu側にも同じだけプリンターアイコンを並べる手がありますが、あまり良い方法ではありません。ここを解決できるスマートな方法があれば良いのですが……。
それでも、Ubuntuからは通常印刷できないプリンターを利用できるというメリットは絶大なものがあります。少々手間はかかりますが、ぜひ挑戦して、新しい環境の楽しいUbuntuライフに印刷という1ページを加えてもらえればと思います。