印刷時のスプーリングについて


こんにちは、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 スプーリング 


 


文章だけではわかりづらいので図も入れてみましたが、以上が NT EMF スプーリング時のシーケンスとなります。それでは細かいことは置いておいて、続けて RAW スプーリングを見てみましょう。


 


RAW スプーリング


    ①アプリケーション印刷処理開始


       


    ②プリンタデバイス コンテキストへの描画のため、アプリケーションが GDI API を呼び出す


       


    GDI がプリンタ デバイス コンテキストへ描画を行う


       


    ④プリンタドライバの DDI 関数が呼ばれる


       


    ⑤プリンタドライバがプリンタ言語に基づいて RAW データを生成する


       


    ⑥アプリケーション印刷処理終了


       


    ⑦プリントプロセッサは、 RAW データをそのまま下位に渡す


       


    ⑧ランゲージモニタが必要な処理を行う(もしあれば)


       


    ⑨ポートモニタは、プリンタ ポートの種類 (USB, TCP/IP etc) に合わせて出力処理を行う


       


    ⑩カーネルモード ドライバに RAW データが通知される


       


    ⑪プリンタに 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) の場合には、サーバー側も意識する必要があります。


次回はその辺についてお話しようと思います。


ではまた。


 

Skip to main content