2009-08-20 94 views
1

这是一个两部分的问题:服务器端是否支持System.Printing中的XPS打印路径?

1.

原始.NET打印类(在System.Drawing.Printing)不支持在服务器端。 (请参阅http://msdn.microsoft.com/en-us/library/system.drawing.printing(VS.80).aspx

我认为服务器端支持较新的基于XPS的打印类(在System.Printing中),例如,在ASP.NET应用程序和Windows服务中,但我无法证明它。而且微软还没有回答我的问题。

这里有人知道吗?

新的基于XPS打印有时会做一个内部转换到GDI。即使应用程序使用新的打印类进行打印,但只有可用的驱动程序是旧式驱动程序的情况下。见http://msdn.microsoft.com/en-us/library/ms742418.aspx。在这种情况下,新类是否可以安全地用于服务器端?

  • 澄清 - 这完全是关于服务器打印的东西。为了讨论的目的,根本没有涉及网络浏览器。一台服务器,无论是Windows服务还是asp.net,都需要在连接到服务器的打印机上直接打印文档。

谢谢。

回答

4

正如我在下面的评论中指出的那样,在纯托管代码中没有支持服务器端打印的解决方案。

但是,Aspose刚刚发布了一些代码,允许您从托管代码打印XPS文档(成功使用PInvoke调用XPS Print API)。 [为了记录,我相信微软对于使用PInvoke来调用XPS打印的初始建议很简单,因为它是使用PInvoke进行交互的困难API。但Aspose似乎成功了,这是个好消息,因为它不需要涉及单独的任何单独的非托管DLL。]

总而言之,Aspose解决方案看起来像打印复杂文档最简单的完全支持的方式ASP.NET和Windows服务。

详情点击这里:http://www.aspose.com/documentation/.net-components/aspose.words-for-.net-and-java/howto-print-a-document-on-a-server-via-the-xpsprint-api.html

-1

如果您想让用户的浏览器从服务器代码打印,请将其忘记。您应该希望的最好方法是使用一些调用了window.print()的JavaScript代码将页面发送到浏览器。

+0

新增澄清以上 - 这是不是浏览器相关。 – 2009-08-20 06:15:47

0

.Net XPS支持是WPF的一部分。在Windows服务中使用WPF不受支持(请参阅MSDN),因此使用.Net进行XPS打印(包括使用System.Printing)也不支持服务。

同样的答案适用于问题的'转换为GDI'部分,因为该过程自动发生(如果XPS内容正在打印到PrintQueue,而驱动程序不是XPS,则框架会自动转换XPS内容到基于GDI的应用程序打印时驱动程序预期的DDI调用)。

对于需要XPS打印的服务器端开发(服务),Windows 7中提供了Win32 API。具体而言,请参阅XPSPrint API,它提供对XPS打印路径的访问并支持非XPS打印队列的自动转换以及可用于处理XPS内容和处理打印票据的API。

+0

嗯。这意味着从托管代码服务器端打印没有支持的方式。这听起来像是微软在这方面的一大漏洞! (顺便说一句,在您发布的链接中,缺少对Windows服务中WPF的支持的原因是WPF具有“执行涉及用户交互的可视化操作的权限”。打印场景中没有这些...) – 2009-08-23 20:21:26

+0

为了记录,我联系了Microsoft,他们解释说为什么System.Printing在服务器上不受支持有很多原因。这不仅仅是因为用户交互的可能性(对话等) - 还有其他原因为什么它不被服务器端支持。 因此,打印服务器端唯一支持的选项是Win32 GDI或新的“XPS打印”API,该API可通过Windows 7之前的操作系统的附加软件包提供。后者实际上设计为可从C++ 。他们建议不要通过C#的PInvoke使用XPS Print。 – 2009-09-20 19:56:52