(57)【要約】【課題】Ｖ４ドライバーが提供する印刷設定編集モジュールにおいて、膨大な印刷設定項目に対しても効率的に印刷設定情報を編集する手段を提供する。【解決手段】印刷設定編集モジュールにおいて、機種依存情報を保持したデータを用いることで、効率よく印刷設定編集を行いパフォーマンスの低下を抑制する。【選択図】  図２
2015225481.tif 000002
【特許請求の範囲】
【請求項１】
ＸＭＬ形式で記述された印刷設定能力情報および印刷設定情報を用いた印刷設定変更機能を有するプリンタードライバーが提供する印刷設定編集モジュールにおいて、
機種依存情報を保持しているデータファイルからパラメータ情報を取得する手段と、
パラメータ情報を利用して、印刷設定能力情報および印刷設定情報を編集する手段と、
ユーザーが設定した印刷設定に応じて、印刷設定能力情報および印刷設定情報を編集する手段と、
印刷設定情報の値をＤＥＶＭＯＤＥに登録する手段と、
ＤＥＶＭＯＤＥに登録された値を印刷設定情報に反映する手段を有し、
これらの処理を膨大な印刷設定情報においても効率的に行うことを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、新しいアーキテクチャにおけるプリンタードライバーの印刷設定処理を行うプログラムに関する。
【背景技術】
【０００２】
Ｍｉｃｒｏｓｏｆｔ社のＷｉｎｄｏｗｓ（登録商標）８では、Ｖ４プリンタードライバーと呼ばれる新しいアーキテクチャで動作するプリンタードライバーが導入された。Ｖ４プリンタードライバーは、Ｖ３プリンタードライバーのアーキテクチャとして提供されていたＸＰＳ（ＸＭＬ  Ｐａｐｅｒ  Ｓｐｅｃｉｆｉｃａｔｉｏｎ）プリンタードライバーの後継となるアーキテクチャであり、ＸＰＳドキュメントを利用した印刷パスを利用している。
【０００３】
このＸＰＳ印刷パスにおいて、印刷物の体裁を決定するために利用されるものがＰｒｉｎｔＣａｐａｂｉｌｉｔｉｅｓと呼ばれるＸＭＬ形式で記述された印刷機能情報と、ＰｒｉｎｔＴｉｃｋｅｔと呼ばれるＸＭＬ形式で記述された印刷設定情報である。Ｖ４プリンタードライバーは、このＰｒｉｎｔＣａｐａｂｉｌｉｔｉｅｓやＰｒｉｎｔＴｉｃｋｅｔを生成するために、ＧＰＤ（Ｇｅｎｅｒｉｃ  Ｐｒｉｎｔｅｒ  Ｄｅｓｃｒｉｐｔｉｏｎ）と呼ばれる印刷設定定義ファイルを記載し、ユーザーに対して印刷設定変更機能を提供することができる（非特許文献１）。
【０００４】
ただし、上記のＧＰＤではユーザーが印刷設定できる選択肢を定義するにとどまり、数値や文字列を定義することができない。たとえば余白設定をユーザーが行う場合、余白設定の機能を有効にする・有効にしないという選択肢を提供することができるが、実際にどれくらいの余白値（数値）を設定するかを定義することができない。そのため、ＯＳ（Ｏｐｅｒａｔｉｏｎｇ  Ｓｙｓｔｅｍ）はＧＰＤからＰｒｉｎｔＣａｐａｂｉｌｉｔｉｅｓやＰｒｉｎｔＴｉｃｋｅｔを生成する機能を持つコンフィグモジュールに、ＰｒｉｎｔＣａｐａｂｉｌｉｔｉｅｓの修正やＰｒｉｎｔＴｉｃｋｅｔを精査するための拡張モジュールを取り入れる機構を用意している。プリンタードライバー開発ベンダーは、この拡張モジュールである印刷設定変更モジュールを実装することで数値や文字列等のパラメータに関する定義を追加することができる（非特許文献２）。
【先行技術文献】
【非特許文献】
【０００５】
【非特許文献１】「PrintTicket and PrintCapabilities Support in Windows Print Drivers」(URL: http://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/XPSDrv_PrintTicket.doc)
【非特許文献２】「Developing v4 Print Drivers v1.3」(URL: http://download.microsoft.com/download/1/D/8/1D84C319-0082-4DEB-8708-856EF3CE21C7/developing-v4-print-drivers.docx)
【発明の概要】
【発明が解決しようとする課題】
【０００６】
ところで、たくさんの機能を有する複合機に対する印刷設定の項目は膨大であり、巨大な印刷設定情報となることが想定される。さらに、数値や文字列を指定する印刷設定項目も膨大になることが想定され、印刷設定変更モジュールの処理が印刷処理のパフォーマンスに大きな影響を与えることが判明している。このように、Ｖ３ドライバーでは発生しなかった印刷設定編集処理が導入されたことにより、パフォーマンスの低下を及ぼしている。
【０００７】
本発明は、上記の課題を鑑みてなされたものである。即ち、印刷設定編集処理におけるプログラムにおいて、より効率的な印刷設定情報の編集手段を提供することを目的とする。
【課題を解決するための手段】
【０００８】
本発明は、
ＸＭＬ形式で記述された印刷設定能力情報および印刷設定情報を用いた印刷設定変更機能を有するプリンタードライバーが提供する印刷設定編集モジュールにおいて、
機種依存情報を保持しているデータファイルからパラメータ情報を取得する手段と、
パラメータ情報を利用して、印刷設定能力情報および印刷設定情報を編集する手段と、
ユーザーが設定した印刷設定に応じて、印刷設定能力情報および印刷設定情報を編集する手段と、
印刷設定情報の値をＤＥＶＭＯＤＥに登録する手段と、
ＤＥＶＭＯＤＥに登録された値を印刷設定情報に反映する手段を有し、
これらの処理を膨大な印刷設定情報においても効率的に行うことを特徴とするプログラムである。
【発明の効果】
【０００９】
本発明により、効率的な印刷設定編集処理を行うことができ、膨大な機能を持った印刷設定編集処理におけるパフォーマンスが向上する。そのため、ユーザーが行う印刷設定変更処理や印刷にかかる時間を減少することができる。
【図面の簡単な説明】
【００１０】
【図１】本発明の一実施形態としての、コンピューターシステムのハードウェアとソフトウェアのブロック構成図である。
【図２】本発明の一実施形態としての、印刷処理システムのブロック構成図である。
【図３】本発明の一実施形態としての、ドライバー印刷処理システムで使用される印刷設定であるＸＭＬ形式のＰｒｉｎｔＣａｐａｂｉｌｉｔｅｓの一例である。
【図４】本発明の一実施形態としての、ドライバー印刷処理システムで使用される印刷設定であるＸＭＬ形式のＰｒｉｎｔＴｉｃｋｅｔの一例である。
【図５】本発明の一実施形態としての、ＤｒｉｖｅｒＰｒｏｐｅｒｔｙＢａｇに保存されている、機種依存情報としてのＪＳＯＮデータの一例である。
【図６】本発明の一実施形態としての、ＸＭＬ形式で記載されたＤＥＶＭＯＤＥに関する定義データの一例である。
【発明を実施するための形態】
【００１１】
以下、本発明を実施するための最良の形態について図面を用いて説明する。図１は本発明の実施形態を示す一般的なコンピューターを用いたシステムのブロック構成図である。
【００１２】
ＣＰＵ１０１は主記憶装置１０２のＲＯＭ１０２１あるいはＲＡＭ１０２２あるいは補助記憶装置１０５に格納されたプログラムに従って装置全体の制御を行う。ＲＡＭ１０２２はＣＰＵ１０１が各種処理を行う際のワークエリアとしても使用される。本実施形態における各コンポーネントの処理はすべてＲＡＭ１０２に読み込んで動作する。補助記憶装置１０５はアプリケーション１０５１やプリンタードライバー１０５２、オペレーティングシステム（ＯＳ）１０５３等を記録する。プリンタードライバー１０５２は、印刷機能を持つデバイスに対して、印刷指示を行うことができる。キーボード１０３１やマウス・タッチパネルなどに代表されるポインティングデバイス１０３２などの入力機器は、入力Ｉ／Ｆ１０３を通じて、ユーザーがコンピューターに対して各種指示を与えるためのデバイスである。出力Ｉ／Ｆ１０４は、データを外部に出力するためのインターフェースであり、モニタ１０４１やプリンター１０４２などの出力機器に対してデータを出力する。プリンター１０４２とは直接接続されるローカルＩ／Ｏのみならず、通信Ｉ／Ｆ１０６を通じて接続されるネットワーク１０６１を通して接続されていてもよい。また、１０７は共通データシステムバスで、Ｉ／Ｆやモジュール間でデータのやりとりを行う。
【００１３】
図２はドライバー印刷システムのブロック構成図である。ドライバー印刷システムはＸＰＳファイルフォーマットをスプールデータとして使用し、印刷を行うシステムである。ドライバー印刷システムは、オペレーティングシステム１０５３上で動作している。プリントマネージャ２１８、ＧＤＩｔｏＸＰＳ変換モジュール２０７、フィルタパイプラインマネージャ２１２、ポートモニター２１９はオペレーティングシステム１０５３に含まれるモジュールである。ＧＤＩとはプリンターの印刷イメージの生成を行うグラフィックスコンポーネントであり、ＧＤＩｔｏＸＰＳ変換モジュール２０７は、ＧＤＩで描画されたデータをＸＰＳデータへ変換する機能を持つ。
【００１４】
フィルタパイプラインマネージャ２１２は、ＸＰＳ印刷パスの特徴であるフィルタ印刷処理の管理を行うモジュールである。ポートモニター２１９は、デバイスにアクセスするプリントマネージャ２０８とプリンタードライバー間で通信を制御することができプリンタードライバーはポートモニター２１９を経由して印刷処理を行う。ＧＤＩｔｏＸＰＳ変換モジュール２０７、コンフィグレーションモジュール２０８、フィルタパイプラインマネージャ２１２は、プリンタードライバー１０５２に含まれているが、オペレーティングシステム１０５３から提供されているプリンタードライバー１０５２のモジュールという位置づけである。コンフィグレーションモジュール２０８は、プリンタードライバーが提供する印刷設定編集モジュール２０８１を使用して印刷設定情報を編集することができ、印刷設定編集モジュール２０８１は、プリンタードライバーが提供するプロパティバッグ２０８２を利用して印刷設定情報を編集する。プロパティバッグ２０８２とは、機種依存情報や印刷キューに紐づいた情報等のデータが保持された領域を指す。
【００１５】
プリンタードライバー１０５２とフィルタパイプラインマネージャ２１２の各フィルタは、図１の補助記憶装置１０５にプリンタードライバー１０５２として格納されている。ＧＤＩ印刷アプリケーション２０１とＸＰＳ印刷アプリケーション２０２は、図１の補助記憶装置１０５にアプリケーション１０５１として格納されている。ユーザーはキーボード１０３１やタッチパネル／マウスなどに代表されるポインティングデバイス１０３２などといった入力装置を使用して、出力装置のモニタ１０４１に映し出されたＧＤＩ印刷アプリケーション２０１（以下、ＧＤＩアプリと略す）、もしくはＸＰＳ印刷アプリケーションプログラム２０２（以下、ＸＰＳアプリと略す）から印刷処理を実行する。印刷処理はプリンターの選択、印刷設定の作成、描画データの変換と３つの処理を順番に行うことで実行する。
【００１６】
まずは、印刷したいプリンター１０４２の選択をする。ユーザーから見るとプリンター１０４２の選択は、印刷を実行するプリンター１０４２に対応したプリンタードライバー１０５２を選択することと同義である。１０５２の選択には、プリントキューを利用する。
【００１７】
次に印刷設定を作成する。印刷設定はまず、アプリケーション１０５１が印刷設定用のメモリ領域をＲＡＭ１０２２に確保する。そして、アプリケーション１０５１は、プリンタードライバー１０５２のコンフィギュレーションモジュール２０４を呼び出して、印刷設定データを作成して格納する。ＧＤＩアプリ２０１では印刷設定データとしてバイナリのＤＥＶＭＯＤＥ構造体２０３を用い、ＸＰＳアプリ２０２ではマークアップ言語のＸＭＬで記載されたＰｒｉｎｔＴｉｃｋｅｔ２０４を用いる。ＤＥＶＭＯＤＥ構造体２０３は、オペレーティングシステムが定義する標準領域とプリンタードライバーが独自で定義する拡張領域を持つ。ＰｒｉｎｔＴｉｃｋｅｔ２０４は、ＸＭＬ形式で記述された印刷設定情報で、標準領域と拡張領域は名前空間によって記載が分かれている。印刷設定データには機種固有の情報も含まれているので、コンフィギュレーションモジュール２０８は、機種依存ファイル２０９を利用して、印刷設定データを作成する。このＤＥＶＭＯＤＥ構造体２０３もしくはＰｒｉｎｔＴｉｃｋｅｔ２０４が印刷設定を保持しており、アプリケーションが直接、値を書き換えることで印刷設定を変更する。プリンター１０４２に依存した専用の設定は、プリンターエクステンション２１０が持つユーザーインターフェースで設定する。
【００１８】
プリンターエクステンション２１０は、プリンタードライバー１０５２の一種ではあるが、別のアプリケーションとしてインストールを行う。プリンタードライバー１０５２は、ユーザーインターフェースの設定に従い、ＤＥＶＭＯＤＥ構造体２０３もしくはＰｒｉｎｔＴｉｃｋｅｔ２０４のプリンター１０４２に依存した設定を変更する。印刷設定とは具体的に、出力する用紙サイズを「Ａ４」にする、印刷の向きを「横」にする、など印刷を行うのに必要なデータのことを指す。ＰｒｉｎｔＴｉｃｋｅｔ２０４は印刷設定がＸＭＬ形式で記述されているので、ＸＰＳアプリ２０２がすべての設定値を直接変更して書き換えることは容易だが、プリンターエクステンション２１０のユーザーインターフェースを使って設定変更してもかまわない。印刷設定は文書印刷のたびに作成するが、プリンター１０４２のオプション機器や、ユーザーごとの環境設定など設定を保持しておきたいものは、ユーザーインターフェースがオペレーティングシステムのレジストリデータベース２０５に保存する。レジストリデータベース２０５が使用できないときは、ユーザーインターフェースは、アプリケーションデータ２２０に設定を保存する。印刷設定のデフォルト値はオペレーティングシステムのプリントマネージャ２１８が、レジストリデータベース２０５に保存する。レジストリデータベース２０５や、アプリケーションデータ２２０は、補助記憶装置１０５に保存される。最後に描画データの変換を行う。印刷設定が確定したら、ユーザーはアプリケーションから印刷処理を実行する。ＧＤＩアプリ２０１から印刷する場合は、プリンタードライバーの形態を取るＧＤＩｔｏＸＰＳ変換モジュール２０７に描画データが送られ、ＸＰＳスプールファイル２０６が作成される。このときＧＤＩｔｏＸＰＳ変換モジュール２０７はコンフィギュレーションモジュール２０８を呼び出し、印刷設定をＤＥＶＭＯＤＥ構造体２０３からＰｒｉｎｔＴｉｃｋｅｔ２０４に変換する。変換する際には、印刷設定編集モジュール２０８１が使用される。ＸＰＳアプリ２０２から印刷する場合は、ＸＰＳファイルをＸＰＳアプリ自身が生成するのと、オペレーティングシステムがＸＰＳアプリからの描画命令に応じてＸＰＳファイルを生成するのと２通りの方法がある。どちらの方法であっても、印刷の途中でＸＰＳスプールファイル２０６を生成する。
【００１９】
ＸＰＳスプールファイル２０６が生成されたら、プリントフィルタパイプライン２１１に処理が渡される。プリントフィルタパイプライン２１１は複数のフィルタを通すことで印刷が行われる仕組みで、フィルタコンフィギュレーションファイル２１６でフィルタの数や順番を制御する。プリントフィルタパイプライン２１１で動作するフィルタパイプラインマネージャ２１２はフィルタコンフィギュレーションファイル２１６に従って、この実施例では通信フィルタ２１３、レイアウトフィルタ２１４、レンダラフィルタ２１５の順に処理を行う。フィルタはプリンタードライバー１０５２の構成によって、数や種類が異なる。印刷処理はＸＰＳスプールファイル２０６をフィルタに受け渡すことで行われ、フィルタがそれぞれＸＰＳスプールファイル２０６を加工し次のフィルタに渡していくことで処理が進む。通信フィルタ２１３は、プリントマネージャ２１８およびポートモニターを経由してプリンター１０４２と通信する機能と、直接プリンター１０４２と通信する機能を持つ。レイアウトフィルタ２１４は、倍率の変更や製本の面付けレイアウトやスタンプなどレイアウトに関する処理を行う。レンダラフィルタ２１５では、ＸＰＳスプールファイル２０６をレンダリングしてＰＤＬに変換する。ＰＤＬデータは印刷処理のスケジュール管理を行うプリントマネージャ２１８で管理され、キュー（待ち行列）に印刷ジョブが次々と登録される。プリンター１０４２が印刷できる状態になったら、キューに登録した順にポートモニター２１９を通して送信する。このようにして、アプリケーションからの印刷データをＰＤＬデータに変換することがプリンタードライバーの主な役目であり、印刷処理が行われる。
【００２０】
ここで、プリンタードライバーが利用する印刷設定情報のＰｒｉｎｔＣａｐａｂｉｌｉｔｉｅｓおよびＰｒｉｎｔＴｉｃｋｅｔについて図３、図４を用いて説明する。図３は、ＰｒｉｎｔＣａｐａｂｉｌｉｔｉｅｓの一部を抜粋した図である。ＰｒｉｎｔＣａｐａｂｉｌｉｔｉｅｓでは、印刷設定として設定可能な選択肢の値がＸＭＬ形式で記述されている。具体的には、Ｆｅａｔｕｒｅ内に書かれているＯｐｔｉｏｎの項目が選択肢としてユーザーに提供される。また、ＰａｒａｍｅｔｅｒＤｅｆには、数値や文字列等のパラメータに関する定義が記載されている。図４は、ＰｒｉｎｔＴｉｃｋｅｔの一部を抜粋した図である。上記のＰｒｉｎｔＣａｐａｂｉｌｉｔｉｅｓの項目から、ユーザーが実際に選択した印刷設定が記載される。数値や文字列を示すＰａｒａｍｅｔｅｒに関しては、ＰａｒａｍｅｔｅｒＩｎｉｔに記載される。
【００２１】
次に、印刷設定編集モジュール２０８１の処理について説明する。本実施形態では、印刷設定編集モジュール２０８１がＪａｖａＳｃｒｉｐｔ（登録商標）言語で記述されていることを想定している。印刷設定編集モジュール２０８１は、以下のＩ／Ｆを持ち、ＯＳのコンフィグレーションモジュール２０８から呼び出される。
・ｃｏｍｐｌｅｔｅＰｒｉｎｔＣａｐａｂｉｌｉｔｉｅｓ
・ｃｏｎｖｅｒｔＤｅｖｍｏｄｅＴｏＰｒｉｎｔＴｉｃｋｅｔ
・ｃｏｎｖｅｒｔＰｒｉｎｔＴｉｃｋｅｔＴｏＤｅｖｍｏｄｅ
・ｖａｌｉｄａｔｅＰｒｉｎｔＴｉｃｋｅｔ
プリンター開発ベンダーは各Ｉ／Ｆにおいて、コンフィグレーションモジュール２０８から呼び出された際の処理を実装することができる。各Ｉ／Ｆから呼び出された場合、ＰｒｉｎｔＣａｐａｂｉｌｉｔｉｅｓやＰｒｉｎｔＴｉｃｋｅｔ、プロパティバッグ２０８２へのアクセスＩ／Ｆを受け取ることができ、これらを利用してＰｒｉｎｔＣａｐａｂｉｌｉｔｉｅｓおよびＰｒｉｎｔＴｉｃｋｅｔの編集を行う。
【００２２】
以下、各Ｉ／Ｆの処理についてソースコードを用いて説明する。
・ｃｏｍｐｌｅｔｅＰｒｉｎｔＣａｐａｂｉｌｉｔｉｅｓ
本関数では、ＰｒｉｎｔＣａｐａｂｉｌｉｔｉｅｓの生成時や修正する必要がある場合に呼び出される関数である。本実施形態では、主に以下の機能を説明する。
【００２３】
−  ＰａｒａｍｅｔｅｒＤｅｆの追加
−  ＰａｒａｍｅｔｅｒＲｅｆの追加
−  ＳｕｂＦｅａｔｕｒｅへの変換
−  余白設定を行った際の有効印字領域の編集
以下に、ＰａｒａｍｅｔｅｒＤｅｆの追加から順に処理内容を説明する。
【００２４】
まず、ｃｏｍｐｅｔｅＰｒｉｎｔＣａｐａｂｉｌｉｔｅｓの関数が呼ばれると、印刷設定編集モジュール２８０１は、ＯＳから受けとったプロパティバッグ２０８２へアクセスするためのオブジェクトを生成する。本実施形態では、ドライバーが対応する機種の情報が保存されたＤｒｉｖｅｒＰｒｏｐｅｒｔｙＢａｇへアクセスするためのオブジェクトを用意する。
【００２５】
本実施形態で示すＤｒｉｖｅｒＰｒｏｐｅｒｔｙＢａｇとは、機種依存情報が定義されたデータ群のことを指し、図５のようなＪＳＯＮ（ＪａｖａＳｃｒｉｐｔ  Ｏｂｊｅｃｔ  Ｎｏｔａｔｉｏｎ）と呼ばれる形式の文字列を保持することとする。ＪＳＯＮは、ＪａｖａＳｃｒｉｐｔが利用しやすいデータ形式であり、ＤｒｉｖｅｒＰｒｏｐｅｒｔｙＢａｇの定義に沿った形で定義されているものとする。以下、これらのデータのことを追加パラメータ情報と呼ぶこととする。本項目では、ＰａｒａｍｅｔｅｒＤｅｆとして追加する情報がＪＳＯＮ形式で保持されている。印刷設定編集モジュール２０８１は、追加パラメータ情報をオブジェクト化し、それらのデータをリスト化する。そして、印刷設定編集モジュール２０８１は、リスト化された各追加パラメータ情報がすでにＰｒｉｎｔＣａｐａｂｉｌｉｔｉｅｓに定義されているかを検索する。検索には、ＸＰＡＴＨ（ＸＭＬ  Ｐａｔｈ  Ｌａｎｇｕａｇｅ）を利用する。ＸＰＡＴＨはＸＭＬにおける特定の個所を検索する機能を持ち、本実施形態ではＰｒｉｎｔＣａｐａｂｉｌｉｔｉｅｓから検索対象のＰａｒａｍｔｅｒＤｅｆが存在しているかを検索する。
【００２６】
追加パラメータ情報を検索した結果、すでにＰｒｉｎｔＣａｐａｂｉｌｉｔｉｅｓに定義されていると判断した場合、以下のＰａｒａｍｅｔｅｒＤｅｆの追加処理を行わずに、次の追加パラメータ情報の検索を行う。
【００２７】
もし追加パラメータ情報を検索した結果、ＰｒｉｎｔＣａｐａｂｉｌｉｔｉｅｓに定義されていないと判断した場合はＰａｒａｍｅｔｅｒＤｅｆの追加処理を行う。ＰａｒａｍｅｔｅｒＤｅｆの追加処理に関しては、追加パラメータ情報をＸＭＬＮｏｄｅ形式として作成し、作成したＸＭＬＮｏｄｅをＰｒｉｎｔＣａｐａｂｉｌｉｔｉｅｓに追加する。
【００２８】
これらの処理をＤｒｉｖｅｒＰｒｏｐｅｒｔｙＢａｇで定義されている追加パラメータ情報に関するデータ群に対してすべて完了するまで繰り返す。以下がそのソースコードとなる。また、ソースコード内のＧｅｔＰａｒａｍＤｅｆ関数は、ＸＰＡＴＨを利用したＰａｒａｍｅｔｅｒＤｅｆの検索を行う関数である。
【００２９】
addParameterDef = function () {
// jsonParameterDef is a generated jsonobject by "ParameterDef" Property of the DriverPropertyBag.
if (jsonParameterDef) {
var arrayParameterDef = jsonParameterDef;
// Create New ParameterDef Node.
var newParameterDefNode = rootNode.createNode(1, "psf:ParameterDef", psfNs);
var newPropetyNode = rootNode.createNode(1, "psf:Property", psfNs);
var newValueNode = rootNode.createNode(1, "psf:Value", psfNs);
var newTypeNode = rootNode.createNode(2, "xsi:type", xsiNs);
var newTextValueNode = rootNode.createTextNode("");
// Add all items defined by DriverPropertyBag to PrintCapabilities as ParameterDefNode.
for (var i = 0, parameterDefLentgh = arrayParameterDef.length ; i < parameterDefLentgh; i++) {
var orgParameterDefName = arrayParameterDef[i].name;
var parameterDefName = GetSchemaName(orgParameterDefName);
var parameterDefNSPrefix = GetSchemaPrefix(orgParameterDefName);
var parameterDefNSUri = nsObj[parameterDefNSPrefix];
// If already defined ParameterDef by PrintCapabilities, 
// Not add parameterDefNode in PrintCapabilities. 
if (GetParamDef(pcNode, parameterDefNSUri, parameterDefName)) {
continue;
}
// Append cloned NewParameterDefNode to PrintCapabilities.
var parameterDefNode = newParameterDefNode.cloneNode(true);
parameterDefNode.setAttribute("name", orgParameterDefName);
var pcParameterDefNode = pcNode.appendChild(parameterDefNode);
// Add items defined by DriverPropertyBag to PrintCapabilities
// as PropertyNode.
for (var j = 0, jsonParameterDefItemLength = arrayParameterDef[i].item.length; j < jsonParameterDefItemLength; j++) {
var parameterDefItem = arrayParameterDef[i].item[j];
// Append cloned NewPropertyNode to ParameterDefNode.
var propertyNode = newPropetyNode.cloneNode(true);
propertyNode.setAttribute("name", parameterDefItem.name);
var pcPropertyNode = pcParameterDefNode.appendChild(propertyNode);
// Append cloned NewValueNode to PropertyNode.
var valueNode = newValueNode.cloneNode(true);
var pcValueNode = pcPropertyNode.appendChild(valueNode);
// Set cloned NewAttributeNode to ValueNode.
var typeNode = newTypeNode.cloneNode(true);
typeNode.value = parameterDefItem.type;
pcValueNode.setAttributeNode(typeNode);
// Append cloned NewValueTextNode to ValueNode.
var textNode = newTextValueNode.cloneNode(true);
textNode.text = parameterDefItem.value;
pcValueNode.appendChild(textNode);
}
}
}
}
上記のようなコードを実装することで、ＰｒｉｎｔＣａｐａｂｉｌｉｔｅｓに対してＰａｒａｍｅｔｅｒＤｅｆの項目を追加することができる。
【００３０】
次に、ＰｒｉｎｔＣａｐａｂｉｌｉｔｉｅｓにＰａｒａｍｅｔｅｒＲｅｆを追加する処理について説明する。ＰａｒａｍｅｔｅｒＲｅｆとは、Ｏｐｔｉｏｎ内に記載するＸＭＬの属性のことであり、記載されたＯｐｔｉｏｎに関連するＰａｒａｍｅｔｅｒがどのＰａｒａｍｅｔｅｒＤｅｆに関連しているかが定義されている。
【００３１】
まず、ＤｒｉｖｅｒＰｒｏｐｅｒｔｙＢａｇからＪＳＯＮデータで記載された追加パラメータ情報を取得する。追加パラメータ情報には、「追加される対象のＦｅａｔｕｒｅ名とＯｐｔｉｏｎ名」、「追加するＰａｒａｍｅｔｅｒ名」が記載されている。次にＰａｒａｍｅｔｅｒＲｅｆを追加するＦｅａｔｕｒｅが定義されているかを判断するために、ＰｒｉｎｔＣａｐａｂｉｌｉｔｉｅｓからＸＰＡＴＨを利用して検索する。もし、定義されていないと判断した場合は、ＰａｒａｍｅｔｅｒＲｅｆの追加処理を行わずに処理を終了する。もし、定義されていると判断した場合は、追加される対象のＯｐｔｉｏｎが定義されているかを判断するために、ＰｒｉｎｔＣａｐａｂｉｌｉｔｉｅｓからＸＰＡＴＨを利用して検索する。もし、定義されていないと判断した場合は、ＰａｒａｍｅｔｅｒＲｅｆの追加処理を行わずに処理を終了する。もし、定義されていると判断した場合は、ＰａｒａｍｅｔｅｒＲｅｆが既に定義されているかを判断する。もし、定義されていると判断した場合は、ＰａｒａｍｅｔｅｒＲｅｆの追加処理を行わずに処理を終了する。もし、定義されていないと判断した場合は、ＤｒｉｖｅｒＰｒｏｐｅｒｔｙＢａｇから取得した追加パラメータ情報を利用して、ＰａｒａｍｅｔｅｒＲｅｆのＸＭＬＮｏｄｅを作成し、対象のＯｐｔｉｏｎに追加する。これらをＤｒｉｖｅｒＰｒｏｐｅｒｔｙＢａｇで定義されている追加パラメータ情報に関するデータに対してすべて完了するまで繰り返す。以下がそのソースコードとなる。また、ソースコード内のＧｅｔＦｅａｔｕｒｅ関数、ＧｅｔＯｐｔｉｏｎ関数、ＧｅｔＰａｒａｍｅｔｅｒＲｅｆ関数は、各Ｆｅｔａｔｕｒｅ、Ｏｐｔｉｏｎ、ＰａｒａｍｅｔｅｒＲｅｆの検索を行う関数である。
【００３２】
addParameterRef = function () {
// jsonParameterRef is a generated jsonobject by "ParameterRef" Property of the DriverPropertyBag.
if (jsonParameterRef) {
var arrayParameterRef = jsonParameterRef;
// Create New ParameterRef Node.
var newParameterRefNode = rootNode.createNode(1, "psf:ParameterRef", psfNs);
var newScoredPropetyNode = rootNode.createNode(1, "psf:ScoredProperty", psfNs);
// Add All Defined DriverPropertyBag As ParameterRefNode.
for (var i = 0, parameterRefLength = arrayParameterRef.length; i < parameterRefLength; i++) {
var parameterRef = arrayParameterRef[i];
var orgParameterRefFeatureName = parameterRef.featureName;
var parameterRefFeatureName = GetSchemaName(orgParameterRefFeatureName);
var parameterRefFeatureNSPrefix = GetSchemaPrefix(orgParameterRefFeature);
var parameterRefFeatureNSUri = nsObj[parameterRefFeatureNSPrefix];
var arrayParameterRefOption = parameterRef.option;
var featureNode = GetFeature(pcNode, parameterRefFeatureNSUri, parameterRefFeatureName);
// Search FeatureNode of the additional Object.
if (featureNode) {
for (var j = 0, parameterRefOptionLength = arrayParameterRefOption.length; j < parameterRefOptionLength; j++) {
var p = arrayParameterRefOption[j];
var orgParameterRefOptionName = p.optionName;
var parameterRefOptionName = GetSchemaName(orgParameterRefOptionName);
var parameterRefOptionNSPrefix = GetSchemaPrefix(orgParameterRefOptionName);
var parameterRefOptionNSUri = nsObj[parameterRefOptionNSPrefix];
var optionNode = GetOption(featureNode, parameterRefOptionNSUri, parameterRefOptionName);
// Search OptionNode of the additional Object.
if (optionNode) {
var scoredPropertyName = p.scoredPropertyName;
var parameterRefName = p.parameterRefName;
// If already defined ParameterRef, not add printCapabilities.
if (!GetParameterRef(optionNode, GetSchemaPrefix(parameterRefName), GetSchemaName(parameterRefName))) {
// Append Cloned New scoredPropetyNode to OptionNode.
var scoredPropertyNode = newScoredPropetyNode.cloneNode(true);
scoredPropertyNode.setAttribute("name", scoredPropertyName);
var optionScoredPropertyNode = optionNode.appendChild(scoredPropertyNode);
// Append Cloned New ParameterRefNode to scoredPropetyNode.
var parameterRefNode = newParameterRefNode.cloneNode(true);
parameterRefNode.setAttribute("name", parameterRefName);
optionScoredPropertyNode.appendChild(parameterRefNode);
}
}
}
}
}
}
}  
上記のようなコードを実装することで、ＰｒｉｎｔＣａｐａｂｉｌｉｔｅｓに対してＰａｒａｍｅｔｅｒＲｅｆの項目を追加することができる。
【００３３】
次に、Ｆｅａｔｕｒｅ項目をＳｕｂＦｅａｔｕｒｅに変換する処理について説明する。
【００３４】
ＳｕｂＦｅａｔｕｒｅとは、Ｆｅａｔｕｒｅ内に存在するＦｅａｔｕｒｅのことを指し、Ｆｅａｔｕｒｅ間の高い関連性を表現する際に使用する。ＧＰＤではＳｕｂＦｅａｔｕｒｅを定義することはできないため、ＧＰＤではＦｅａｔｕｒｅとして定義しておき、印刷設定変更モジュール２０８１において、ＦｅａｔｕｒｅをＳｕｂＦｅａｔｕｒｅとして変換する。以下、ＳｕｂＦｅｔｕｒｅ変換処理に関して説明する。
【００３５】
まず、ＤｒｉｖｅｒＰｒｏｐｅｒｔｙＢａｇからＪＳＯＮデータを取得する。ＪＳＯＮデータには、「変換対象のＦｅａｔｕｒｅ名」と、「追加対象のＦｅａｔｕｒｅ名」が記載されている。以下、この情報を変換パラメータ情報と呼ぶこととする。次に、ＳｕｂＦｅａｔｕｒｅを追加する対象Ｆｅａｔｕｒｅが定義されているかを判断するために、ＰｒｉｎｔＣａｐａｂｉｌｉｔｉｅｓからＸＰＡＴＨを利用して検索する。もし、定義されていないと判断した場合は、ＳｕｂＦｅａｔｕｒｅへの変換を行わずに処理を終了する。もし定義されていると判断した場合は、変換対象のＦｅａｔｕｒｅが定義されているかを判断するために、ＰｒｉｎｔＣａｐａｂｉｌｉｔｉｅｓからＸＰＡＴＨを利用して検索する。もし、定義されていないと判断した場合は、ＳｕｂＦｅａｔｕｒｅへの変換を行わずに処理を終了する。もし定義されていると判断した場合は、ＤｒｉｖｅｒＰｒｏｐｅｒｔｙＢａｇから取得した変換パラメータの情報と、変換対象のＦｅａｔｕｒｅをＳｕｂＦｅａｔｕｒｅの定義に沿った形に変換し、追加対象のＦｅａｔｕｒｅに移動する。
【００３６】
これらをＤｒｉｖｅｒＰｒｏｐｅｒｔｙＢａｇで定義されている変換パラメータ情報に関するデータに対してすべて完了するまで繰り返す。以下がそのソースコードとなる。また、ソースコード内のＧｅｔＦｅａｔｕｒｅ関数は、Ｆｅａｔｕｒｅの検索を行う関数である。
【００３７】
convertSubFeature = function () {
var ConvertToSubfeatureNode = function ConvertToSubfeatureNode(pcNode, moveFeatureNode, parentNode) {
var removedFeature = pcNode.removeChild(moveFeatureNode);
if (removedFeature) {
if (parentNode) {
if (parentNSPrefix == pskPrefix) {
//Change namespace、delete scope.
var attirbuteName = removedFeature.getAttribute("name");
var nonScopeAttirbuteName = attirbuteName.substring(attirbuteName.indexOf(":") + 1);
var newAttributeName = "";
//When top character string had Scope, I delete it
if (nonScopeAttirbuteName.indexOf("Job") == 0) {
newAttributeName = pskPrefix + ":" + nonScopeAttirbuteName.replace("Job", "");
} else if (nonScopeAttirbuteName.indexOf("Document") == 0) {
newAttributeName = pskPrefix + ":" + nonScopeAttirbuteName.replace("Document", "");
} else if (nonScopeAttirbuteName.indexOf("Page") == 0) {
newAttributeName = pskPrefix + ":" + nonScopeAttirbuteName.replace("Page", "");
} else {
newAttributeName = attirbuteName;
}
removedFeature.setAttribute("name", newAttributeName);
}
parentNode.appendChild(removedFeature);
}
}
};
// jsonSubFeature is a generated jsonobject by "ParameterRef" Property of the DriverPropertyBag.
if (jsonSubFeature) {
// Convert All items defined by DriverPropertyBag to PrintCapabilities as SubFeature.
for (var i = 0, jsonSubFeatureLength = jsonSubFeature.length; i < jsonSubFeatureLength; i++) {
//var sf = jsonSubFeature.subFeature[i];
var sf = jsonSubFeature[i];
var parentName = GetSchemaName(sf.parent);
var parentNSPrefix = GetSchemaPrefix(sf.parent);
var parentNSUri = nsObj[parentNSPrefix];
var parentNode = GetFeature(pcNode, parentNSUri, parentName);
// If parentNode is nothing, do not convert SubFeature.
if (parentNode) {
var subfeatureName = GetSchemaName(sf.subfeature);
var subfeatureNSPrefix = GetSchemaPrefix(sf.subfeature);
var subfeatureNSUri = nsObj[subfeatureNSPrefix];
var subfeatureNode = GetFeature(pcNode, subfeatureNSUri, subfeatureName);
// If subfeatureNode is nothing, do not convert SubFeature.
if (subfeatureNode) {
ConvertToSubfeatureNode(pcNode, subfeatureNode, parentNode);
}
}
}
}
}
上記のようなコードを実装することで、ＰｒｉｎｔＣａｐａｂｉｌｉｔｅｓに対してＦｅａｔｕｒｅからＳｕｂＦｅａｔｕｒｅへの変換処理を行うことができる。
【００３８】
次に、ＰｒｉｎｔＣａｐａｂｉｌｉｔｅｓに記載されている有効印字領域の変更処理に関して説明する。ＰｒｉｎｔＣａｐａｂｉｌｉｔｅｓには、ＰａｇｅＩｍａｇｅａｂｌｅＳｉｚｅと呼ばれる有効印字領域に関するＰｒｏｐｅｒｔｙが設定されている。本実施形態では、ユーザーが余白設定を行った際に正しい有効印字領域となるように、ＰｒｉｎｔＣａｐａｂｉｌｉｔｉｅｓの値を書き換える処理を行う。
【００３９】
まず、現在の印刷設定つまりＰｒｉｎｔＴｉｃｋｅｔにおいて、余白設定が有効になっているかを確認する。余白設定が有効になっていた場合は、ＰｒｉｎｔＣａｐａｂｉｌｉｔｉｅｓから有効印字領域に関するＰｒｏｐｅｒｔｙである、ＰａｇｅＩｍａｇｅａｂｌｅＳｉｚｅを検索する。ＰａｇｅＩｍａｇｅａｂｌｅＳｉｚｅが定義されている場合、現在設定されている用紙サイズを取得する。次に、余白設定として指定してあるＰａｒａｍｅｔｅｒＩｎｉｔの余白設定値（上下左右の余白値）を取得する。そして、用紙サイズ、余白設定値から、有効印字領域および印字開始位置の原点を計算し、ＰａｇｅＩｍａｇｅａｂｌｅＳｉｚｅに設定する。以下がそのソースコードとなる。また、ソースコード内のＧｅｔＰａｒａｍＩｎｉｔ関数、ＧｅｔＰｒｏｐｅｒｔｙ関数、ＧｅｔＦｅａｔｕｒｅ関数は、ＸＰＡＴＨを利用したＰａｒａｍｅｔｅｒＩｎｉｔ、Ｐｒｏｐｅｒｔｙ、Ｆｅａｔｕｒｅの検索を行う関数である。
【００４０】
setImageableSize = function () {
var jobPrintMarginAdjustmentNode = GetFeature(ptNode, privateNs, "JobMarginAdjust");
if (jobPrintMarginAdjustmentNode) {
// Get jobPrintMarginAdjustmentNode Feature Selected Node.
var marginSelectedOptionNode = jobPrintMarginAdjustmentNode.selectSingleNode("descendant::psf:Option");
var selectedOptionAttributeName = marginSelectedOptionNode.getAttribute("name");
var selectedOptionName = GetSchemaName(selectedOptionAttributeName);
if (selectedOptionName == "MarginAdjust") {
var pageImageableSizeNode = GetProperty(pcNode, pskNs, "PageImageableSize");
if (pageImageableSizeNode) {
var pageImageableAreaNode = GetProperty(pcNode, pskNs, "ImageableArea");
if (pageImageableAreaNode) {
var pageMediaSizeNode = GetFeature(ptNode, pskNs, "PageMediaSize");
if (pageMediaSizeNode) {
// Get pageMediaSizeNode Feature Selected Node.
var selectedOptionNode = pageMediaSizeNode.selectSingleNode(xpath);
var mediaSizeWidthNode = GetScoredProperty(selectedOptionNode, pskNs, "MediaSizeWidth");
var mediaSizeHeightNode = GetScoredProperty(selectedOptionNode, pskNs, "MediaSizeHeight");
var marginTopNode = GetParamInit(ptNode, privateNs, "JobMarginAdjustTop");
var marginBottomNode = GetParamInit(ptNode, privateNs, "JobMarginAdjustBottom");
var marginLeftNode = GetParamInit(ptNode, privateNs, "JobMarginAdjustLeft");
var marginRightNode = GetParamInit(ptNode, privateNs, "JobMarginAdjustRight");
// When I cannot get these parameters, do not set it.
if (!(mediaSizeWidthNode == null) || !(mediaSizeHeightNode == null) || !(marginTopNode == null) || !(marginBottomNode == null) || !(marginLeftNode == null) || !(marginRightNode == null)) {
var mediaSizeWidth = mediaSizeWidthNode.text;
var mediaSizeHeight = mediaSizeHeightNode.text;
var marginTop = marginTopNode.text;
var marginBottom = marginBottomNode.text;
var marginLeft = marginLeftNode.text;
var marginRight = marginRightNode.text;
// Set ImageableArea Property
var imageableSizeWidthNode = GetProperty(pageImageableSizeNode, pskNs, "ImageableSizeWidth");
if (imageableSizeWidthNode) {
imageableSizeWidthNode.firstChild.text = mediaSizeWidth;
}
var imageableSizeHeightNode = GetProperty(pageImageableSizeNode, pskNs, "ImageableSizeHeight");
if (imageableSizeHeightNode) {
imageableSizeHeightNode.firstChild.text = mediaSizeHeight;
}
var originWidthNode = GetProperty(pageImageableAreaNode, pskNs, "OriginWidth");
if (originWidthNode) {
originWidthNode.firstChild.text = marginLeft;
}
var originHeightNode = GetProperty(pageImageableAreaNode, pskNs, "OriginHeight");
if (originHeightNode) {
originHeightNode.firstChild.text = marginTop;
}
var ExtentWidthNode = GetProperty(pageImageableAreaNode, pskNs, "ExtentWidth");
if (ExtentWidthNode) {
var ExtentWidth = mediaSizeWidth - marginLeft - marginRight;
if (ExtentWidth < 1000) {
ExtentWidthNode.firstChild.text = 1000;
}
else {
ExtentWidthNode.firstChild.text = ExtentWidth;
}
}
var ExtentHeightNode = GetProperty(pageImageableAreaNode, pskNs, "ExtentHeight");
if (ExtentHeightNode) {
var ExtentHeight = mediaSizeHeight - marginTop - marginBottom;
if (ExtentHeight < 1000) {
ExtentHeightNode.firstChild.text = 1000;
}
else {
ExtentHeightNode.firstChild.text = ExtentHeight;
}
}
}
}
}
}
}
}
}
上記のようなコードを実装することで、余白設定を行った際の有効印字領域の変更を行うことができる。
【００４１】
また、上記以外にもＰａｇｅＩｎｐｕｔＢｉｎとよばれる給紙段に関するＦｅａｔｕｒｅに対して、各給紙段の能力情報を追加する処理等を行うが、追加処理の手段は前述と同等の手段を用いているため省略する。
【００４２】
以上の処理により、ＰｒｉｎｔＣａｐａｂｉｌｉｔｉｅｓの印刷設定編集処理を完了する。
【００４３】
・ｃｏｎｖｅｒｔＤｅｖｍｏｄｅＴｏＰｒｉｎｔｔｉｃｋｅｔ
本関数では、ＤＥＶＭＯＤＥの値をＰｒｉｎｔＴｉｃｋｅｔに登録する場合に呼び出される関数である。特に、本実施形態ではＧＰＤには記載できないＰａｒａｍｅｔｅｒに関する追加処理をＰｒｉｎｔＴｉｃｋｅｔに対して行う処理と、ＤＥＶＭＯＤＥに登録されているＰａｒａｍｅｔｅｒに関する値をＰｒｉｎｔＴｉｃｋｅｔに反映するための処理を行う。本実施形態では、主に以下の機能について説明する。
【００４４】
−  ＰａｒａｍｅｔｅｒＩｎｉｔの追加
−  ＤＥＶＭＯＤＥの値をＰａｒａｍｅｔｅｒＩｎｉｔに反映
以下に、ＰａｒａｍｅｔｅｒＩｎｉｔの追加から順に処理内容を説明する。
【００４５】
まず、ｃｏｎｖｅｒｔＤｅｖｍｏｄｅＴｏＰｒｉｎｔＴｉｃｋｅｔの関数が呼ばれると、印刷設定編集モジュール２８０１は、ＯＳから受けとったプロパティバッグ２０８２へアクセスするためのオブジェクトを生成する。本実施形態では、ドライバーが対応する機種の情報が保存されたＤｒｉｖｅｒＰｒｏｐｅｒｔｙＢａｇへアクセスするためのオブジェクトを用意する。
【００４６】
印刷設定編集モジュール２０８１は、追加パラメータ情報をオブジェクト化し、それらのデータをリスト化する。そして、印刷設定編集モジュール２０８１は、リスト化された各情報がすでにＰｒｉｎｔＴｉｃｋｅｔに定義されているかを検索する。検索には、ＸＰＡＴＨを利用する。本項目では、検索対象のＰａｒａｍｅｔｅｒＩｎｉｔが存在しているかを検索する。次に、追加パラメータ情報に対応するＰａｒａｍｅｔｅｒがＤＥＶＭＯＤＥに定義されているかを判断する。あらかじめ特定のＰａｒａｍｅｔｅｒをＤＥＶＭＤＯＥに定義するためには、図６のようなＸＭＬ形式で記述されたＤＥＶＭＯＤＥ定義ファイルをプリンタードライバーパッケージに同梱しておく必要がある。ＤＥＶＭＯＤＥに定義されていない場合は以下の追加処理は行わず、次の追加パラメータ情報の処理に進む。もし、定義されていると判断した場合は、ＤＥＶＭＯＤＥに登録された値を取得する。次に、取得したパラメータ値が適切かどうかをチェックする。適切なパラメータとは、データ形式がＰｒｉｎｔＴｉｃｋｅｔの定義と合致しているか、最大値と最小値の範囲内に収まっているかなどの精査を行う。もし、適切でないと判断した場合は追加パラメータ情報に記載されているデフォルトの値に変更する。本実施形態では、デフォルト値に変更するような処理を行ったが、最大値もしくは最小値などに変更してもよい。
【００４７】
次に、検索されたＰａｒａｍｅｔｅｒＩｎｉｔが存在すると判断した場合は、対象のＰａｒａｍｅｔｅｒＩｎｉｔの値に取得したＤＥＶＭＯＤＥの値を反映させる。もし、存在しないと判断した場合は、ＰａｒａｍｅｔｅｒＩｎｉｔの追加処理を行う。ＰａｒａｍｅｔｅｒＩｎｉｔの追加処理に関しては、追加パラメータ情報をＸＭＬＮｏｄｅ形式として作成し、作成したＸＭＬＮｏｄｅをＰｒｉｎｔＴｉｃｋｅｔに追加する。
【００４８】
これらの処理をＤｒｉｖｅｒＰｒｏｐｅｒｔｙＢａｇで定義されている追加パラメータ情報に関するデータ群に対してすべて完了するまで繰り返す。以下がそのソースコードとなる。また、ソースコード内のＧｅｔＰａｒａｍＩｎｉｔ関数は、ＸＰＡＴＨを利用したＰａｒａｍｅｔｅｒＩｎｉｔの検索を行う関数である。
【００４９】
addParameterInit = function () {
var dataType,
defaultValue,
checkParameter = function () {
var maxValue;
var minValue;
var maxLength;
var minLength;
for (var j = 0, jsonParameterDefItemLength = arrayParameterDef[i].item.length; j < jsonParameterDefItemLength; j++) {
var parameterInitItem = arrayParameterDef[i].item[j];
switch (parameterInitItem.name) {
case "psf:DataType":
dataType = parameterInitItem.value; break;
case "psf:DefaultValue":
defaultValue = parameterInitItem.value; break;
case "psf:MaxLength":
maxLength = parameterInitItem.value; break;
case "psf:MinLength":
minLength = parameterInitItem.value; break;
case "psf:MaxValue":
maxValue = parameterInitItem.value; break;
case "psf:MinValue":
minValue = parameterInitItem.value; break;
default:
break;
}
}
if (dataType == "xsd:string") {
if (minLength == null || maxLength == null) {
return;
}
if ((devmodeString.length >= minLength) && (devmodeString.length <= maxLength)) {
}
else {
devmodeString = defaultValue;
}
}
if (dataType == "xsd:integer") {
if (minValue == null || maxValue == null) {
return;
}
devmodeString = devmodeString.replace(/[ \t]+/g, '');
// I make a decision whether it is numerical value
if (devmodeString.match(/^[-]?\d+(\.\d+)?$/)) {
// numeric value
devmodeString = Number(devmodeString);
if ((devmodeString < minValue) || (devmodeString > maxValue)) {
devmodeString = defaultValue;
}
} else {
// besides numerical value
devmodeString = defaultValue;
}
}
};
// Create JsonObject with the "ParameterDef" Property of the DriverPropertyBag.
var jsonParameterDef = CreateJsonObject(driverPropertyBag, "ParameterDef");
if(jsonParameterDef) {
var arrayParameterDef = jsonParameterDef.parameterDef;
// Create New ParameterInit Node.
var newParameteInitNode = rootNode.createNode(1, "psf:ParameterInit", psfNs);
var newValueNode = rootNode.createNode(1, "psf:Value", psfNs);
var newTypeNode = rootNode.createNode(2, "xsi:type", xsiNs);
var newTextValueNode = rootNode.createTextNode("");
// Add items defined by DriverPropertyBag to PrintTicket as ParameterInitNode.
for (var i = 0, jsonParameterDefLength = arrayParameterDef.length; i < jsonParameterDefLength; i++) {
var parameterDef = arrayParameterDef[i];
var orgParameterInitName = parameterDef.name;
var parameterInitName = GetSchemaName(orgParameterInitName);
var parameterInitNSPrefix = GetSchemaPrefix(orgParameterInitName);
var parameterInitNSUri = nsObj[parameterInitNSPrefix];
var ptParameterInitNode = GetParamInit(ptNode, parameterInitNSUri, parameterInitName);
// Get DevmodeMap value
var devmodeString = "";
try {
devmodeString = devModeProperties.GetString(parameterInitName);
} catch (errorObject) {
// When DevmodeMap does not have a definition, not handle the following
continue;
}
// I check it whether a value of DevmodeMap is right 
checkParameter();
if (!ptParameterInitNode) {
// If ParameterInit is none, create it.
var parameterInitNode = newParameteInitNode.cloneNode(true);
parameterInitNode.setAttribute("name", orgParameterInitName);
ptParameterInitNode = ptNode.appendChild(parameterInitNode);
var valueNode = newValueNode.cloneNode(true);
var ptValueNode = ptParameterInitNode.appendChild(valueNode);
var typeNode = newTypeNode.cloneNode(true);
typeNode.value = dataType;
ptValueNode.setAttributeNode(typeNode);
var textNode = newTextValueNode.cloneNode(true);
if (devmodeString != "") {
// set DevmodeMap Value
textNode.text = devmodeString;
}
else {
// set default Value.
textNode.text = defaultValue;
}
ptValueNode.appendChild(textNode);
} else {
if (devmodeString != "") {
ptParameterInitNode.firstChild.text = devmodeString;
}
}
}
}
}
上記のようなコードを実装することで、ＰｒｉｎｔＴｉｃｋｅｔの追加およびＤＥＶＭＯＤＥへの値の反映を行うことができる。
【００５０】
また本関数では、ＰａｒａｍｅｔｅｒＲｅｆの追加、ＳｕｂＦｅａｔｕｒｅの変換、ＰａｇｅＩｎｐｕｔＢｉｎの追加処理を行うが、前述したＰｒｉｎｔＣａｐａｂｉｌｉｔｉｅｓの追加処理の追加対象先をＰｒｉｎｔＴｉｃｋｅｔとしている違いのみであるため、省略する。
【００５１】
以上の処理により、ＰｒｉｎｔＴｉｃｋｅｔの精査に関する印刷設定編集処理を完了する。
・ｃｏｎｖｅｒｔＰｒｉｎｔｔｉｃｋｅｔＴｏＤｅｖｍｏｄｅ
本関数では、ＰｒｉｎｔＴｉｃｋｅｔの値をＤＥＶＭＯＤＥに登録する場合に呼び出される関数である。特に、本実施形態ではＧＰＤには記載できないＰａｒａｍｅｔｅｒに関する値をＤＥＶＭＯＤＥに登録する処理を行う。本実施形態では、主に以下の機能を有する。
【００５２】
−  ＰａｒａｍｅｔｅｒＩｎｉｔの値をＤＥＶＭＯＤＥに登録する
以下に、ＰａｒａｍｅｔｅｒＩｎｉｔの値をＤＥＶＭＯＤＥに反映する処理について説明する。まず、ｃｏｎｖｅｒｔＰｒｉｎｔｔｉｃｋｅｔＴｏＤｅｖｍｏｄｅの関数が呼ばれると、印刷設定編集モジュール２８０１は、ＯＳから受けとったプロパティバッグ２０８２へアクセスするためのオブジェクトを生成する。本実施形態では、ドライバーが対応する機種の情報が保存されたＤｒｉｖｅｒＰｒｏｐｅｒｔｙＢａｇへアクセスするためのオブジェクトを用意する。
【００５３】
印刷設定編集モジュール２０８１は、追加パラメータ情報をオブジェクト化し、それらのデータをリスト化する。そして、印刷設定編集モジュール２０８１は、リスト化された各情報がすでにＰｒｉｎｔＴｉｃｋｅｔに定義されているかを検索する。検索には、ＸＰＡＴＨを利用する。次に、取得したパラメータ値が適切かどうかをチェックする。適切なパラメータとは、データ形式がＰｒｉｎｔＴｉｃｋｅｔの定義と合致しているか、最大値と最小値の範囲内に収まっているかなどの精査を行う。もし、適切でないと判断した場合は追加パラメータ情報に記載されているデフォルトの値に変更する。本実施形態では、デフォルト値に変更するような処理を行ったが、最大値もしくは最小値などに変更してもよい。
【００５４】
次に、検索されたＰａｒａｍｅｔｅｒＩｎｉｔが存在すると判断した場合は、対象となるＰａｒａｍｅｔｅｒＩｎｉｔの値をＤＥＶＭＯＤＥに登録する。もし、存在しないと判断した場合は、ＤＥＶＭＯＤＥへの登録は行わない。これらの処理をＤｒｉｖｅｒＰｒｏｐｅｒｔｙＢａｇで定義されている追加パラメータ情報に関するデータ群に対してすべて完了するまで繰り返す。以下がそのソースコードとなる。また、ソースコード内のＧｅｔＰａｒａｍＩｎｉｔ関数は、ＸＰＡＴＨを利用したＰａｒａｍｅｔｅｒＩｎｉｔの検索を行う関数である。また、適切なパラメータのチェックを行う関数は前述したソースコードと同一であるため省略する。
【００５５】
setDevmode = function () {
var jsonParameterDef = CreateJsonObject(driverPropertyBag, "ParameterDef");
if (jsonParameterDef) {
var arrayParameterDef = jsonParameterDef.parameterDef;
// Get all items deefined by DriverPropertyBag, Search item from PrintTicket.
for (var i = 0, jsonParameterDefLength = arrayParameterDef.length; i < jsonParameterDefLength; i++) {
var orgParameterInitName = arrayParameterDef[i].name;
var parameterInitName = GetSchemaName(orgParameterInitName);
var parameterInitNSPrefix = GetSchemaPrefix(orgParameterInitName);
var parameterInitNSUri = nsObj[parameterInitNSPrefix];
var ptParameterInitNode = GetParamInit(ptNode, parameterInitNSUri, parameterInitName);
if (ptParameterInitNode) {
var parameterInitValueNode = ptParameterInitNode.firstChild;
var parameterInitText = parameterInitValueNode.text;
// check PT Value
checkParameter();
// Set ParameterInit Value in DEVMODE.
try {
if (devModeProperties.GetString(parameterInitName) != parameterInitText) {
devModeProperties.SetString(parameterInitName, parameterInitText);
}
}
catch (errorObject) {
Debug.writeln("Set DEVMODE PropertyBag error : " + parameterInitName + errorObject.message);
}
}
}
}
}
上記のようなコードを実装することで、ＰｒｉｎｔＴｉｃｋｅｔの値をＤＥＶＭＯＤＥに登録することができる。
・ｖａｌｉｄａｔｅＰｒｉｎｔＴｉｃｋｅｔ
本関数では、ＰｒｉｎｔＴｉｃｋｅｔの値の精査を行う関数である。本実施形態では主に以下の機能を有する。
【００５６】
−  ＰｒｉｎｔＴｉｃｋｅｔのＰａｒａｍｅｔｅｒＩｎｉｔにおける上限値・下限値チェック
−  ＰｒｉｎｔＴｉｃｋｅｔのＰａｒａｍｅｔｅｒＩｎｉｔにおける空文字チェック
本関数では、ＰｒｉｎｔＴｉｃｋｅｔに関する項目についてＰａｒａｍｅｔｅｒの上限値・下限値のチェックおよび、値が空であった場合のＰａｒａｍｅｔｅｒの削除を行う。上限値・下限値のチェックに関しては、前述しているため省略する。次に、Ｐａｒａｍｅｔｅｒの空文字のチェックを行う。対象となるＰｒｉｎｔＴｉｃｋｅｔに対して、ＰａｒａｍｅｔｅｒＩｎｉｔをすべて探索し、ＰａｒａｍｅｔｅｒＩｎｉｔのパラメータ値が空であるかどうかを判断する。もし、空であると判断した場合は、対象のＰａｒａｍｅｔｅｒＩｎｉｔを削除する。これを検索で見つかったＰａｒａｍｅｔｅｒＩｎｉｔすべてに対して精査を行う。以下がそのソースコードとなる。
【００５７】
deleteEmptyParameterInit = function () {
// Count PrintTicket Feature
var countNum = ptNode.childNodes.length;
for (var i = 0; i < countNum; i++) {
var node = ptNode.childNodes[i];
if (node.nodeName == "psf:ParameterInit") {
if (node.firstChild.text == "") {
// If ParameterRef contains, delete ParameterRefNode.
var ParamRefName = GetSchemaName(node.attributes[0].text);
var ParamRefNSPrefix = GetSchemaPrefix(node.attributes[0].text);
var paramRefNSUri = nsObj[ParamRefNSPrefix]
var paramRefNode = GetParameterRef(ptNode, paramRefNSUri, ParamRefName);
if (paramRefNode) {
ptNode.removeChild(paramRefNode);
}
ptNode.removeChild(node);
// ChildNode carries by deleting, so reduce countNum.
i--;
countNum--;
retVal = 1;
}
}
}
return retVal;
}
上記のようなコードを実装することで、ＰｒｉｎｔＴｉｃｋｅｔの精査処理を行うことができる。
【００５８】
以上の処理を行うことで、ＰｒｉｎｔＣａｐａｂｉｌｉｔｅｓおよびＰｒｉｎｔＴｉｃｋｅｔに対して、効率的に印刷設定情報を編集することができる。
【符号の説明】
【００５９】
１０１  ＣＰＵ、１０２  主記憶装置、１０２１  ＲＯＭ、１０２２  ＲＡＭ、
１０５  補助記憶装置
【図１】
2015225481.tif 000003
【図２】
2015225481.tif 000004
【図３】
2015225481.tif 000005
【図４】
2015225481.tif 000006
【図５】
2015225481.tif 000007
【図６】
2015225481.tif 000008