(57)【要約】【課題】ドライバが生成したデータを利用して対話型サービスを提供することが可能なプログラムを提供すること。【解決手段】情報処理装置に、設定条件を受け付けるステップと、画像処理プログラムが動作を開始する前に、印刷データを用いた通知画面を表示する通知用プログラムを起動させるステップ(S2.2.2)と、を実行させる設定受付プログラム２１と、アプリケーションから文書データを取得し、設定受付プログラムにより受け付けられた前記設定条件に基づいて印刷データに変換するステップと、印刷データを所定のプログラムが有する印刷データ保持プログラムに保持するステップ（S7.2.1）と、を実行させる画像処理プログラム２３と、印刷データ保持プログラムから印刷データを取得して、印刷データを用いた通知画面を表示するステップ（S2.2.2.4）を実行させる通知用プログラム２５２と、を有するプログラムを提供する。【選択図】図１
2014041599.tif 000002
【特許請求の範囲】
【請求項１】
所定のプログラムに基づいて動作する情報処理装置に処理を実行させるプログラムであって、
画像データの出力の設定条件を表示し、前記設定条件を受け付けるステップと、
画像処理プログラムが動作を開始する前に、印刷データを用いた通知画面を表示する通知用プログラムを起動させるステップと、を前記情報処理装置に実行させる設定受付プログラムと、
アプリケーションから文書データを取得し、前記設定受付プログラムにより受け付けられた前記設定条件に基づいて印刷データに変換するステップと、
前記印刷データを前記所定のプログラムが有する印刷データ保持プログラムに保持するステップと、を前記情報処理装置に実行させる画像処理プログラムと、
前記印刷データ保持プログラムから前記印刷データを取得して、前記印刷データを用いた前記通知画面を表示するステップを前記情報処理装置に実行させる通知用プログラムと、を有するプログラム。
【請求項２】
前記通知用プログラムは、前記通知画面にて印刷を継続するか又は印刷を中止するかのいずれかの設定を受け付けるステップと、
前記設定を前記印刷データ保持プログラムに出力するステップと、を前記情報処理装置に実行させ、
前記画像処理プログラムは、前記印刷データ保持プログラムから取得した前記設定が印刷中止の場合、前記印刷データの出力を中止する、
ことを特徴とする請求項１記載のプログラム。
【請求項３】
前記通知用プログラムは、前記通知画面に、前記印刷データを用紙に出力したイメージ画像を表示する処理を前記情報処理装置に実行させる、
ことを特徴とする請求項１項記載のプログラム。
【請求項４】
前記通知用プログラムは、
前記印刷データに基づき、前記印刷データが印刷される際の色情報、及び、出力枚数を判別して、印刷に課金される金額を算出し、前記通知画面に、前記金額を表示する処理を前記情報処理装置に実行させる、
ことを特徴とする請求項１記載のプログラム。
【請求項５】
前記通知用プログラムは、前記設定受付プログラムにより起動された後、前記印刷データ保持プログラムに前記印刷データの保持が完了したか否かを問い合わせるステップと、
前記印刷データの保持が完了した場合、前記印刷データ保持プログラムから前記印刷データを取得して前記印刷データを用いた前記通知画面を表示するステップと、を前記情報処理装置に実行させる、
ことを特徴とする請求項１記載のプログラム。
【請求項６】
前記所定のプログラムは所定のオペレーティングシステムであり、
前記印刷データ保持プログラムはLanguage Monitorである、
ことを特徴とする請求項１項記載のプログラム。
【請求項７】
画像データの出力の設定条件を表示し、前記設定条件を受け付ける設定受付手段と、
アプリケーションから文書データを取得し、前記設定受付手段により受け付けられた前記設定条件に基づいて印刷データに変換する画像処理手段と、
前記画像処理手段が生成した前記印刷データを用いた通知画面を表示する通知画面生成手段と、を有し、所定のプログラムに基づいて動作する情報処理装置であって、
前記画像処理手段が動作を開始する前に、前記通知画面生成手段を起動させる起動手段と、
前記所定のプログラムにより提供される、前記画像処理手段が出力した前記印刷データを保持する印刷データ保持手段と、を有し、
前記起動手段により起動された前記通知画面生成手段は、前記印刷データ保持手段から前記印刷データを取得して、取得した前記印刷データを用いた前記通知画面を表示する、
ことを特徴とする情報処理装置。
【請求項８】
前記通知画面生成手段は、前記通知画面にて印刷を継続するか又は印刷を中止するかのいずれかの設定を受け付けて前記設定を前記印刷データ保持手段に出力し、
前記画像処理手段は、前記印刷データ保持手段から取得した前記設定が印刷中止の場合、前記印刷データの出力を中止する、
ことを特徴とする請求項７記載の情報処理装置。
【請求項９】
前記通知画面生成手段は、前記通知画面に、前記印刷データを用紙に出力したイメージ画像を表示する、
ことを特徴とする請求項７項記載の情報処理装置。
【請求項１０】
前記通知画面生成手段は、
前記印刷データに基づき、前記印刷データが印刷される際の色情報、及び、出力枚数を判別して、印刷に課金される金額を算出し、
前記通知画面に前記金額を表示する、
ことを特徴とする請求項７記載の情報処理装置。
【請求項１１】
前記通知画面生成手段は、前記設定受付手段により起動された後、前記印刷データ保持手段に前記印刷データの保持が完了したか否かを問い合わせ、前記印刷データの保持が完了した場合、前記印刷データ保持手段から前記印刷データを取得して前記印刷データを用いた前記通知画面を表示する、
ことを特徴とする請求項７記載の情報処理装置。
【請求項１２】
前記所定のプログラムは所定のオペレーティングシステムであり、
前記印刷データ保持手段はLanguage Monitorである、
ことを特徴とする請求項７項記載の情報処理装置。
【請求項１３】
画像データの出力の設定条件を表示し、前記設定条件を受け付ける設定受付手段と、
アプリケーションから文書データを取得し、前記設定受付手段により受け付けられた前記設定条件に基づいて印刷データに変換する画像処理手段と、
前記画像処理手段が生成した前記印刷データを用いた通知画面を生成する通知画面生成手段と、
前記画像処理手段が動作を開始する前に、前記通知画面生成手段を起動させる起動手段と、
所定のプログラムにより提供される、前記画像処理手段が出力した前記印刷データを保持する印刷データ保持手段と、を有し、
前記起動手段により起動された前記通知画面生成手段は、前記印刷データ保持手段から前記印刷データを取得して、取得した前記印刷データを用いた前記通知画面を生成する、ことを特徴とするシステム。
【請求項１４】
所定のプログラムに基づいて動作する第１の情報処理装置に、
画像データの出力の設定条件を表示し、前記設定条件を受け付けるステップと、
所定のプログラムに基づいて動作する第２の情報処理装置が有する画像処理手段が動作を開始する前に、印刷データを用いた通知画面を表示する通知用プログラムを起動させるステップと、を実行させる設定受付プログラムと、
前記第１の情報処理装置に、前記第２の情報処理装置で動作する前記所定のプログラムが有する印刷データ保持プログラムから前記印刷データを取得するステップと、
取得した前記印刷データを用いた前記通知画面を表示するステップと、を実行させる通知用プログラムと、を有するプログラムと、
前記第１の情報処理装置で動作するアプリケーションが作成した文書データを取得し、前記設定受付プログラムにより受け付けられた前記設定条件に基づいて前記印刷データに変換する画像処理手段と、
前記画像処理手段が作成した前記印刷データを保持する前記印刷データ保持プログラムと、を有するシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、出力対象の文書データを取得して印刷装置に送出するプログラムに関する。
【背景技術】
【０００２】
ユーザーがＰＣ（Personal  Computer）上で動作するアプリケーションを操作して文書データ（ドキュメント）の印刷を指示したり、ＦＡＸ送信を指示する場合がある。このため、ＰＣには、印刷設定やＦＡＸ送信設定を受け付けるＧＵＩ（Graphical User Interface）画面を表示し、文書データを描画データに変換するプリンタドライバ又はＰＣ−ＦＡＸドライバ（以下、両者を区別せずに、単にドライバという）がインストールされている。
【０００３】
Windows（登録商標。以下、省略する）上で動作するドライバは、通常「ＵＩドライバ」と「描画ドライバ」の２つに分けて実装される。ＵＩドライバは、上記のように印刷設定画面（ＧＵＩ）を表示してユーザーに印刷設定を表示し変更や設定を受け付ける役割をもつ。一方、描画ドライバは、主にＵＩドライバによって指定された印刷設定をWindowsから受け取り、プリンタへ送信するための描画データを生成する役割をもつ。
【０００４】
ところで、ＰＣのアプリケーションから呼び出されたドライバは、Windowsと連携して処理を行う。このWindowsにおける印刷アーキテクチャとして、２つのスプール形式とサーバーを利用したインストール形式がある。
（１）ＲＡＷスプールとＥＭＦスプールという２つのスプール形式
（２）Point & Printというインストール形式
スプールについて説明する。ＲＡＷスプールによる印刷では、ドライバのインスタンスが、ユーザーが印刷指示を行った「アプリケーションのプロセス上」で生成される。ＥＭＦスプールによる印刷では、ドライバのインスタンスは、ユーザーが印刷指示を行ったアプリケーションのプロセス上でも生成されるが、その後、「ＯＳのスプールプロセス上」でも再度生成される、という違いがある。ＥＭＦスプールの後半のスプールプロセスは、ドライバのインスタンスがプリンタへ送信するデータを実際に作成するためのスプールプロセスである（これに対し、アプリケーションとＯＳとが通信して中間データを生成するプロセスをアプリケーションプロセスという）。
【０００５】
Point & Printインストールは、ネットワークを介して、プリンタと、ドライバが既にインストールされたサーバーとなるコンピュータと、それとは別のクライアントとなるコンピュータと、が接続された状態で利用される。クライアントは、サーバーにあるドライバを使ってクライアントにドライバをインストールする。このようにしてクライアントにインストールされたドライバは、描画データの作成をクライアント側で行なわずにサーバー側で行うことができる（「サーバーサイドレンダリング」という。対比してクライアント側で行うことを「クライアントサイドレンダリング」という。）。クライアント側の印刷処理の負荷を軽減することが可能となる。
【０００６】
なお、Point & Printインストールによって構築されたPoint & Print環境では、クライアント側とサーバー側の双方でLanguage Monitorというモジュールが動作する。このモジュールは、Windowsの印刷アーキテクチャにおいて必要なモジュールの１つである。プリンタメーカが開発しない場合はWindowsに付属のモジュールが動作するが、プリンタメーカが独自の機能を盛り込んで開発してそれを動作させることもできる。
【０００７】
以上のような印刷環境（複数のスプール形式やインストール形式が利用可能な環境）において、ユーザーがアプリケーションから印刷を指示した際に、ドライバが生成したデータを利用してドライバ自身やそれに付随するアプリケーションが対話型サービスを提供する技術が知られている（例えば、特許文献１，２参照。）。対話型サービスを利用することで、印刷プレビューの表示や課金情報をユーザーに通知することができる。
【０００８】
特許文献１には、ドライバから通知された情報をもとに課金アプリケーションを起動することで、料金をユーザーに通知したり、その後の出力処理を変更したりする技術が開示されている。特許文献２には、アプリケーションからの印刷指示に対し付与された一意のジョブＩＤを用いて、ユーザーが印刷指示を出した後にも、ＵＩドライバが印刷設定保存モジュールを介して、ジョブＩＤを用いて描画ドライバに印刷設定を受け渡す技術が開示されている。
【発明の概要】
【発明が解決しようとする課題】
【０００９】
しかしながら、特許文献１，２のような従来のプリンタドライバでは、下記の２つの問題がある。
Ａ．ＧＵＩとして対話型画面を表示する際に「対話型サービス検出」画面が表示されることがある
Ｂ．ＵＩドライバと描画ドライバが直接データの受け渡しをすることはできないため、ＵＩドライバは描画ドライバが作成したデータを利用して対話型サービスを行うことが困難になる
【００１０】
Ａ．について説明する。まず、描画ドライバが対話型画面を表示することはWindowsの印刷アーキテクチャとして推奨されていない。そのため、描画ドライバが対話型画面を表示すると、Windowsが警告として「対話型サービス検出」の画面を表示し、ユーザーに起動の可否を問い合わせることがある。
【００１１】
図１６は「対話型サービス検出」の画面の一例を示す。図１６では「プログラムがタスクを完了するには、情報又はアクセス許可が必要である可能性があります。」と表示されている。この画面が表示されると、ユーザーは
・メッセージを表示する
・数分後に通知する
のいずれかを選択しなければならない。選択しない限り対話型画面が表示されず、ドライバはユーザーに「対話型サービス」を提供できない（印刷プレビュー通知や課金表示できない）ため、ジョブを完了することができない。
【００１２】
また、どちらかを選択するにしても、ユーザーはシステムに影響が大きい操作を許可するかどうかの判断をしなければならず、ＰＣの動作を熟知していないユーザーにとっては判断すること自体が困難である。また、印刷のための操作以外の余分な操作を行う必要があるため、ユーザーの操作手順が増えることになり不便である。
【００１３】
なお、「対話型サービス検出」画面は、ＵＩドライバが対話型画面を表示する場合にも表示されることがある。例えば、ＰＣにログインしているユーザーの権限が低い場合、ユーザーの権限で起動したアプリケーションのプロセス上でＵＩドライバが対話型画面を表示する際には問題がない。しかし、Windowsのスプールプロセス上でＵＩドライバが対話型画面を表示する場合には「対話型サービス検出」画面が表示されることがある。
【００１４】
Ｂ．について説明する。ＵＩドライバと描画ドライバは、ＯＳから呼び出されて処理を行うが、それぞれが直接通信をしてデータの受け渡しをすることはできない。ドライバはWindowsから呼び出されるためのI/Fを備えているが、それ以外のI/Fを持つことはできないためである。なお、ＵＩドライバによって指定された印刷設定は、DEVMODEというデータ構造体としてOSを介して描画ドライバへ渡される。
【００１５】
上記の対話型サービスの一例である、印刷プレビューや課金情報をユーザーへ通知する技術では、描画ドライバによる描画データの生成処理が完了した後で、描画ドライバが生成した描画データを使ってドライバがユーザーへの通知を行う必要がある。描画ドライバが通知を行うための対話型画面を表示することは上記Ａの通りできない。このため、描画ドライバが生成した描画データをＵＩドライバへ渡してあげる必要があるが、Ｂの通り、ＵＩドライバと描画ドライバが直接通信を行ってデータの受け渡しをすることができない。
【００１６】
そこで、これらの問題を回避するために、描画データ保持用の一時ファイルや専用のモジュールを使う方法が考えられる。描画ドライバが生成した描画データを、一時ファイル等を介してＵＩドライバに受け渡し（Ｂの問題を回避）、ＵＩドライバが印刷プレビューなどの通知を行うモジュールを起動する（Ａの問題を回避）という手法が考えられる。
【００１７】
しかしながら、この手法でも下記の問題がある。
（１）ＥＭＦスプールによる印刷処理の場合に、Windowsによる警告画面が表示されてしまう
（２）Point & Print環境で「サーバーサイドレンダリング」を行う場合、対話型サービスでユーザーに通知することができない
【００１８】
（１）について説明する。ＥＭＦスプールの場合、描画ドライバによる描画データの生成処理はWindowsのスプールプロセス上で生成された描画ドライバのインスタンスの中で行われる。描画ドライバによる描画データの生成が完了した後で、専用のモジュール（これを「印刷データ保持用モジュール」と称す）を使って描画ドライバが生成したデータをＵＩドライバが取得することは可能である。しかし、そのＵＩドライバもWindowsのスプールプロセス上で生成されているため、対話型画面の表示を行う際にWindowsによる警告画面（「対話型サービス検出」の画面）が表示されてしまう。
【００１９】
（２）について説明する。Point & Print環境で「サーバーサイドレンダリング」を行う場合、「印刷データ保持用モジュール」がサーバー側に存在するとしたら、サーバー側でインスタンス化された描画ドライバで生成した描画データをサーバー側のＵＩドライバに渡すことになる。つまり、通知のための対話型画面がサーバー側で表示されてしまう。印刷の操作はクライアント側から実行されているので、サーバー側に表示された対話型画面はクライアント側の画面を見ているユーザーには通知されないし、操作することもできない。
【００２０】
また、「印刷データ保持用モジュール」がクライアント側に存在するとしたら、サーバー側でインスタンス化された描画ドライバで生成した描画データをクライアント側のＵＩドライバに渡すことができないため、やはりクライアント側に通知をすることはできない。
【００２１】
本発明は、上記課題に鑑み、スプール形式やインストール形式に拘わらず、ドライバが生成したデータを利用して対話型サービスを提供することが可能なプログラムを提供することを目的とする。
【課題を解決するための手段】
【００２２】
本発明は、所定のプログラムに基づいて動作する情報処理装置に処理を実行させるプログラムであって、画像データの出力の設定条件を表示し、前記設定条件を受け付けるステップと、画像処理プログラムが動作を開始する前に、印刷データを用いた通知画面を表示する通知用プログラムを起動させるステップと、を前記情報処理装置に実行させる設定受付プログラムと、アプリケーションから文書データを取得し、前記設定受付プログラムにより受け付けられた前記設定条件に基づいて印刷データに変換するステップと、前記印刷データを前記所定のプログラムが有する印刷データ保持プログラムに保持するステップと、を前記情報処理装置に実行させる画像処理プログラムと、前記印刷データ保持プログラムから前記印刷データを取得して、前記印刷データを用いた前記通知画面を表示するステップを前記情報処理装置に実行させる通知用プログラムと、を有するプログラムを提供する。
【発明の効果】
【００２３】
スプール形式やインストール形式に拘わらず、ドライバが生成したデータを利用して対話型サービスを提供することが可能なプログラムを提供することができる。
【図面の簡単な説明】
【００２４】
【図１】プリンタドライバによる処理の概略を示す図の一例である。
【図２】印刷システムの概略構成図の一例である。
【図３】ＰＣのハードウェア構成図の一例である。
【図４】ＰＣの機能ブロック図の一例である。
【図５】ＲＡＷスプールにおける印刷アーキテクチャの流れを説明する図の一例である。
【図６】図５の印刷アーキテクチャのシーケンス図の一例である。
【図７】ＥＭＦスプールにおける印刷アーキテクチャの流れを説明する図の一例である。
【図８】図７の印刷アーキテクチャのシーケンス図の一例である。
【図９】ＲＡＷスプールの印刷アーキテクチャのシーケンス図の一例である。
【図１０】ＥＭＦスプールの印刷アーキテクチャのシーケンス図の一例である。
【図１１】通知表示部の処理手順を示すフローチャート図の一例である。
【図１２】クライアントとサーバーの機能ブロック図の一例である。
【図１３】ＰＣの機能ブロック図の一例である。
【図１４】ＲＡＷスプールのWindows系ＯＳの印刷アーキテクチャのシーケンス図の一例である（実施例３）。
【図１５】プレビュー表示画面の一例を示す図である。
【図１６】「対話型サービス検出」の画面の一例を示す図である。
【図１７】LanguageMonitorの動作を説明する図の一例である。
【図１８】DrvDocumentEvent()関数、SendRecvBidiDataFromPort()関数の書式を説明する図の一例である。
【図１９】ExtEscape()関数の書式を説明する図の一例である。
【図２０】Point&Print環境におけるLanguageMonitorの位置づけを説明する図の一例である。
【発明を実施するための形態】
【００２５】
以下、本発明を実施するための形態について図面を参照しながら説明する。
図１は、本実施形態のプリンタドライバによる処理の概略を示す図の一例である。
・プリンタドライバはＵＩドライバ、描画ドライバ及び通知用モジュールを有する。
・ＯＳ（Operating  System）は印刷アーキテクチャ（ＲＡＷスプール、ＥＭＦスプール）にしたがってＵＩドライバと描画ドライバを呼び出し印刷に必要な処理を実行する。
・Language Monitorは本実施形態では情報の記憶手段として機能する。
（i）まず、本実施形態のＵＩドライバは、アプリケーションからの印刷指示の直後に通知用モジュールを起動する。
（ii）描画ドライバは印刷設定と文書データから作成した描画データを、Language Monitorのデータ保持部に記憶させる。
（iii）通知用モジュールはLanguage Monitorと通信して、描画データをLanguage Monitorから取得する。
（iv）通知用モジュールは取得した描画データを用いて、対話型サービスを提供する。
【００２６】
このように、通知用モジュールがアプリケーションからの印刷指示の直後に起動されるので、通知用モジュールはアプリケーションプロセスで起動されている。このため、描画ドライバのインスタンスが生成された後も、通知用モジュールはアプリケーションプロセスで動作する。したがって、対話型サービスの表示を行う際に警告画面が表示されることを防止できる。
【００２７】
この説明は、プリンタドライバがローカルインストールされた場合を例示した説明である。しかし、Point & Print環境の場合もサーバー側のLanguage Monitorをクライアント側の通知用モジュールが利用することで、クライアントは対話型サービスを表示することができる。
【００２８】
したがって、本実施例のプリンタドライバは、スプール形式やインストール形式に拘わらず、プリンタドライバが生成したデータを利用して対話型サービスを提供することが可能となる。
【００２９】
〔構成例〕
図２は印刷システム５００の概略構成図の一例を示す。ネットワーク５０１に、プリンタ２００と三台のＰＣ（Personal  Computer）が接続されている。本実施形態では、ＰＣ−Ｃがローカル環境で印刷するＰＣ、ＰＣ−ＢがPoint & Printインストールされたプリンタドライバで印刷するＰＣ、ＰＣ−ＡがPoint & Print環境でサーバーサイドレンダリングを行うＰＣとする。つまり、ＰＣ−ＡにインストールされているプリンタドライバがＰＣ−Ｂに対してPoint & Printインストールされている。なお、ユーザーがＰＣ−Ａ上で印刷指示を行なう場合は、ＰＣ−Ｃと同様にＰＣ−Ａのローカル環境での印刷となる。
【００３０】
以下では、
ＰＣ−Ａをサーバー１１０
ＰＣ−Ｂをクライアント１２０
ＰＣ−Ｃを単にＰＣ１００と称する。
【００３１】
ＰＣ１００やクライアント１２０では、文書作成ソフトなどのアプリケーションが動作する。プリンタドライバは、アプリケーションが作成した文書データから印刷データを作成してプリンタ２００に送信する。サーバーサイドレンダリングの場合は、サーバー１１０が印刷データを作成してプリンタ２００に送信する。
【００３２】
サーバー１１０、ＰＣ１００及びクライアント１２０は、情報処理装置であればよく、ＰＣと呼ばれるもの以外に、タブレット、ストレートＰＣ、スマートフォン、ＰＤＡ（Personal Digital Assistant）、ノートＰＣ、及び、デスクトップＰＣ、等が含まれる。
【００３３】
プリンタ２００は画像形成機能を有していれば、コピー機、複写機、ＦＡＸ装置などその呼称は問われない。また、プリンタ２００は電子写真方式の画像形成機能又はインクジェット方式の画像形成機能のどちらの機能を有していてもよい。なお、ＰＣ１００又はクライアント１２０は、ＵＳＢケーブルなどでプリンタ２００と直接接続されていてもよい。
【００３４】
また、本実施形態ではプリンタドライバを例にして説明するが、本実施形態はＰＣ−ＦＡＸドライバにも同様に適用できる。
【００３５】
図３は、ＰＣ（ＰＣ１００、サーバー１１０又はクライアント１２０）のハードウェア構成図の一例を示す。ＰＣは、それぞれバスで相互に接続されているＣＰＵ１１、ＲＯＭ１２、ＲＡＭ１３、外部Ｉ／Ｆ１４、通信装置１５、入力装置１６、表示制御部１７及び記憶装置１８を有する。ＣＰＵ１１は、ＯＳ１０、アプリケーション３１、及び、プリンタドライバ３０を記憶装置１８から読み出して、ＲＡＭ１０３を作業メモリにして実行する。
【００３６】
アプリケーション３１は、プリンタ２００に印刷要求するものであればよく、例えば、文書作成ソフト、ブラウザソフト、プレゼン資料作成ソフト等、種々のものがある。印刷対象となる文書データを、作成、編集、表示、管理などして、印刷可能なアプリケーションであればどのようなものでもよい。なお、文書データは、文字や記号、数値だけを含むものではなく、画像、写真など種々の印刷対象物を含む。
【００３７】
ＯＳは、Windows系のＯＳであることが好適である。ＰＣ１００又はクライアント１２０におけるＯＳとしては、Windows NT、Windows 98、Windows 2000、Windows Me、Windows XP、Windows Vista、Window 7、Window 8、及び、これ以降のバージョンのＯＳが含まれる。なお、必ずしもWindows系のＯＳでなければならないのではなく、本実施形態のプリンタドライバが利用するWindowsと同等の機能を提供するＯＳであればよい。
【００３８】
ＲＡＭ１３は必要なデータを一時保管する作業メモリ（主記憶メモリ）になり、ＲＯＭ１２にはＢＩＯＳや初期設定されたデータ、スタートプログラム等が記憶されている。
【００３９】
外部Ｉ／Ｆ１４はＵＳＢケーブル等のケーブルや、可搬型の記憶媒体２０を装着するインタフェースである。通信装置１５は、ＬＡＮカードやイーサネット（登録商標）カードであり、ＣＰＵ１１からの指示によりプリンタ２００にパケットデータ（本実施形態では主に印刷データ）を送信する。また、外部からパケットデータを受信してＣＰＵ１１に通知する。
【００４０】
入力装置１６は、キーボード、マウスなど、ユーザーの様々な操作指示を受け付けるユーザインターフェイスである。タッチパネルや音声入力装置を入力装置とすることもできる。表示制御部１７は、アプリケーション３１が指示する画面情報に基づき所定の解像度や色数等でディスプレイ１９の描画を制御する。ディスプレイ１９は、液晶や有機ＥＬなどのＦＰＤ（Flat  Panel  Display）である。
【００４１】
記憶装置１８は、ＨＤＤ（Hard  Disk  Drive）やフラッシュメモリなどの不揮発メモリを実体とし、ＯＳ１０、プリンタドライバ３０、及び、アプリケーション３１を記憶している。
【００４２】
記憶媒体２０は、例えば、ＳＤカードやＵＳＢメモリ、ＣＤ−ＲＯＭなど不揮発性のメモリである。ＯＳ１０、アプリケーション３１、及び、プリンタドライバ３０は、記憶媒体２０に記録された状態又は不図示のサーバーからダウンロードされる態様で配布される。
【００４３】
なお、サーバー１１０においては、ディスプレイ１９は接続されていてもいなくてもよい。サーバー１１０のWindows系ＯＳには、Windows 2000 Server、2003 Server、2008 Server、2011 Server、2012 Server及びこれ以降のバージョンのＯＳが含まれる。
【実施例１】
【００４４】
本実施例ではローカル印刷における印刷手順について説明する。
図４は、ＰＣ１００の機能ブロック図の一例である。プリンタドライバ３０は、主にＯＳ１０やLanguage Monitorと通信し、アプリケーション３１は主にＯＳやプリンタドライバと通信する。
【００４５】
プリンタドライバ３０は、ＵＩドライバ３８、描画ドライバ３９及び通知用モジュール２５を有している。ＵＩドライバ３８は印刷設定表示部２１、及び、通知用モジュール起動部２２を有する。ＵＩドライバ３８の印刷設定表示部２１は、ユーザーがアプリケーション３１に対して文書の印刷操作を入力することで、印刷設定画面（印刷ダイアログと呼ばれることがある）をディスプレイ１９に表示する。ユーザーは、印刷設定画面に対し、「白黒／カラー」の設定、「両面」「集約」「製本」「変倍」の設定、部数の設定等を行うことができる。印刷設定は、DEVMODE構造体（以下、単にDEVMODEという）というデータ構造体（データテーブル）に格納される。DEVMODEはＯＳ上で動作する各種のプリンタドライバ３０に対して、ＵＩドライバ３８が印刷条件を共通に設定するためのメンバ変数が定義されたデータ構造体である。
【００４６】
通知用モジュール起動部２２は、通知用モジュール２５を起動する。通知用モジュール起動部２２は、アプリケーション３１からの印刷指示の直後に通知用モジュール２５を起動しておく。印刷指示の直後としたのは、ＥＭＦスプールにおいてスプールプロセスが開始される前を意図しており、印刷指示の直後でなくてもよい場合がある。しかしながら、スプールプロセスが開始されるタイミングをＵＩドライバ３８が検知できない場合があるため、印刷指示の後、早期のタイミングであることが好ましい。通知用モジュール起動部２２はLanguage Monitorの通信部３２１と通信できる。
【００４７】
描画ドライバ３９は、描画データ生成部２３とドライバ通信部２４を有する。描画データ生成部２３は、DEVMODEを参照して、アプリケーション３１によって作成された印刷対象の文書データから印刷設定を反映した印刷データを作成する。印刷データには描画データ（例えばＰＤＬデータ）と制御データ（例えばＰＪＬの印刷コマンド）が含まれる。
【００４８】
ドライバ通信部２４は、Language Monitor３２と通信する。ドライバ通信部２４は、描画データ生成部２３が作成した印刷データ（又は少なくとも描画データ）をLanguage Monitor３２の通信部３２１へ指示して保持させる。
【００４９】
通知用モジュール２５は、通知表示部２５２とモジュール通信部２５３を有する。モジュール通信部２５３は、通信部３２１と通信することで、Language Monitor３２のデータ保持部３２２が保持していた描画データを取得する。通知表示部２５２は、描画データを利用してプレビュー表示や課金情報の表示などの対話型画面を表示する（対話型サービスを提供する。）。
【００５０】
図１５にプレビュー表示画面の一例を示す。プレビュー表示画面には、文書名５０１、プレビュー５０２、印刷用紙サイズ５０３、印刷部数５０４、カラー／白黒の選択欄５０５、両面／製本の選択欄５０６、集約の選択欄５０７、ソートの選択欄５０８、パンチの選択欄５０９、ステープルの選択欄５１０、拡大ボタン５１１、印刷ボタン５１２、及び、キャンセルボタン５１３等が配置されている。すなわち、プレビュー表示画面は、描画データの作成後も設定可能な印刷設定について選択を受け付けることができる。
【００５１】
ユーザーはプレビュー５０２を目視して印刷結果を確認するだけでなく、拡大ボタン５１１を押下してプレビュー５０２を拡大することができる。確認結果が良好であれば、ユーザーは印刷ボタン５１２を押下し、描画データに満足できなければキャンセルボタン５１３を押下する。印刷ボタン５１２が押下された場合、ＰＣ１００又はクライアント１２０は印刷を実行し、キャンセルボタン５１３が押下された場合、ＰＣ１００又はクライアント１２０は印刷を中止する（描画データは破棄される）。
【００５２】
課金情報を表示する場合、通知表示部２５２は、印刷設定や部数に基づき印刷料金を算出し、プレビュー５０２の代わりに又はプレビュー５０２と共に課金情報を表示する。算出規則は例えば以下のように決まっている。
・印刷ページ数Ｎは、両面は２ページ、Ａ３以上は片面２ページで換算
・単価は白黒がＰ円、カラーがＱ円
したがって、印刷料金＝Ｎ×Ｐ（or  Q）×部数
により算出される。
【００５３】
図４に戻り、Language Monitor３２はＯＳ１０により提供されるが、本実施形態ではプリンタメーカが作成又は改良している。この他、スプーラー３５、プリントプロセッサ４１、ポートモニター３３、及び、ポートドライバー４２はＯＳから提供される。よって、スプーラー３５、プリントプロセッサ４１、ポートモニター３３、及び、ポートドライバー４２はＯＳの一部と捉えることもできる。
【００５４】
Language Monitor３２は描画ドライバ３９から印刷データを取得する。スプーラー３５は、印刷データをスプール（一時的に保存）するモジュールだが、本実施例ではドライバ通信部２４と通信部３２１が通信してLanguage Monitor３２に保持させる。また、プリントプロセッサ４１は主にＥＭＦスプールにおいてアプリケーションの代わりに印刷に必要な処理を行う。
【００５５】
Language Monitor３２は通信部３２１とデータ保持部３２２を有している。通信部３２１は、ドライバ通信部２４と通信することで、描画データを取得してデータ保持部３２２に記憶する。また、モジュール通信部２５３と通信してデータ保持部３２２の描画データを通知用モジュール２５に送出する。ポートモニター３３は通信プロトコルに基づく処理を行い、ポートドライバー４２に印刷データを送信する。ポートドライバー４２は、プリンタ２００とＰＣ１００との接続インタフェース（USB,NIC等）を制御して、印刷データをプリンタ２００に送信する。
【００５６】
〔従来の印刷アーキテクチャ〕
説明のため、従来の印刷アーキテクチャについて説明する。
図５は、ＲＡＷスプールにおける、Windows系ＯＳの印刷アーキテクチャの流れを説明する図の一例である。なお、ＧＤＩ（Graphics Device Interface）３４はＯＳ１０のモジュールの１つであり、ＯＳ１０とみなすことができる。ＧＤＩ３４はプリンタ２００やディスプレイ１９などの表示デバイスの制御に用いられる体系的なＡＰＩの総称である。
（１）ユーザーが、ＵＩドライバ３８が提供する印刷設定画面（ＧＵＩ：Graphical User Interface）によって印刷設定を変更する（すでに登録されている初期値を変更する）。
（２）ユーザーがアプリケーション３１に印刷開始指示の操作を行う。
（３）アプリケーション３１はＵＩドライバ３８と印刷設定が入っているDEVMODEをやりとりして、ユーザーの印刷設定を受け取る。
（４）アプリケーション３１はＧＤＩ３４に印刷命令とDEVMODEをＧＤＩコールとして伝える。
（５）ＧＤＩ３４はＧＤＩコールをＤＤＩコールに変換して描画ドライバ３９に伝える。
（６）描画ドライバ３９は、プリンタ２００が理解できる言語に変換したＲＡＷデータをスプーラー３５に送信する。
（７）スプーラー３５は、描画ドライバ３９から受け取ったＲＡＷデータをプリンタ２００に送信する。
【００５７】
図６は、図５のWindows系ＯＳの印刷アーキテクチャのシーケンス図の一例である。なお、実際にはＧＤＩ３４とＵＩドライバ３８、又は、ＧＤＩ３４と描画ドライバ３９の間では、不図示の通信が行われているが省略している。ＧＤＩ３４からＵＩドライバ３８へのメッセージはＵＩ系のＤＤＩ関数で、描画ドライバ３９へのメッセージは描画系ＤＤＩ関数でそれぞれ通知される。
【００５８】
この図６のS1までにＵＩドライバ３８はユーザーが設定した印刷設定を受け付けており、ユーザーが印刷開始指示を入力するとアプリケーション３１がDEVMODEに格納された印刷設定を取得する。
【００５９】
S1: アプリケーション３１はまず、ＧＤＩ３４に印刷準備開始を指示する。具体的には、アプリケーション３１はCreateDC()関数で印刷設定（DEVMODE）を引数にしてＧＤＩ３４をコールする。
【００６０】
S1.1:ＧＤＩ３４はＤＤＩをコールすることで、描画ドライバ３９に印刷設定を送出する。CreateDC()の引数でアプリーションがＧＤＩ３４に渡した印刷設定が、DrvEnablePDEV()の引数に格納され描画ドライバ３９に通知される。この後、描画ドライバ３９は、ジョブが終了するまで（デバイスコンテキストが消去されるまで）印刷設定を参照することができる。
【００６１】
S2:ＧＤＩ３４が印刷準備完了をアプリケーション３１に通知すると、アプリケーション３１はＧＤＩ３４に印刷開始を指示する。具体的には、アプリケーション３１はStartDoc()関数でDocINFOなどを引数にしてＧＤＩ３４をコールする。
【００６２】
S2.1:ＧＤＩ３４はＵＩドライバ３８に印刷開始を指示する。具体的にはDrvDocumentEvent()DOCUMENTEVENT_STARTDOCPRE()をＵＩドライバ３８に送出する。
【００６３】
S2.2:ＧＤＩ３４は描画ドライバ３９に印刷開始を指示する。具体的にはDrvStartDoc()関数を描画ドライバ３９に送出する。ＯＳは、CreateDC()関数により所定のタイミングでJobIDを生成している。ＧＤＩ３４はDrvStartDoc()関数の引数にJobIDを設定するので、描画ドライバ３９はJobIDを参照できるようになる。
【００６４】
S2.3: 同様にＧＤＩ３４はＵＩドライバ３８に印刷開始を指示する。具体的にはDrvDocumentEvent()DOCUMENTEVENT_STARTDOCPOST()をＵＩドライバ３８に送出する。ＧＤＩ３４はこの関数の引数にJobIDを設定するので、ＵＩドライバ３８はJobIDを参照できるようになる。
【００６５】
S3: ＧＤＩ３４が印刷開始完了をアプリケーション３１に通知すると、アプリケーション３１はページ単位の処理を繰り返す。まず、アプリケーション３１はＧＤＩ３４に新しいページの印刷データを受け入れるよう指示する。具体的には、アプリケーション３１はStartPage()をＧＤＩ３４に送出する。
【００６６】
S3.1:ＧＤＩ３４はDrvStartPage()を描画ドライバ３９に送出する。
【００６７】
S4:アプリケーション３１は、描画ドライバ３９から応答を取得すると、描画関数（文書データ）をＧＤＩ３４に送出する。
【００６８】
S4.1:ＧＤＩ３４は、描画関数（文書データ）を描画ドライバ３９に送出する。描画ドライバ３９は印刷設定に従って文書データを印刷データに変換する。
【００６９】
S5: ＧＤＩ３４が１ページ分の描画処理の完了をアプリケーション３１に通知すると、アプリケーション３１は１ページ分の書き込みが終了したことをＧＤＩ３４に通知する。具体的には、アプリケーション３１はEndPage()をＧＤＩ３４に送出する。
【００７０】
S5.1:ＧＤＩ３４は描画ドライバ３９に１ページ分の書き込みが終了したことを通知する。具体的には、ＧＤＩ３４はDrvSendPage()を描画ドライバ３９に送出する。
【００７１】
S6:アプリケーション３１は、全てのページの描画処理が終了すると、印刷ジョブの終了をＧＤＩ３４に通知する。具体的には、アプリケーション３１はEndDoc()をＧＤＩ３４に送出する。
【００７２】
S6.1:ＧＤＩ３４は印刷ジョブの終了を描画ドライバ３９に送出する。具体的には、ＧＤＩ３４はEndDoc()を描画ドライバ３９に送出する。
【００７３】
S6.2: ＧＤＩ３４は印刷ジョブの終了をＵＩドライバ３８に送出する。具体的には、ＧＤＩ３４はDrvDocumentEvent()DOCUMENTEVENT_ENDDOCPOST()をＵＩドライバ３８に送出する。
この後、デバイスコンテキストが消去され、描画ドライバ３９は印刷設定を参照できなくなる（描画ドライバにDrvDisablePDEV()のＤＤＩコールが通知される）。
【００７４】
図７は、ＥＭＦスプールにおける、Windows系ＯＳの印刷アーキテクチャの流れを説明する図の一例である。
（１）ユーザーが、ＵＩドライバ３８が提供する印刷設定画面（ＧＵＩ）によって印刷設定を変更する（すでに登録されている初期値を変更する）。
（２）ユーザーがアプリケーション３１に印刷開始指示の操作を行う。
（３）アプリケーション３１はＵＩドライバ３８と印刷設定が入っているDEVMODEをやりとりして、ユーザーの印刷設定を受け取る。
（４）アプリケーション３１はＧＤＩ３４に印刷命令をＧＤＩコールとして通知する。
（５）ＧＤＩ３４はＥＭＦデータをスプールデータとしてスプーラー３５に渡す。
（６）ＥＭＦデータが一通りスプールされると、スプーラー３５がプリントプロセッサ４１にデスプールすることを伝え、スプールデータを渡す。
（７）プリントプロセッサ４１は、スプールデータをページごとに編集することで、集約・逆順・製本の機能を実現し、編集した内容をＧＤＩ３４にＧＤＩコールとして通知する。
（８）ＧＤＩ３４はＧＤＩコールをＤＤＩコールに変換して描画ドライバ３９に通知する。
（９）描画ドライバ３９は、プリンタ２００が理解できる言語に変換したＲＡＷデータをスプーラー３５に送出する。
（１０）スプーラー３５は、描画ドライバ３９から受け取ったＲＡＷデータをプリンタ２００に送信する。
【００７５】
図８は、図７のWindows系ＯＳの印刷アーキテクチャのシーケンス図の一例である。なお、実際にはＧＤＩ３４とＵＩドライバ３８、又は、ＧＤＩ３４と描画ドライバ３９の間では、不図示の通信が行われているが省略している。また、ＥＭＦスプールでは、アプリケーションプロセスとスプールプロセスが分かれている。
【００７６】
なお、この図８のS1までにＵＩドライバ３８はユーザーが設定した印刷設定を受け付けており、ユーザーが印刷開始指示を入力するとアプリケーション３１がDEVMODEに格納された印刷設定を取得する。
【００７７】
S1: アプリケーション３１はまず、ＧＤＩ３４に印刷準備開始を指示する。具体的には、アプリケーション３１はCreateDC()関数で印刷設定を引数にしてＧＤＩ３４をコールする。
【００７８】
S1.1:ＧＤＩ３４はＡＰＩに対応するＤＤＩをコールすることで、描画ドライバ３９に印刷設定を送出する。CreateDC()の引数でアプリーションがＧＤＩ３４に渡した印刷設定が、DrvEnablePDEV()の引数に格納され描画ドライバ３９に通知される。この後、描画ドライバ３９は、ジョブが終了するまで（デバイスコンテキストが消去されるまで）印刷設定を参照することができる。
【００７９】
S2:ＧＤＩ３４が印刷準備完了をアプリケーション３１に通知すると、アプリケーション３１はＧＤＩ３４に印刷開始を指示する。具体的には、アプリケーション３１はStartDoc()関数でDocINFOなどを引数にしてＧＤＩ３４をコールする。
【００８０】
S2.1:ＧＤＩ３４はＵＩドライバ３８に印刷開始を指示する。具体的にはDrvDocumentEvent()DOCUMENTEVENT_STARTDOC()をＵＩドライバ３８に送出する。
【００８１】
S2.2: ＧＤＩ３４はＵＩドライバ３８にJobIDを送出する。具体的にはDrvDocumentEvent()DOCUMENT_STARTDOCPOST()をＵＩドライバ３８に送出する。ＧＤＩ３４はこの関数の引数にJobIDを設定するので、ＵＩドライバ３８はJobIDを参照できるようになる。この時点では描画ドライバ３９はJobIDを取得していない。
【００８２】
S3: ＧＤＩ３４が印刷開始完了をアプリケーション３１に通知すると、アプリケーション３１はページ単位の処理を繰り返す。まず、アプリケーション３１はＧＤＩ３４に新しいページの印刷データを受け入れるよう指示する。具体的には、アプリケーション３１はStartPage()をＧＤＩ３４に送出する。StartPage()によりスプールプロセスが開始される。
【００８３】
S4:アプリケーション３１は、描画関数（文書データ）をＧＤＩ３４に送出する。ＧＤＩ３４は、印刷設定に基づきＥＭＦデータを作成する。
【００８４】
S5:アプリケーション３１は１ページ分の書き込みが終了したことをＧＤＩ３４に通知する。具体的には、アプリケーション３１はEndPage()をＧＤＩ３４に送出する。
【００８５】
S6:アプリケーション３１は、全てのページの描画処理が終了すると、印刷ジョブの終了をＧＤＩ３４に通知する。具体的には、アプリケーション３１はEndDoc()をＧＤＩ３４に送出する。
【００８６】
このように、アプリケーション３１のプロセスが終了すると、印刷が完了していなくてもアプリケーション３１は印刷を終了したように見える。この後、スプールプロセスで再度印刷処理がかかり、ここでＥＭＦデータからＲＡＷデータへ変換される。
【００８７】
ＯＳ１０はアプリケーション３１とＧＤＩ３４の通信を監視して、所定のタイミングになると（例えばStartPage()の後）、スプーラー３５にスプールプロセスを開始させる。
【００８８】
S7:スプーラー３５は、プリントプロセッサ４１に印刷準備開始を指示する。
【００８９】
S7.1:プリントプロセッサ４１はＧＤＩ３４に印刷準備開始を指示する。
【００９０】
S7.1.1:ＧＤＩ３４は描画ドライバ３９に印刷設定を送出する。具体的には、CreateDC()の引数でアプリーションがＧＤＩ３４に渡した印刷設定が、DrvEnablePDEV()の引数に格納され描画ドライバ３９に通知される。この後、描画ドライバ３９は、ジョブが終了するまで（デバイスコンテキストが消去されるまで）印刷設定を参照することができる。
【００９１】
S7.1.2:ＧＤＩ３４は描画ドライバ３９に印刷開始を指示する。具体的にはDrvStartDoc()関数を描画ドライバ３９に送出する。ＯＳは、CreateDC()関数により所定のタイミングでJobIDを生成している。ＧＤＩ３４はDrvStartDoc()関数の引数にJobIDを設定するので、描画ドライバ３９はJobIDを参照できるようになる。
【００９２】
S7.2:以降、プリントプロセッサ４１はページ単位の処理を繰り返す。まず、プリントプロセッサ４１はＧＤＩ３４に新しいページの印刷データを受け入れるよう指示する。具体的には、プリントプロセッサ４１はGdiStartPageＥＭＦ()をＧＤＩ３４に送出する。
【００９３】
S7.2.1:ＧＤＩ３４はDrvStartPage()を描画ドライバ３９に送出する。
【００９４】
S7.2.2:ＧＤＩ３４は、描画関数（文書データ）を描画ドライバ３９に送出する。描画ドライバ３９は印刷設定に従って文書データを印刷データに変換する。
【００９５】
S7.2.3:ＧＤＩ３４は描画ドライバ３９に１ページ分の書き込みが終了したことを通知する。具体的には、ＧＤＩ３４はDrvSendPage()を描画ドライバ３９に送出する。以降は、ページ単位の繰り返しになる。
【００９６】
〔本実施形態のWindows系OSの印刷手順〕
印刷設定には、ユーザーが上記の対話型サービスを利用するか否かが設定されている。本実施例では、対話型サービスを利用する設定になっている。また、印刷設定には、印刷開始後に印刷設定の変更を受け付ける印刷ダイアログを表示するか否かが設定されている。この印刷ダイアログにより、ＰＣ１００やクライアントＰＣ１００は、ユーザーＩＤとパスワードの入力を要求したり、FAXの宛先（ＦＡＸ番号）の入力を要求することができる。本実施例ではこの印刷ダイアログについて簡単に説明するに留める。
【００９７】
・ＲＡＷスプール
図９は、ＲＡＷスプールのWindows系ＯＳの印刷アーキテクチャのシーケンス図の一例である。なお、実際にはＧＤＩ３４とＵＩドライバ３８、又は、ＧＤＩ３４と描画ドライバ３９の間では、不図示の通信が行われているが省略している。ＧＤＩ３４からＵＩドライバ３８へのメッセージはＵＩ系のＤＤＩ関数で、描画ドライバ３９へのメッセージは描画系ＤＤＩ関数でそれぞれ通知される。
【００９８】
図９のS1までにＵＩドライバ３８はユーザーが設定した印刷設定を受け付けており、ユーザーが印刷開始指示を入力するとアプリケーション３１がDEVMODEに格納された印刷設定を取得する。
【００９９】
S1: アプリケーション３１はまず、ＧＤＩ３４に印刷準備開始を指示する。具体的には、アプリケーション３１はCreateDC()関数で印刷設定を引数にしてＧＤＩ３４をコールする。
【０１００】
S1.1:ＧＤＩ３４はＡＰＩに対応するＤＤＩをコールすることで、描画ドライバ３９に印刷設定を送出する。CreateDC()の引数でアプリーションがＧＤＩ３４に渡した印刷設定が、DrvEnablePDEV()の引数に格納され描画ドライバ３９に通知される。この後、描画ドライバ３９は、ジョブが終了するまで（デバイスコンテキストが消去されるまで）印刷設定を参照することができる。
【０１０１】
S2:ＧＤＩ３４が印刷準備完了をアプリケーション３１に通知すると、アプリケーション３１はＧＤＩ３４に印刷開始を指示する。具体的には、アプリケーション３１はStartDoc()関数でDocINFOなどを引数にしてＧＤＩ３４をコールする。
【０１０２】
S2.1:ＧＤＩ３４はＵＩドライバ３８に印刷開始を指示する。具体的にはDrvDocumentEvent()DOCUMENTEVENT_STARTDOCPRE()をＵＩドライバ３８に送出する。
【０１０３】
S2.2:ＧＤＩ３４は描画ドライバ３９に印刷開始を指示する。具体的にはDrvStartDoc()関数を描画ドライバ３９に送出する。ＯＳ１０は、CreateDC()関数により所定のタイミングでJobIDを生成している。ＧＤＩ３４はDrvStartDoc()関数の引数にJobIDを設定するので、描画ドライバ３９はJobIDを参照できるようになる。
【０１０４】
S2.3: 同様にＧＤＩ３４はＵＩドライバ３８に印刷開始を指示する。具体的にはDrvDocumentEvent()DOCUMENTEVENT_STARTDOCPOST()をＵＩドライバ３８に送出する。ＧＤＩ３４はこの関数のIN引数にJobIDを設定するので、ＵＩドライバ３８はJobIDを参照できるようになる。
【０１０５】
S2.3.1:ＵＩドライバ３８は、ＧＤＩ３４からの呼び出しの直後、通知表示部２５２を起動する。通知表示部２５２の処理手順については図１１のフローチャート図に示す。また、ＵＩドライバ３８はこのとき、DrvDocumentEvent（DOCUMENTEVENT_STARTDOCPOST）のIN引数で渡されたJobＩＤを、通知表示部２５２の起動と共に通知する。通知表示部２５２はJobIDによりLanguage Monitor３２の描画データを識別する。
【０１０６】
このように、印刷開始により動作するＵＩドライバ３８が通知表示部２５２を起動することで、印刷開始の直後に通知表示部２５２を起動できる。
【０１０７】
ただし、この時点では通知表示部２５２はまだ、対話型画面を表示しない。後述するように通知表示部２５２は、モジュール通信部２５３が定期的にLanguage Monitorの通信部３２１と通信をして、JobIDに紐づいた描画データの生成が完了しているかどうかを確認する。
【０１０８】
S2.3.2: 次に、ＵＩドライバ３８は、印刷設定に印刷開始指示後の印刷設定の変更を受け付ける設定があるか否かを判定するため印刷設定を参照するが、描画ドライバ３９と直接通信できないので、ＧＤＩ３４にExtEscape()を送出する。
【０１０９】
S2.3.2.1:ＧＤＩ３４は描画ドライバ３９にDrvEscape()を通知する。描画ドライバ３９はＧＤＩ３４を介して保持している印刷設定をＵＩドライバ３８に送出する。
【０１１０】
S2.4:ExtEscape()の処理によりＵＩドライバ３８は、印刷設定を取得できたことになる。印刷設定に、印刷開始指示後(印刷中)に印刷設定を変更するための印刷ダイアログの表示指示が設定されている場合、ＵＩドライバ３８は印刷設定の変更を受け付けるためのポップアップ（ダイアログ）を表示し、ユーザーによる印刷設定の変更を受け付ける。
【０１１１】
通知表示部２５２はプレビューなどを表示してユーザーの操作を受け付けるプログラムであるが、この段階では描画データが作成されていない。このため、起動した通知表示部２５２は、S2.3.1.1のようにLanguage Monitor３２に描画データが作成された否かを周期的に問い合わせる（ポーリング）。
【０１１２】
S2.3.3:次に、ＵＩドライバ３８はSendRecvBidiDataFromPort()::setで、JobIDをキーとし、ユーザーが変更した印刷設定をLanguage Monitor３２に送出する（「::」は"DOCUMENTEVENT"を省略したことを意味する）。これにより、Language Monitor３２はJobIDと印刷設定を対応づけて保持することができる。この時、ユーザーがポップアップ（ダイアログ）を"OK"又は"キャンセル"どちらで閉じたのかという内容も送出される。
【０１１３】
S3: ＧＤＩ３４が印刷開始完了をアプリケーション３１に通知すると、アプリケーション３１はページ単位の処理を繰り返す。まず、アプリケーション３１はＧＤＩ３４に新しいページの印刷データを受け入れるよう指示する。具体的には、アプリケーション３１はStartPage()をＧＤＩ３４に送出する。
【０１１４】
S3.1:ＧＤＩ３４はDrvStartPage()を描画ドライバ３９に送出する。
【０１１５】
S3.1.1: 描画ドライバ３９は、一番最初のDrvStartPage()のＤＤＩコールを受けた時のみ、保持していたJobIDをキーとしてSendRecvBidiDataFromPort()::getでLanguage Monitor３２に印刷設定を要求する。ここで、Language Monitor３２には、S2.3.3でユーザーが"OK"又は"キャンセル"のどちらで閉じたかの情報を保持している。描画ドライバ３９は、"OK"でユーザーが閉じていれば、印刷設定に基づき印刷データを生成する。"キャンセル"で閉じていれば、プリンタ２００やＦＡＸ装置にデータを送信しないようにする。
【０１１６】
そして、描画ドライバ３９は、JobIDをキーにして、印刷データ（描画データが含まれる）の一部をLanguage Monitor３２に設定する。
【０１１７】
S4:アプリケーション３１は、描画ドライバ３９から応答を取得すると、描画関数（文書データ）をＧＤＩ３４に送出する。
【０１１８】
S4.1:ＧＤＩ３４は、描画関数（文書データ）を描画ドライバ３９に送出する。描画ドライバ３９は印刷設定に従って文書データを印刷データに変換する。
【０１１９】
S4.2:描画ドライバ３９は、JobIDをキーにして、印刷データ（描画データが含まれる）を随時、Language Monitor３２に設定する。
【０１２０】
S5: ＧＤＩ３４が１ページ分の描画処理の完了をアプリケーション３１に通知すると、アプリケーション３１は１ページ分の書き込みが終了したことをＧＤＩ３４に通知する。具体的には、アプリケーション３１はEndPage()をＧＤＩ３４に送出する。
【０１２１】
S5.1:ＧＤＩ３４は描画ドライバ３９に１ページ分の書き込みが終了したことを通知する。具体的には、ＧＤＩ３４はDrvSendPage()を描画ドライバ３９に送出する。
【０１２２】
S5.2:描画ドライバ３９は、JobIDをキーにして、印刷データ（描画データが含まれる）の一部をLanguage Monitor３２に設定する。
【０１２３】
S6:アプリケーション３１は、全てのページの描画処理が終了すると、印刷ジョブの終了をＧＤＩ３４に通知する。具体的には、アプリケーション３１はEndDoc()をＧＤＩ３４に送出する。
【０１２４】
S6.1:ＧＤＩ３４はＵＩドライバ３８に描画の終了を通知する（具体的にはDOCUMENTEVENT_ENDDOC_PREを通知する）。
【０１２５】
S6.1.1:ＵＩドライバ３８は描画が終わったジョブのJobIDを知るためExtEscape()関数を呼び出す。
【０１２６】
S6.1.2:ＵＩドライバは、ＧＤＩ３４を経由して描画ドライバ３９からJobIDを取得する。
【０１２７】
S6.1.3:ＵＩドライバ３８はSendRecvBidiDataFromPort()をLanguage Monitorに送信して、JobIDと共に描画データの作成完了を設定する。
【０１２８】
S2.3.1.1:この後、アプリケーション側の処理は従来と同様である。これに対し、通知表示部２５２（通知用モジュールのモジュール通信部）はLanguage Monitor３２に周期的に問い合わせることで、描画データの設定が完了したことを検出する。
【０１２９】
S2.3.1.2: Language Monitor３２から描画データの設定が完了したという応答を取得すると、通知表示部２５２は、JobIDをキーにして描画データをLanguage Monitor３２から取得して、印刷プレビューを含む対話型画面を表示する。ユーザーは印刷プレビューを見て印刷のＯＫ（継続）又はキャンセルを選択する。
S2.3.1.3:通知表示部２５２は、JobIDをキーにして、対話型画面を表示したということと、ＯＫ又はキャンセルの選択結果をLanguage Monitor３２に設定する。
S2.3.1.4: ユーザーが対話型画面をＯＫで閉じると、通知表示部２５２は表示を終了する。これにより「OKで終了した」という情報が通知用モジュールからLanguage Monitor３２に渡され、それを描画ドライバが取得し、描画データをプリンタへ送信する処理を開始する。
【０１３０】
・ＥＭＦスプール
図１０は、ＥＭＦスプールのWindows系ＯＳの印刷アーキテクチャのシーケンス図の一例である。なお、実際にはＧＤＩ３４とＵＩドライバ３８、又は、ＧＤＩ３４と描画ドライバ３９の間では、不図示の通信が行われているが省略している。
【０１３１】
図１０のS1までにＵＩドライバ３８はユーザーが設定した送信設定を受け付けており、ユーザーが送信開始指示を入力するとアプリケーション３１がDEVMODEに格納された送信設定を取得する。
【０１３２】
S1: アプリケーション３１は、まず、ＧＤＩ３４に印刷準備開始を指示する。具体的には、アプリケーション３１はCreateDC()関数で印刷設定を引数にしてＧＤＩ３４をコールする。
【０１３３】
S1.1:ＧＤＩ３４はＡＰＩに対応するＤＤＩをコールすることで、描画ドライバ３９に印刷設定を送出する。CreateDC()の引数でアプリーションがＧＤＩ３４に渡した印刷設定が、DrvEnablePDEV()の引数に格納され描画ドライバ３９に通知される。この後、描画ドライバ３９は、ジョブが終了するまで（デバイスコンテキストが消去されるまで）印刷設定を参照することができる。
【０１３４】
S2:ＧＤＩ３４が印刷準備完了をアプリケーション３１に通知すると、アプリケーション３１はＧＤＩ３４に印刷開始を指示する。具体的には、アプリケーション３１はStartDoc()関数でDocINFOなどを引数にしてＧＤＩ３４をコールする。
【０１３５】
S2.1:ＧＤＩ３４はＵＩドライバ３８に印刷開始を指示する。具体的にはDrvDocumentEvent()DOCUMENTEVENT_STARTDOC()をＵＩドライバ３８に送出する。
【０１３６】
S2.2: ＧＤＩ３４はＵＩドライバ３８にJobIDを送出する。具体的にはDrvDocumentEvent()DOCUMENTEVENT_STARTDOCPOST()をＵＩドライバ３８に送出する。ＧＤＩ３４はこの関数のIN引数にJobIDを設定するので、ＵＩドライバ３８はJobIDを参照できるようになる。この時点では描画ドライバ３９はJobIDを取得していない。
【０１３７】
S2.2.1:ＵＩドライバ３８は、ＧＤＩ３４からの呼び出しの直後、通知表示部２５２を起動する。通知表示部２５２の処理手順については図１１のフローチャート図に示す。また、ＵＩドライバ３８はこのとき、DrvDocumentEvent（DOCUMENTEVENT_STARTDOCPOST）のIN引数で渡されたジョブＩＤを、通知表示部２５２の起動と共にJobIDを通知する。通知表示部２５２はJobIDによりLanguage Monitor３２の描画データを識別する。
【０１３８】
ただし、この時点では通知表示部２５２はまだ、対話型画面を表示しない。後述するように通知表示部２５２は、モジュール通信部２５３が定期的にLanguage Monitorの通信部３２１と通信をして、JobIDに紐づいた描画データの生成が完了しているかどうかを確認する。
【０１３９】
S2.2.2: ここでＵＩドライバ３８は、印刷設定に印刷開始指示後の印刷設定の変更を受け付ける設定があることを検出する。このため、ＵＩドライバ３８は、ポップアップ表示の処理を開始する。ＵＩドライバ３８は、デバイスコンテキストを引数として、ＧＤＩ３４に対しExtEscape()をコールする。
【０１４０】
S2.2.2.1:ＧＤＩ３４は、DrvEcape()のＤＤＩコールを描画ドライバ３９に送出することで、描画ドライバ３９が保持している印刷設定を要求する。描画ドライバ３９はＧＤＩ３４を介して保持している印刷設定をＵＩドライバ３８に送出する。
【０１４１】
S2.4:ExtEscape()の処理によりＵＩドライバ３８は、印刷設定を取得できたことになる。印刷設定に、印刷開始指示後(印刷中)に印刷設定を変更するための印刷ダイアログの表示指示が設定されている場合、ＵＩドライバ３８はユーザーによる印刷設定の変更を受け付ける。
【０１４２】
S2.2.3:ユーザーが印刷ダイアログを閉じることで、ＵＩドライバ３８はSendRecvBidiDataFromPort()::setで、JobIDをキーとし、ユーザーが変更した印刷設定をLanguage Monitor３２に送出する。これにより、Language Monitor３２はJobIDと印刷設定を対応づけて保持することができる。この時、ユーザーがダイアログを"OK"又は"キャンセル"どちらで閉じたのかという内容も送出される。S3〜S6について従来と同様なので省略する。
【０１４３】
アプリケーションプロセスでの印刷(ＥＭＦデータの生成)が終了するが、アプリケーションプロセスにおいてすでに通知表示部２５２が起動している。
【０１４４】
この後、スプーラー３５のプロセスで再度印刷処理がかかり、ここでＥＭＦデータからＲＡＷデータへ変換される。ＯＳ１０はアプリケーション３１とＧＤＩ３４の通信を監視して、所定のタイミングになると（例えばStartPage()の後）、スプーラー３５にプロセスを開始させる。
【０１４５】
S7:スプーラー３５は、プリントプロセッサ４１に印刷準備開始を指示する。
【０１４６】
S7.1:プリントプロセッサ４１はＧＤＩ３４に印刷準備開始を指示する。
【０１４７】
S7.1.1:ＧＤＩ３４は描画ドライバ３９に印刷設定を送出する。具体的には、CreateDC()の引数でアプリーションがＧＤＩ３４に渡した印刷設定が、DrvEnablePDEV()の引数に格納され描画ドライバ３９に通知される。この後、描画ドライバ３９は、ジョブが終了するまで（デバイスコンテキストが消去されるまで）印刷設定を参照することができる。
【０１４８】
S7.1.2:ＧＤＩ３４は描画ドライバ３９に印刷開始を指示する。具体的にはDrvStartDoc()関数を描画ドライバ３９に送出する。ＯＳ１０は、CreateDC()関数により所定のタイミングでJobIDを生成している。ＧＤＩ３４はDrvStartDoc()関数の引数にJobIDを設定するので、描画ドライバ３９はJobIDを参照できるようになる。
【０１４９】
S7.2:以降、プリントプロセッサ４１はページ単位の処理を繰り返す。まず、プリントプロセッサ４１はＧＤＩ３４に新しいページの印刷データを受け入れるよう指示する。具体的には、プリントプロセッサ４１はGdiStartPageEMF()をＧＤＩ３４に送出する。
【０１５０】
S7.2.1:ＧＤＩ３４はDrvStartPage()を描画ドライバ３９に送出する。
【０１５１】
S7.2.1.1: 描画ドライバ３９は、一番最初のDrvStartPage()のＤＤＩコールを受けた時のみ、保持していたJobIDをキーとしてSendRecvBidiDataFromPort()::getでLanguage Monitor３２に印刷設定を要求する。ここで、Language Monitor３２には、S2.2.3の印刷ダイアログをユーザーが"OK"又は"キャンセル"のどちらで閉じたかの情報を保持している。描画ドライバ３９は、"OK"でユーザーが閉じていれば、印刷設定に基づき印刷データを生成する。"キャンセル"で閉じていれば、プリンタ２００やFAXにデータを送信しないようにする。
【０１５２】
また、描画ドライバ３９は、JobIDをキーにして、印刷データ（描画データが含まれる）の一部をLanguage Monitor３２に設定する。
【０１５３】
S7.2.2:ＧＤＩ３４は、描画関数（文書データ）を描画ドライバ３９に送出する。描画ドライバ３９は印刷設定に従って文書データを印刷データに変換する。
【０１５４】
S7.2.2.1:描画ドライバ３９は、JobIDをキーにして、印刷データ（描画データが含まれる）を随時、Language Monitor３２に設定する。
【０１５５】
S7.2.3:ＧＤＩ３４は描画ドライバ３９に１ページ分の書き込みが終了したことを通知する。具体的には、ＧＤＩ３４はDrvSendPage()を描画ドライバ３９に送出する。
【０１５６】
S7.2.3.1:描画ドライバ３９は、JobIDをキーにして、印刷データ（描画データが含まれる）の一部をLanguage Monitor３２に設定する。
【０１５７】
S7.3:描画ドライバ３９が描画を完了すると、プリントプロセッサがＧＤＩにGdEndDocEMF()を出力する。
【０１５８】
S7.3.1:ＧＤＩ３４はＵＩドライバ３８に、DOCUMENTEVENT(ENDDOC)を出力することで描画の終了を通知する。
【０１５９】
S7.3.2:ＵＩドライバ３８は、（スプール形式がＥＭＦの場合のみ）、ExtExcape()を呼び出して描画ドライバからJobIDを取得する。これは、DrvDocumentEvent（ENDDOC）のIN引数でJobDは通知されないためである。
【０１６０】
S7.3.2.1: ＧＤＩは、DrvExcape()を呼び出して描画ドライバからJobIDを取得する。
【０１６１】
S7.3.1.1:次に、ＵＩドライバは、Language Monitor（の通信部）に対して、取得したJobIDにひもづいた描画データの生成が完了したことを通知する（記録する）。
【０１６２】
S7.3.3:ＧＤＩは描画ドライバに描画終了を通知する。
【０１６３】
S7.3.3.1:描画ドライバはLanguage Monitorに対話型画面の表示が終わったか否かを問い合わせ、終わったらＧＤＩに通知する。この問い合わせは、描画データの生成が完了したことをLanguage Monitorに通知することで、対話型画面が表示されるためである。
【０１６４】
S2.2.1.1:この後、通知表示部２５２はLanguage Monitor３２に周期的に問い合わせることで、描画データの設定が完了したことを検出する。
【０１６５】
S2.2.1.2: Language Monitor３２から描画データの設定が完了したという応答を取得すると、通知表示部２５２は、JobIDをキーにして描画データをLanguage Monitor３２から読み出し、印刷プレビューを含む対話型画面を表示する。ユーザーは印刷プレビューを見て印刷の継続（継続）又はキャンセルを選択する。
【０１６６】
S2.2.1.3:通知表示部２５２は、JobIDをキーにして、対話型画面を表示したということと、継続又はキャンセルの選択結果をLanguage Monitor３２に設定する。
【０１６７】
S2.2.1.4: ユーザーが対話型画面をＯＫで閉じると、通知表示部２５２は表示を終了する。描画ドライバが取得した描画データをプリンタへ送信する処理を開始する。
【０１６８】
・通知表示部２５２の処理手順
図１１は、通知表示部２５２の処理手順を示すフローチャート図の一例である。
印刷処理が開始されると、ＵＩドライバ３８が通知表示部２５２を起動する（Ｓ１０）。この処理は図9のS2.3.2、図１０のS2.2.2に相当する。
【０１６９】
通知表示部２５２はLanguage Monitor３２に対して「描画ドライバによるデータ生成が完了したかどうか」の問い合わせをポーリングし続ける（Ｓ２０）。
【０１７０】
描画ドライバ３９による描画データの生成が完了したら（Ｓ３０のＹｅｓ）、通知表示部２５２はLanguage Monitor３２から描画データを取得して対話型画面を表示する（Ｓ４０）。
【０１７１】
ユーザーはＯＫ（継続）又はキャンセルを押下するので、通知表示部２５２はＯＫで終了したか否かを判定する（Ｓ５０）。ＯＫで終了しなかった場合（Ｓ５０のＮｏ）、描画ドライバ３９は印刷を中止する。Language Monitor３２の印刷データは破棄される。
【０１７２】
ＯＫで終了した場合（Ｓ５０のＹｅｓ）、描画ドライバ３９は印刷データをスプーラー３５に送信する（Ｓ６０）。この処理は通常の印刷シーケンスと同様である。
【０１７３】
プリンタ２００はスプーラー３５から送信された印刷データを印刷する（Ｓ６０）。
【０１７４】
以上説明したように、通知用モジュール２５がアプリケーション３１からの印刷指示の直後に起動されるので、アプリケーションプロセスで起動された通知用モジュール２５が印刷プレビューなどの対話型サービスの表示を行うことができる。このため、ＥＭＦスプールにおいて（ＲＡＷスプールにおいても）警告画面が表示されることを防止できる。
【実施例２】
【０１７５】
本実施例ではプリンタドライバがPoint & Printインストールされた場合の印刷手順について説明する。Point & Print環境でＲＡＷスプールした場合、レンダリング場所はクライアント１２０になるので、実施例１のＲＡＷスプールと処理手順は同様である。Point & Print環境でＥＭＦスプールした場合、レンダリング場所はクライアント１２０とサーバー１１０の２つの場合あるが、このうちレンダリング場所をクライアント１２０とした場合は、実施例１のＥＭＦスプールと処理手順は同様になる。
【０１７６】
また、レンダリング場所をサーバー１１０とした場合は、描画ドライバ３９が動作する場所はサーバー１１０となるが、以下で説明するように、印刷処理全体の処理手順は実施例１のＥＭＦスプールと同様になる。
【０１７７】
図１２は、クライアント１２０とサーバー１１０の機能ブロック図の一例を示す。図１２と図４との共通部については主要部のみを説明する。
【０１７８】
クライアント１２０のプリンタドライバ３０は、ＵＩドライバ３８と通知用モジュール２５を有している。Point & Printインストールのサーバーサイドレンダリングではクライアント１２０の描画ドライバは描画データを作成しないが、アプリケーション３１が必要な情報を取得する際に動作する。「クライアントサイドレンダリング」の際にはクライアント１２０の描画ドライバが動作する。
【０１７９】
また、サーバーサイドレンダリングでは、実施例１で説明したLanguage Monitor３２の機能は、サーバー１１０のLanguage Monitor３２により提供される。しかし、サーバ側のLanguage Monitor３２とデータを共有するため、クライアント１２０でもLanguage Monitor３２が使用される。クライアント１２０のLanguage Monitor３２はサーバのLanguage Monitor３２と通信して、描画データを取得する。
【０１８０】
サーバー１１０は、プリンタドライバ３０、スプーラー３５、プリントプロセッサ４１、Language Monitor３２、ポートモニター３３、及び、ポートドライバー４２を有する。プリンタドライバ３０は、ＵＩドライバ３８及び通知用モジュール２５を有していないが、実際には描画ドライバ３９と共にインストールされている。ＰＣ側の通知用モジュール起動部２２はスプーラー３５と通信できる。
【０１８１】
この他の、スプーラー３５、プリントプロセッサ４１、Language Monitor３２、ポートモニター３３、及び、ポートドライバー４２は実施例１でＰＣ１００が有していたものと同じものである。
【０１８２】
クライアント１２０のＯＳとサーバー１１０のＯＳはどちらもWindowsなので、サーバーサイドレンダリングでは、クライアント１２０とサーバー１１０から、Language Monitor３２を同一のインスタンスとして扱うことができる。
【０１８３】
すなわち、ＥＭＦスプールのサーバーサイドレンダリングでは、ＧＤＩ３４がクライアント１２０でＥＭＦデータを作成し、クライアント１２０のスプーラー３５に送出する。クライアント１２０のスプーラー３５は、ＯＳを介してサーバー１１０のスプーラー３５にＥＭＦデータを送信する。この後、スプールプロセスがサーバー１１０で実行され、Language Monitor３２に描画データが格納される。通知用モジュール２５がクライアント１２０のLanguage Monitor３２に描画データを要求した場合、ＯＳを介してサーバー１００のLanguage Monitor３２から描画データを取得できる。
【０１８４】
つまり、通知用モジュール２５はLanguage Monitor３２がどこにあるかを意識する必要がない。このため、印刷手順としてはスプールプロセスがサーバー１１０で実行されるだけで、全体的な手順は実施例１の図１０と同様になる。
【０１８５】
図１０で示したアプリケーションプロセスのモジュールはクライアント１２０でインスタンス化され、スプールプロセスのモジュールはサーバー１１０でインスタンス化される。しかしながら、本実施例で主要の機能を提供するのは図１２に示したモジュールである。
【０１８６】
このため、Point & PrintのＥＭＦスプールでは以下のような動作となる。
(i)  クライアント１２０のＵＩドライバ３８は、アプリケーション３１からの印刷指示の直後に通知用モジュール２５を起動しておく（S2.2.1）。
(ii)  ＥＭＦデータを作成したクライアント１２０のＯＳは、スプールプロセスを開始するようサーバーに指示する。サーバー１１０にある描画ドライバ３９は描画データを作成する（図１０のＡ）。
(iii)  サーバー１１０の描画ドライバ３９のドライバ通信部２４は、サーバー側のLanguage Monitor３２にJobIDと紐づけて描画データを保持させる（S7.2.1.1、S7.2.2.1、S7.2.3.1）。ＵＩドライバ３８が描画データの作成完了をサーバー側のLanguage Monitor３２に設定する。
(iv)  サーバー側のＵＩドライバがDrvDocumentEvent（ENDDOC）を呼び出されると描画データの生成が完了しているので、ＵＩドライバはExtExcape()を呼び出して描画ドライバからJobIDを取得する。次に、ＵＩドライバの通知用モジュール起動部が、Language Monitorに対して取得したJobIDにひもづいた描画データの生成が完了したことを通知する。
(v)  クライアント側の通知用モジュール２５のモジュール通信部２５３は、スプーラー３５を介してクライアント１２０のLanguage Monitor３２に描画データの作成が完了したか否かを問い合わせる（S2.2.1.1）。クライアント１２０のLanguage Monitor３２は、ＯＳの機能を使用してサーバー１１０のLanguage Monitor３２に描画データの作成が完了したか否かを問い合わせる。描画データの作成が完了している場合、クライアント１２０のLanguage Monitor３２は、サーバー１１０のLanguage Monitor３２から描画データを取得する。
(vi)  通知表示部２５２はクライアント１２０のLanguage Monitor３２から描画データを取得して、対話型画面としてユーザーに通知する（S2.2.1.2）。
【０１８７】
このように、Point & Print環境の「サーバーサイドレンダリング」において、プリンタドライバ３０は対話型サービスでユーザーに通知することができる。
【０１８８】
したがって、本実施例によれば、インストール環境に関係なくプリンタドライバ３０は対話型サービスでユーザーに通知することができる。
【０１８９】
なお、図１２の構成は一例であって、クライアント１２０とサーバー１１０のいずれかが図４の機能を提供すればよいものである。
【０１９０】
また、サーバー１１０が複数台あってもよい。クライアント１１０と複数のサーバー１２０のいずれかが図４の機能を提供すればよいものである。また、例えば、プリンタドライバ３０のインストール用のサーバーと、レンダリング用のサーバーが異なっていてもよい。
【０１９１】
以上説明したように、本実施形態のプリントドライバは、スプール形式やインストール形式に拘わらず、プリントドライバが生成したデータを利用して対話型サービスを提供することが可能なプログラムを提供することができる。
【０１９２】
また、この実施形態で説明するシステム構成は一例であり、用途や目的に応じて様々なシステム構成例があることはいうまでもない。
【実施例３】
【０１９３】
実施例１、２では、
（１）ＥＭＦスプールによる印刷処理の場合に、Windowsによる警告画面が表示されてしまう
（２）Point & Print環境で「サーバーサイドレンダリング」を行う場合、対話型サービスでユーザーに通知することができない
という課題を解決できた。
【０１９４】
しかしながら、なお、以下のような課題がある。
（３）ＲＡＷスプールによる印刷処理の場合に、６４bit ＯＳ上で３２bitアプリケーションから印刷指示を行うとExtEscape() APIが正しく動作しない場合がある。
【０１９５】
３２bitアプリケーションはＷＯＷ６４（Windows 32-bit on Windows 64-bit）というWindowsの機能によって６４bit ＯＳ上で動作することができる。６４bit ＯＳ上で３２bitアプリケーションから印刷指示を行うと、ＲＡＷスプールによる印刷処理の場合、３２bitアプリケーション上のプロセスから６４bit版のプリンタドライバのインスタンスが生成されることから、ある特定のタイミングでExtEscape() APIの呼び出しが正しく行えない現象が生じる。
【０１９６】
より具体的には、ＵＩドライバ３８がExtEscape()を呼び出して描画ドライバ３９からJobIDを取得し、JobIDに紐付いた描画データの生成が完了したことをLanguage Monitor３２に対して通知することで、通知用モジュールの表示が行える。しかし、６４bit ＯＳ上で動作する３２bitアプリケーションから印刷指示された場合には、この処理シーケンスが正しく動作しない。
【０１９７】
６４bit ＯＳ上で動作する３２bitアプリケーションから印刷指示された場合、DrvDocumentEvent()のENDDOCイベント時にＵＩドライバ３８がExtEscape()をコールすると、splwow64.exe（６４bitのWindows系ＯＳが印刷時にＷＯＷ６４の機能として、実行する代理プロセス）で例外が発生し、描画ドライバ３９のDrvEscape()が正しく呼び出されないためである。
【０１９８】
そこで、本実施例では、下記の処理シーケンスにより上記の不都合を回避する。なお、下記の処理シーケンスはＲＡＷスプールでの印刷時にのみ有効である。なぜならば、ＥＭＦスプール時にはＵＩドライバ３８のインスタンスはアプリケーションから生成されたものではなく、スプーラープロセスから新たにインスタンス化されたものであるため、ＵＩドライバ３８は後述するグローバルメモリが利用できないからである。
【０１９９】
しかし、ＥＭＦスプール時にはスプーラープロセスから新たにＵＩドライバ３８がインスタンス化されるため、ExtEscape()のコール時にsplwow64.exeで例外が発生するという問題は発生しないので不都合はない。
【０２００】
図１３は、本実施例のＰＣの機能ブロック図の一例である。本実施例ではＰＣ内にグローバルメモリ４３が配置される。このグルーバルメモリはインスタンス化されたＵＩドライバ３８が任意のタイミングでアクセスできるメモリである。具体的にはＲＡＭ１３上の一部である。
【０２０１】
本実施例では、ＲＡＭスプールでの印刷時には、ＵＩドライバ３８が、ＯＳから渡されたJobIDをデバイスコンテキストと紐付けてグローバルメモリ４３に記憶する。そして、ＵＩドライバ３８が、ＯＳから描画データ生成完了の通知を受けた際に、デバイスコンテキストと紐付けてグローバルメモリ４３に保持していたJobIDを読み出す。そして、Language Monitor３２に対してJobIDと紐付いている描画データの生成完了を通知する。通知用モジュールはLanguage Monitor３２と通信して、描画データをLanguage Monitor３２から取得する。通知用モジュールは取得した描画データを用いて、対話型サービスを提供する。
【０２０２】
したがって、描画データ生成完了時に、ＵＩドライバ３８がExtEscape()を呼び出して描画ドライバ３９からJobIDを取得しないので、splwow64.exeの例外が発生することがない。
【０２０３】
図１４は、本実施例のＲＡＷスプールのWindows系ＯＳの印刷アーキテクチャのシーケンス図の一例である。全体的な流れは実施例１の図９と同様であるので、主に本実施例の特徴部を説明する。
【０２０４】
S2.3.1.1：通知用モジュールを起動したＵＩドライバ３８は、デバイスコンテキストのハンドル（ＨＤＣ）と紐付けてJobIDをグローバルメモリ４３に記録しておく。
【０２０５】
S6.1:  描画ドライバ３９が描画を完了するとＧＤＩ３４はＵＩドライバ３８に描画の終了を通知する（具体的にはDOCUMENTEVENT_ENDDOC_PREを通知する）。
【０２０６】
S6.1.1:ＵＩドライバ３８はＨＤＣをキーにして、グローバルメモリ４３からJobIDを読み出す。
【０２０７】
S6.1.2:ＵＩドライバ３８はSendRecvBidiDataFromPort()をLanguage Monitor３２に送信して、JobIDと共に描画データの作成完了を設定する。
【０２０８】
すなわち、DOCUMENTEVENT_ENDDOC_PRE関数の引数にはJobIDが含まれないため、ＵＩドライバ３８が ExtEscape()を呼び出して描画ドライバ３９からJobIDを受け取りたることが考えられる。しかし、６４bit ＯＳ上で動作する３２bitアプリケーションから印刷指示をされた場合は、このExtEscape()の呼び出しが失敗してしまう。そこで、本実施例では、DrvDocumentEvent(ENDDOCPRE)の引数にＨＤＣがふくまれることを利用して、ＨＤＣに紐付いているJobIDをグローバルメモリ４３から取得する。
【０２０９】
ＵＩドライバ３８がLanguage Monitor３２にJobIDと描画データの作成完了を記録することで、Language Monitor３２を監視していた通知用モジュールが描画データの完了を検出できるので、描画データを取得し、対話型画面を表示できる。
【０２１０】
ユーザーが対話型画面で"ＯＫ"を選択すると、「OKで終了した」という情報が通知用モジュールからLanguage Monitor３２に記録される。この後、描画ドライバ３９は、描画処理終了の通知を受けて、Language Monitor３２の「OKで終了した」という情報を読み出すと、プリンタ側に描画データを送信する。Point & Print環境の場合は、サーバー側の描画ドライバ３９がLanguage Monitor３２の「OKで終了した」という情報を取得し、描画データをプリンタへ送信する処理を開始する。
【０２１１】
以上説明したように、本実施形態のプリンタドライバは、ＲＡＷスプールによる印刷処理の場合に、６４bit ＯＳ上で３２bitアプリケーションから印刷指示を行っても、描画データを用いた対話型画面を表示することができる。
【０２１２】
〔コマンド例などについて〕
以下では、本実施形態で使用したWindows系OSのＡＰＩや機能について補足する。これらの機能はWindows系OSの説明だが、同等の機能を有する他のＯＳにおいても適用可能である。
【０２１３】
図１７は、LanguageMonitor３２の動作を説明する図の一例である。LanguageMonitor３２はプリントプロセッサ４１から送信された印刷データを受け取り、ポートモニタ３３に送信する。ポートモニタ３３は、通信プロトコルに基づく処理を行い、ポートドライバ４２に印刷データを送信する。ポートドライバ４２は、プリンタ２００とＰＣ１００との接続インタフェース（USB,NIC等）を制御して、印刷データをプリンタ２００に送信する。
【０２１４】
図１８（ａ）は、DrvDocumentEvent()関数の書式を説明する図の一例である。DrvDocumentEvent()関数は、文書データの印刷に関連する特定のイベントを処理するＤＬＬである。
・hPrinterは、プリンタのハンドルである。
・hdcは、デバイスコンテキストのハンドルである。
・iEscは、呼び出し元のモジュールが提供する、処理対象のイベントを識別するためのエスケープコードである。
・cbInはpvInで送信されるデータのサイズである。
・pvInは送信されるデータのポインタである。
・cbOutは、iEscがDOCUMENTEVENT_ESCAPEの場合は、ExtEscape()のcbOutputパラメータとして関数が指定した値が格納される。iEscがDOCUMENTEVENT_QUERYFILTERの場合、受け取り側が受け取る構造体pvOutのサイズが格納される。
・pvOutは、受け取り側が受け取る構造体pvOutのポインタである。
【０２１５】
本実施例では、DrvDocumentEvent()関数は、CreateDC()以降の印刷中、ＧＤＩ３４等が描画ドライバ３９を呼び出すＤＤＩコールの間に、適宜、コールされる。DrvDocumentEvent()は単独の処理を行うためのＤＤＩなので、前後のDrvDocumentEvent()間でデータの共有はできない。この点で、描画ドライバ３９を呼び出すＤＤＩとは異なる。ＵＩ系のＤＤＩなのでダイアログ表示をすることも可能である。
【０２１６】
また、引数にデバイスコンテキスト（ｈｄｃ）があるため、DrvDocumentEvent()のＤＤＩコールの後、モジュールがデバイスコンテキストを必要とするＡＰＩをコールすることができる。例えば、ＵＩドライバ３８がデバイスコンテキストを引数に描画系ＡＰＩをコールすると、対応している描画ドライバ３９に対して描画命令を通知することができる。
【０２１７】
図１８（ｂ）は、SendRecvBidiDataFromPort()の書式を説明する図の一例である。SendRecvBidiDataFromPort()関数は、LanguageMonitor３２に実装される関数である。プリンタドライバ３０と同じようにLanguageMonitor３２にもＯＳ１０によって決められたI/Fが存在する。SendRecvBidiDataFromPort()関数は、その１つであり、アプリケーションとプリンタ間、アプリケーションとプリントサーバ間の双方向通信をサポートする。
・hPortは、呼び出し元のモジュールによって与えられるポートのハンドルである。
・dwAccessBitは、呼び出し元のモジュールによって与えられ、プリンタ又はプリントサーバへのアクセスを許可するACCESS_MASK構造体である。
・pActionは、呼び出し元のモジュールによって与えられるリクエストアクションである。
・pReqDataは、リクエストデータを有しているPBIDI_REQUEST_CONTAINER構造体のポインタである。
・ppResDataは、レスポンスデータを有しているBIDI_RESPONSE_CONTAINER構造体のアドレスを受け取るメモリ領域へのポインタである。
【０２１８】
図１９（ａ）はExtEscape()関数の書式を説明する図の一例である。ExtEscape()関数は、モジュール（シーケンス図や機能ブロック図の各ブロック）がＧＤＩ経由ではアクセスできない特定のモジュールにアクセスするためのＡＰＩである。アプリケーションがＧＤＩ３４を関与させずにドライバにデータを送信する場合、モジュールからＧＤＩ３４を関与させずにデータを取得する場合に利用されることがある。
・hdcはデバイスコンテキストのハンドルである。
・nEscapeはExtEscape()関数の機能をチェックしたり設定するための引数になる。
・cbInputは、ExtEscape()関数で送信する構造体のサイズである。
・lpszInDataは、ExtEscape()関数で送信する構造体のポインタである。
・cbOutputは、ExtEscape()関数で送信される構造体を受け取る構造体のサイズである。
・lpszOutDataは、ExtEscape()関数で送信される構造体を受け取る構造体のポインタである。
【０２１９】
ExtEscape()関数は、CreateDC()により取得されたデバイスコンテキストに対して、コール可能なＡＰＩである。よって、ＵＩドライバ３８等はシーケンス処理中のデバイスコンテキストがある範囲でExtEscape()関数をコールすることができる。
【０２２０】
図１９（ｂ）は、アプリケーションがExtEscape()をコールした場合のシーケンス図の一例を示す。
(i)アプリケーションがＧＤＩ３４に対しExtEscape()をコールする。
(ii)ＧＤＩ３４はExtEscape()をDrvEscape()というＤＤＩコールに変換して描画ドライバ３９に通知する。
【０２２１】
また、この逆に描画ドライバ３９又はＵＩドライバ３８がExtEscape()をコールすることも可能である。ExtEscape()はCreateDC()〜DeleteDC()間であれば、各モジュールがコールできる。
【０２２２】
図２０は、Point&Print環境におけるLanguageMonitor３２の位置づけを説明する図の一例である。LanguageMonitor３２はWindows系ＯＳの印刷アーキテクチャの中に組み込まれる一モジュールである。このため、Point&PrintによりクライアントＰＣ側がＵＩドライバ３８の処理を、サーバＰＣ側が描画ドライバ３９の処理を受け持ったとしても、LanguageMonitor３２はサーバＰＣ側で１つだけ機能する。このため、クライアントＰＣのプリンタドライバ３０とサーバＰＣ１１０のプリンタドライバ３０は1つのLanguageMonitor３２にアクセスする。すなわち、クライアントＰＣのＯＳ１０とサーバＰＣのＯＳ１０は、クライアントＰＣのＵＩドライバ３８がLanguageMonitor３２にアクセスする場合、クライアントＰＣとサーバＰＣ１１０の通信を確立する（例えば、ＲＰＣ（Remote Procedure Call）を利用する）。そして、ＵＩドライバ３８がクライアントＰＣのLanguageMonitor３２にアクセスしているように見せる。
【０２２３】
このようにクライアントＰＣとサーバＰＣ１１０が同じWindows系のＯＳ１０をインストールしているので、Windows系OSの印刷アーキテクチャのLanguageMonitor３２を共通に利用できる。このため、メーカ独自で開発したモジュールなどで生じやすいアクセス権限や通信エラーなどが起こりにくい。また、同様の理由で、ＯＳ１０との親和性も高い。
【０２２４】
なお、Point＆Printでもスプール形式にはＲＡＷスプールとＥＭＦスプールがあるが、ＲＡＷスプールの場合、サーバサイドレンダリングが存在しない。ＲＡＷスプールはアプリケーションのプロセスなので、レンダリング場所が制限されるためである。
【０２２５】
その他の場合、ＲＡＷスプールのクライアントサイドレンダリング、ＥＭＦスプールのクライアントサイドレンダリング、及び、ＥＭＦスプールのサーバサイドレンダリング、のいずれの場合も、図２０のようにLanguageMonitor３２が利用される。
【符号の説明】
【０２２６】
１０    ＯＳ
２２    通知用モジュール起動部
２５    通知用モジュール
３０    プリンタドライバ
３２    Language Monitor
３８    ＵＩドライバ
３９    描画ドライバ
４３    グローバルメモリ
１００  ＰＣ
１１０  クライアント
１２０  サーバー
２００  プリンタ
５００  印刷システム
【先行技術文献】
【特許文献】
【０２２７】
【特許文献１】特開２００２‐３３３９６８号公報
【特許文献２】特開２０１０‐０６６８７６号公報
【図１】
2014041599.tif 000003
【図２】
2014041599.tif 000004
【図３】
2014041599.tif 000005
【図４】
2014041599.tif 000006
【図５】
2014041599.tif 000007
【図６】
2014041599.tif 000008
【図７】
2014041599.tif 000009
【図８】
2014041599.tif 000010
【図９】
2014041599.tif 000011
【図１０】
2014041599.tif 000012
【図１１】
2014041599.tif 000013
【図１２】
2014041599.tif 000014
【図１３】
2014041599.tif 000015
【図１４】
2014041599.tif 000016
【図１５】
2014041599.tif 000017
【図１６】
2014041599.tif 000018
【図１７】
2014041599.tif 000019
【図１８】
2014041599.tif 000020
【図１９】
2014041599.tif 000021
【図２０】
2014041599.tif 000022