使用SHIMGVW.DLL从命令行打印EMF(WMF)

时间:2009-04-15 03:58:51

标签: printing vector xps .emf wmf

对于Windows XP / Windows Server 2003

我正在尝试使用Windows图片和传真查看器(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漏洞利用的内容,并且只能假设已经删除了这些文件的直接打印?但是,如果我可以从GUI打印这些WMF文件,那么我看不到如何避免漏洞利用。

我想要做的是以编程方式从WMF / EMF文件创建一个XPS矢量文件,无需用户交互。我想我应该能够这样做,因为所涉及的所有格式都属于到微软。

1 个答案:

答案 0 :(得分:0)

在C中查看以下示例,了解如何将GDI命令导入XPS文档: http://blogs.msdn.com/fyuan/archive/2005/09/16/469076.aspx

你想要做的是创建打印机DC,调用StartDoc,调用StartPage,然后设置视口和窗口比例以放置emf,调用PlayEnhMetaFile(),EndPage,EndDoc。

Feng Yuan演示的技巧是使用StartDoc的DocInfo参数指定输出XPS文件名,我建议你将图元文件内容播放到打印机DC中。

我相信EMF漏洞利用Microsoft Update暂时关闭了。您可能看到的问题是由于GDI和XPS打印路径是分开的,并且在这个角落的情况下缺乏桥接它们的努力。

-Jason