1

适用于 Windows XP / Windows Server 2003

我正在尝试从命令行使用 Windows 图片和传真查看器 (shimgvw.dll) 将 EMF(或 WMF)文件格式打印到虚拟打印机“Microsoft XPS Document Writer”。我希望生成的 XPS 是矢量格式,就像 WMF/EMF 一样。

它适用于除 WMF 和 EMF 之外的所有图像格式。XPS 打印机保存对话框出现,但保存的 XPS 文件为空。

如果我加载 WMF 并从 Windows 图片和 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 矢量文件,无需用户交互。我想我应该能够做到这一点,因为所涉及的所有格式都属于微软。

4

1 回答 1

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 打印路径是分开的,并且在这种极端情况下缺乏将它们连接起来的努力。

-杰森

于 2009-09-14T23:59:22.077 回答