对于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矢量文件,无需用户交互。我想我应该能够这样做,因为所涉及的所有格式都属于到微软。
答案 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