Печать EMF (WMF) из командной строки с использованием SHIMGVW.DLL - PullRequest
1 голос
/ 15 апреля 2009

Для Windows XP / Windows Server 2003

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

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

Я могу сделать это, если я загружаю WMF и нажимаю Файл> Печать в графическом интерфейсе Windows Picture and FaxViewer, но не в командной строке. Также, если я щелкну правой кнопкой мыши по файлу WMF в проводнике Windows и нажму «Печать», он не разрешит печатать выбранный файл WMF (он фильтрует файлы WMF и EMF из списка).

Код:
ProcessStartInfo info = new ProcessStartInfo();<br> info.FileName = @"C:\WINDOWS\System32\rundll32.exe";<br> info.Arguments = @"C:\WINDOWS\System32\shimgvw.dll,ImageView_PrintTo /pt ""c:\vectorImage.emf"" ""Microsoft XPS Document Writer""";<br> Process.Start(info);

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

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

1 Ответ

0 голосов
/ 15 сентября 2009

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

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

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

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

1010 * Джейсон *

...