2013-06-03

Surface RTでネットワークプリントができない時の力技

私の家では、Windows 8にCanon iP4700をぶら下げてネットワーク共有しています。
ところがSurface RTからはネットワークプリントが

できません( ゚Д゚)

「ホームグループ参加すると自動的にプリンターが表示されるのでSurface RTでも問題ないネ!」というデバイスの神様に愛された方もいるようですが、私の家の神様は気まぐれなのか

表 示 さ れ ま せ ん (  ゚ Д゚ )

もちろんプリンターをUSBで接続すると、インボックスドライバーが適用されます。しかし、同じプリンターをネットワークプリンターとして追加しようとすると、対応ドライバーが見つからない、というエラーが出てしまうのです(インボックスドライバーの適用すらできません)。当然CanonはRT用ドライバーなど配布していません。

そもそもCanon iP4700のWindows RT用ドライバーは海外仕様で、L版もはがきもプリントできないとか、縁なし印刷オプションがないとか、クオリティ変えられないとか、きちんとローカライズされたx86用のソレと比べて著しく機能が劣っているのですが、機能不全の状態は気持ち悪いのでなんとかしましょう。



下準備

  • ネットワークプリンターを共有しておく
  • Surface RTから上記ネットワークプリンタのあるサーバーないしPCへアクセスできるように、資格情報を保存しておく(アカウントとパスワードを都度問い合わせられないようにしておく)

概要

  1. インボックスドライバーを使ってプリンターを手動で追加する
  2. プリンターを追加する際、PRNファイルを保存するローカルポートを作成する
  3. PRNファイルをネットワークプリンターにコピーするバッチを作成する
  4. イベントビューアーでPrintService/Operationalを有効にする
  5. タスクスケジューラーでイベントID307をトリガーにしてバッチを起動させる

詳細手順

  1. インボックスドライバーを使ってプリンターを手動で追加する

    コントロールパネルの「ハードウェアとサウンド」を開き「プリンターの追加」をクリックするとプリンターを一所懸命探し始めるので、「探してるプリンターはこの一覧にはありません」をクリックして止めてあげる

    漢らしく「ローカルプリンターまたはネットワークプリンターを手動設定で追加する」を選択して「次へ」をクリック

  2. プリンターを追加する際、PRNファイルを保存するローカルポートを作成する

    「新しいポートの作成」を選択して「次へ」をクリック

    【重要】ポート名にスプールファイルの保存場所とファイル名をフルパスで入力して「OK」をクリック

    ※例えばローカルTempならば「C:\Users\(ユーザー名)\AppData\Local\Temp\(任意のファイル名)」と入力します。ファイル名は都度変えることはできません(というか都度ファイル名を指定する意味はあまりないし、煩わしい)ので自由かつ他のファイルと被らなさそうな名前にしてください。ちなみに私は「networkprint.prn」としています。

    プリンタドライバーを選択して「次へ」をクリック

    ※プリンター名が海外での名称です、カンで選びましょう。

    プリンター名を入力して「次へ」をクリック

    何もせず「完了」をクリック

    ※テストページの印刷をしても印刷されませんが、スプールファイルの出力の確認には役に立ちます。押してみて、上で設定したフルパスにファイルが作成されていることを確認してみるといいでしょう。

  3. PRNファイルをネットワークプリンターにコピーするバッチを作成する

    以下のコマンドのバッチファイルを作成し、「print.bat」などの名前で保存します。作成したバッチファイルは実行可能な場所ならどこに保存しても構いませんが、私はUsersフォルダのパブリックの下に「Program」フォルダを作成して保存するようにしています。

    -- ここから --
    @echo off
    set prndatapath="C:\Users\(ユーザー名)\AppData\Local\Temp\(任意のファイル名)"
    set printerpath="\\homeserver8\Canon iP4700"
    if exist %prndatapath% goto printspool
    goto end
    :printspool
    for %%a in (%prndatapath%) do set sizechk1=%%~za
    ping -n 3 127.0.0.1 > nul
    for %%b in (%prndatapath%) do set sizechk2=%%~zb
    if %sizechk1%==%sizechk2% (
    copy /b %prndatapath% %printerpath%
    del %prndatapath%
    goto end
    )
    goto printspool
    :end
    -- ここまで --

    ※2行目のprndatapathには2.で保存したファイルの絶対パスを、3行目のprinterpathにはネットワークプリンタのパスをそれぞれ入力します。

    ※:printspoolのfor~とかif~は、万が一プリントスプールが完了していないうちにバッチが走ってしまった時のためのウェイトです。実際は、プリント完了のイベントをトリガーにしてバッチを実行しているため、スプール途中でバッチが走ることはありませんが、バッチ単体で実行するという使い方も想定し、こういう処理にしています。無駄な処理が嫌いな方はcopy~とdel~の2行だけでOKのはずです。
  4. イベントビューアーでPrintService/Operationalを有効にする

    コントロールパネルの「システムとセキュリティ」を開き「イベントログの表示」をクリックしてイベントビューアーを開いたら、「アプリケーションとサービスログ」→「Microsoft」→「Windows」→「PrintService」→「Operation」を選択して右側の「操作」ペインで「ログの有効化」をクリック


  5. タスクスケジューラーでイベントID307をトリガーにしてバッチを起動させる


    コントロールパネルの「システムとセキュリティ」を開き「タスクのスケジュール」をクリックしてタスクスケジューラを開いたら、右側の「操作」ペインで「タスクの作成」をクリック


    「全般」タブにタスクの名前を入力

    ※ユーザー権限で十分ですが、念のため上の画面では「最上位の特権で実行する」にチェックをつけ「構成」で「Windows RT」を選択しています。


    「トリガー」タブをクリックし、「新規」をクリック


    「タスクの開始」から「イベント時」を選択し、「ログ」に「Microsoft-Windows-PrintService/Operational」、「ソース」に「PrintService」をそれぞれ選択、「イベントID」に「307」を入力して「OK」をクリック


    「操作」タブをクリックして、「新規」をクリック


    「参照」をクリックし、3.のバッチファイルを選択して「OK」をクリック


    「条件」タブをクリックして、「コンピューターをAC電源で使用している場合のみタスクを開始する」のチェックを外す

    ※Surface RTを複数のネットワーク環境で利用する場合は、「次のネットワーク接続が使用可能な場合のみタスクを開始する」のチェックを付けてSSIDを選択しておけば、ネットワークプリンターのない環境で不用意にタスクを走らせずに済みます。


    最後に「設定」タブを確認して、「OK」をクリック
これで、作成したネットワークプリンターに印刷を実行すると、PRNファイルが作成され、印刷完了のイベントをトリガーとしてタスクスケジューラーがPRNファイルをネットワークプリンターにコピーするバッチを実行し、印刷されるようになります。

0 件のコメント: