Печать EMF (WMF) из командной строки с помощью SHIMGVW.DLL

Для Windows XP / Windows Server 2003

Я пытаюсь распечатать файл формата EMF (или WMF) на виртуальном принтере «Microsoft XPS Document Writer» с помощью Windows Picture and Fax Viewer (shimgvw.dll) из командной строки. Я хочу, чтобы полученный XPS был в векторном формате, например, WMF / EMF.

Он работает со всеми форматами изображений, кроме WMF и EMF. Появится диалоговое окно сохранения принтера XPS, но сохраненный файл XPS пуст.

Я могу это сделать, если загружу WMF и щелкну «Файл»> «Печать» из графического интерфейса Windows Picture и FaxViewer, но не из командной строки. Кроме того, если я щелкните правой кнопкой мыши файл WMF в проводнике Windows и нажмите кнопку «Печать», это не позволит распечатать выбранный файл 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 из графического интерфейса, я не понимаю, как удалось избежать эксплойта.

Я хочу создать векторный файл XPS из файла WMF / EMF программно, без необходимости взаимодействия с пользователем. Я полагаю, что смогу это сделать, потому что все задействованные форматы принадлежат Microsoft.


person Community    schedule 15.04.2009    source источник


Ответы (1)


Взгляните на следующий пример на языке C, чтобы узнать, как добавить команды GDI в документ XPS: http://blogs.msdn.com/fyuan/archive/2005/09/16/469076.aspx

Что вы хотите сделать, это создать DC принтера, вызвать StartDoc, вызвать StartPage, затем настроить область просмотра и масштаб окна для размещения emf, вызвать PlayEnhMetaFile (), EndPage, EndDoc.

Уловка, которую демонстрирует Фэн Юань, заключается в использовании аргумента DocInfo для StartDoc, чтобы указать имя выходного файла XPS, и я предлагаю воспроизвести содержимое метафайла в DC принтера.

Я считаю, что эксплойт EMF был закрыт некоторое время назад Центром обновления Майкрософт. Проблема, которую вы, вероятно, наблюдаете, связана с разделением путей печати GDI и XPS и отсутствием усилий по их соединению в этом угловом случае.

-Джейсон

person Jason Harrison    schedule 14.09.2009