Printing - NT EMF データの留意点

ご無沙汰しております。なおきお~です。梅雨時期は、湿気が多く過ごしづらい日も多いかと思いますが、皆さん、如何お過ごしでしょうか?

さて、今回は、A尾さんの記事のプリンティングについて、ちょっと補足をしたいと思います。

 

A尾さんの「印刷時のスプーリングについて」では、NT EMF データや RAW データといったスプール データについて、解説があったかと思います。

この記事にあるとおり、データの種別に関わらず、プリント プロセッサのみとなります。

 

RAW データは、プリンタ デバイスに依存したデータ種別であるため、プリンタ ドライバ開発される方々が熟知されていると思いますし、ReadPrinter() でスプール データを読み込み、WritePrinter() で、プリント モニタ(ランゲージ モニタやポート モニタ) に通知するので、比較的 シンプルな構造になると思います。

Windows OS 標準のプリント プロセッサでも、RAW で始まるスプール データは、同じ概念で実装されています。

 

clip_image001

 

対して、NT EMF データは、バージョンがたくさんありますが、全て GdiStartDocEMF() といった GDI Functions for Print Processors にある API を使用してハンドリングします。

この API のリストを見ていただくと気づかれる方もいらっしゃると思いますが、ページ単位でしか NT EMF データをハンドリングすることができません。

つまり、ページの中に新たにレンダリング データを追加することはできませんし、削除することもできません。

また、NT EMF データ内になるページデータであれば、GdiPlayPageEMF() を利用することで、印刷するページを追加することができますが、NT EMF データ内にな存在しないページ データを新たに追加することはできません。

NT EMF データを利用して、何か機能を実装しようとする場合は、この辺りを注意していただく必要があります。

 

ただ、稀にプリント プロセッサの仕様に反してでも、NT EMF データにレンダリング データを追加したいと要望される話を聞きます。

適切に NT EMF データをハンドリングするには、GDI Functions for Print Processors を利用するしかないので、そのような要望にお応えするのは難しいのですが、もし、そんなことをやるとしたら、MCPP(Microsoft Communications Protocol Program)[MS-EMFSPOOL]: Enhanced Metafile Spool Format を見ながら、自己努力で解析して、データを強制的に編集するしかありません。しかも、提供している API は、GDI Functions for Print Processors にある関数のみですので、データを解析したり、編集するなどのハンドリングは、API を利用することができません。

プリント プロセッサの仕様に反した実装ですので、私たちサポート チームにお問い合わせいただいても、私たちも対応することができません。

 

こう考えると、NT EMF データをハンドリングするのは、弊害が多いように思いますので、例えば、XPSDrv Printer Driver や PostScript Driver を応用した仮想プリンタ ドライバで、XPS Document や PostScript のデータを生成して、別プロセスが、それらのデータを加工したり、再度 別の物理プリンタに印刷するといった Print Path のほうが自然だと思います。

 

NT EMF データは、スプーラ サービスが生成するデータなので、一見 手短なデータだと思い、広く応用したくなるかもしれませんが、色々と考えると弊害が多いので、もし、印刷データの加工ということを考える場合は、急がば回れの気持ちで、なるべく自然な Print Path を意識した構造を心掛けるとよいと思います。

 

それでは、また。