印刷時のスプーリングについて
こんにちは、A尾です。
前回と前々回のブログでは、早速 K里さん、なおきお~さんから Windows 7 のお話をしていただきましたが、私からのプリンタ ネタについては、しばらくは昔の Windows からあるような基本的な内容についてお話させていただく予定です。よろしくお願いいたします。
今回は、印刷時に使用される2つのスプーリング方法についてお話させていただきます。
具体的には、NT EMF スプーリングと RAW スプーリングの2つとなりますが、これらにはどのような違いがあるのでしょうか。まずは NT EMF スプーリングから見ていきましょう。
■ NT EMF スプーリング
①アプリケーション印刷処理開始
↓
②プリンタデバイス コンテキストへの描画のため、アプリケーションが GDI API を呼び出す
↓
③呼び出された API とそのパラメータから、GDI が WinSpool 経由で NT EMF スプール ファイルを作成する
↓
④アプリケーション印刷処理終了
↓
⑤プリントプロセッサが NT EMF スプール ファイルを再生する
↓
⑥ NT EMF レコードの内容を基に、GDI がプリンタ デバイス コンテキストへ描画を行う
↓
⑦プリンタドライバの DDI 関数が呼ばれる
↓
⑧プリンタドライバがプリンタ言語に基づいて RAW データを生成する
↓
⑨ランゲージモニタが必要な処理を行う(もしあれば)
↓
⑩ポートモニタが、プリンタ ポートの種類 (USB, TCP/IP etc) に合わせて出力処理を行う
↓
⑪カーネルモード ドライバに RAW データが通知される
↓
⑫プリンタに RAW データが通知される
文章だけではわかりづらいので図も入れてみましたが、以上が NT EMF スプーリング時のシーケンスとなります。それでは細かいことは置いておいて、続けて RAW スプーリングを見てみましょう。
■ RAW スプーリング
①アプリケーション印刷処理開始
↓
②プリンタデバイス コンテキストへの描画のため、アプリケーションが GDI API を呼び出す
↓
③ GDI がプリンタ デバイス コンテキストへ描画を行う
↓
④プリンタドライバの DDI 関数が呼ばれる
↓
⑤プリンタドライバがプリンタ言語に基づいて RAW データを生成する
↓
⑥アプリケーション印刷処理終了
↓
⑦プリントプロセッサは、 RAW データをそのまま下位に渡す
↓
⑧ランゲージモニタが必要な処理を行う(もしあれば)
↓
⑨ポートモニタは、プリンタ ポートの種類 (USB, TCP/IP etc) に合わせて出力処理を行う
↓
⑩カーネルモード ドライバに RAW データが通知される
↓
⑪プリンタに RAW データが通知される
以上が RAW スプーリング時のシーケンスとなります。
■メリット・デメリット
では、どのようなメリット・デメリットがあるのでしょうか。
NT EMF の場合、GDI が行う描画処理とプリンタ ドライバが行うプリンタ言語への変換処理については、スプーラ サービスにて行われることになりますので、アプリケーションが印刷処理から解放されるまでの時間が早く済むというメリットがあります。また、アプリケーションからの描画命令を一旦 NT EMF スプール ファイルに保持しておくため、再生する際に拡大・縮小したり、ページ順序を入れ替えたり、描画オブジェクトを追加したりすることが可能となります。実際に Windows OS 標準の WinPrint プリント プロセッサでは、[シートごとのページ数] や [ページの順序] 機能などを提供しています。
デメリットとしては、トータルで考えると、RAW スプーリングと比較して NT EMF スプール ファイルを処理するプロセスが余計にかかってしまう点がありますが、その差が顕著にわかることはないレベルかと思われます。
これに対し、RAW スプーリングの場合ですが、正直なところ、あまりメリットと言えるメリットは無いような気がします。デメリットとしては、NT EMF スプーリング時のメリットとして挙げました通り、アプリケーションが印刷処理から解放されるまでに時間がかかる点となります。
■スプーリング方法の決定
スプーリング方法については、主に3つの要素から決定されます。
1つは、プリンタ プロパティの [詳細設定] タブ上にある [詳細な印刷機能を有効にする] チェックボックスです。チェックボックスを ON にすると NT EMF スプーリングが有効となり、OFF にすると RAW スプーリングとなります。
もう1つは、プリンタ ドライバの DrvEnablePDEV 関数にて設定する DEVINFO 構造体の flGraphicsCaps フラグに GCAPS_DONTJOURNAL がセットされているか否かです。このフラグがセットされていると RAW スプーリングとなり、設定されていないと NT EMF スプーリングとなります。
最後は、印刷開始時にアプリケーションが呼び出す StartDoc API にて、DOCINFO 構造体の lpszDatatype に "emf" が指定されているか否かです。
"emf" の場合には NT EMF スプーリングとなり、それ以外の文字列の場合は RAW スプーリングとなります。
なお、上記うち、いずれか1つでも RAW スプーリングの設定となっている場合には RAW スプーリングされます。つまり、全ての設定が NT EMF スプーリングとなっていないと、NT EMF スプーリングされません。
■スプーリング方法の見分け方
印刷時に RAW スプーリングなのか、NT EMF スプーリングなのかを見分ける方法としては、スプール フォルダに生成されるスプール ファイル内のデータを見ることで判断が出来ます。(スプールフォルダについては、プリンタ フォルダから [サーバーのプロパティ] を開き、[詳細設定] タブ上の [スプールフォルダ] にて指定されています。)
プリンタ キューを一時停止にして印刷を行い、スプール フォルダに生成されたスプール ファイル (.spl) をバイナリ エディタ等で開いてみてください。中身が RAW データであれば RAW スプーリングされたことになり、そうでなければ NT EMF スプーリングされたことになります。
今回お話した内容はスタンドアロン環境での動作となりますが、Point and Print によりインストールしたプリンタや、Client Side Rendering (CSR) の場合には、サーバー側も意識する必要があります。
次回はその辺についてお話しようと思います。
ではまた。