C# 服务器端是否支持System.Printing中的XPS打印路径?

C# 服务器端是否支持System.Printing中的XPS打印路径?,c#,printing,xps,C#,Printing,Xps,这是一个由两部分组成的问题: 一, 服务器端不支持原始.NET打印类(在System.Drawing.Printing中)。(见附件) 我认为较新的基于XPS的打印类(在System.printing中)在服务器端是受支持的,例如在ASP.NET应用程序和Windows服务中,但我无法证明这一点。微软还没有回答我关于它的问题 这里有人知道吗 二, 新的基于XPS的打印有时会进行到GDI的内部转换。这适用于唯一可用的驱动程序是旧式驱动程序的情况,即使应用程序正在使用新的打印类打印。看见在这种情况下

这是一个由两部分组成的问题:

一,

服务器端不支持原始.NET打印类(在System.Drawing.Printing中)。(见附件)

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

这里有人知道吗

二,

新的基于XPS的打印有时会进行到GDI的内部转换。这适用于唯一可用的驱动程序是旧式驱动程序的情况,即使应用程序正在使用新的打印类打印。看见在这种情况下,服务器端使用新类是否安全

  • 澄清一下-这完全是关于服务器打印的东西。在本讨论中,根本不涉及web浏览器。服务器(windows service或asp.net)需要在连接到服务器的打印机上直接打印文档


谢谢。

如果您试图让用户的浏览器从服务器代码打印,请忘记它。您最好希望向浏览器发送一个页面,其中包含一些调用
窗口的javascript代码。在.Net XPS支持中,print()
是WPF的一部分。不支持在Windows服务中使用WPF(请参阅),因此服务也不支持使用.Net进行XPS打印,包括使用System.printing

同样的答案也适用于问题的“转换为GDI”部分,因为该过程是自动进行的(如果XPS内容被打印到驱动程序不是XPS的打印队列中,则如果基于GDI的应用程序正在打印,框架会自动将XPS内容转换为驱动程序预期的DDI调用)


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

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

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

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


这里的详细信息:

我认为您不需要这些ASPnose API

这里有一个示例代码可以完全做到这一点:


上面添加了说明-这与浏览器无关。Hmmm。这意味着不支持从托管代码服务器端打印。这听起来像是微软的一个重大疏忽!(顺便说一句,在您发布的链接上,Windows服务中缺少对WPF的支持的原因是WPF拥有“执行涉及用户交互的可视化操作的权限”。打印场景中没有这些…)作为记录,我联系了Microsoft,他们解释了服务器不支持System.Printing的原因。这不仅仅是因为用户交互(对话框等)的可能性——还有其他原因不支持服务器端。因此,打印服务器端唯一受支持的选项是Win32 GDI或新的“XPS打印”API,它可以通过Windows 7之前的操作系统的附加包获得。后者实际上是设计为C++调用的。他们建议不要通过C#的PInvoke使用XPS打印。嘿,这正是Aspose的解决方案,发布在第三方论坛上!