1

Windows XP / Windows Server 2003 の場合

コマンド ラインから Windows Picture and Fax Viewer (shimgvw.dll) を使用して、EMF (または WMF) ファイル形式を仮想プリンター "Microsoft XPS Document Writer" に印刷しようとしています。結果の XPS を、WMF/EMF のようにベクター形式にしたいと考えています。

WMF と EMF を除くすべての画像形式で動作します。XPS プリンターの保存ダイアログが表示されますが、保存された XPS ファイルは空です。

WMF をロードし、Windows Picture and FaxViewer の GUI から [ファイル] > [印刷] をクリックすれば実行できますが、コマンド ラインからは実行できません。また、Windows エクスプローラーで WMF ファイルを右クリックして [印刷] をクリックしても、選択した WMF ファイルを印刷できません (リストから WMF ファイルと EMF ファイルを除外します)。

コード:
ProcessStartInfo info = new ProcessStartInfo();
info.FileName = @"C:\WINDOWS\System32\rundll32.exe";
info.Arguments = @"C:\WINDOWS\System32\shimgvw.dll,ImageView_PrintTo /pt ""c:\vectorImage.emf"" ""Microsoft XPS Document Writer""";
Process.Start(info);

しばらく前に WMF エクスプロイトについてよく読んだことがありますが、これらのファイルの直接印刷が削除されたとしか思えませんか? しかし、これらの WMF ファイルを GUI から印刷できたとしても、どのようにして悪用を回避したのかわかりません。

私がやりたいことは、ユーザーの操作を必要とせずに、プログラムで WMF/EMF ファイルから XPS ベクター ファイルを作成することです。関連するすべての形式がマイクロソフトに属しているため、これを行うことができるはずだと思います。

4

1 に答える 1

0

GDI コマンドをXPSドキュメントに取り込む方法については、次の C の例を参照してください。

あなたがしたいことは、プリンタ DC を作成し、StartDoc を呼び出し、StartPage を呼び出し、emf を配置するためのビューポートとウィンドウ スケールを設定し、PlayEnhMetaFile()、EndPage、EndDoc を呼び出すことです。

Feng Yuan が提示しているトリックは、DocInfo 引数を StartDoc に使用して、出力 XPS ファイル名を指定することです。私が提案しているのは、メタファイルの内容をプリンター DC に再生することです。

EMF エクスプロイトは、Microsoft Update によってしばらく前にクローズされたと思います。おそらく発生している問題は、GDI と XPS の印刷パスが分離されており、このコーナー ケースではそれらを橋渡しする努力が不足しているためです。

-ジェイソン

于 2009-09-14T23:59:22.077 に答える