从Windows服务打印EMF

时间:2012-04-11 13:22:50

标签: c# .net-3.5 printing windows-services system.printing

我有一些使用System.Drawing.Printing命名空间打印文档的代码。现在需要将其移动到Windows服务中。 The documentation指出这是不可能的,这将支持我迄今为止的调查结果(因为它不起作用)。我的工作是假设我可以通过使用System.Printing命名空间来实现这一点。

这是我到目前为止的代码:

private Metafile myDoc;

myDoc = GetEmfDoc();

PrintServer ps = new PrintServer("\\server1\printer1");
EnumeratedPrintQueueTypes[] flags = { EnumeratedPrintQueueTypes.Local };
PrintQueueCollection queues = ps.GetPrintQueues(flags);

PrintQueue pq = queues.First<PrintQueue>();                
pq.AddJob("JobName", ?);

所以我想将myDoc传递给pq.AddJob(),但这似乎不可能。使用System.Drawing.Printing可以在PrintDocument.PrintPage事件中逐页呈现此内容。

我正在尝试做什么,如果是的话,有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:2)

  

不支持在Windows服务或ASP.NET应用程序或服务中使用System.Drawing.Printing命名空间中的类。尝试在其中一种应用程序类型中使用这些类可能会产生意外问题,例如服务性能下降和运行时异常。

了解“不支持”在此背景下的含义非常重要。它的字面意思是它所说的,你尝试从服务打印并发现问题然后你不能打电话给Microsoft支持并寻求帮助。

这是由System.Drawing引起的问题,它是打印机驱动程序的一般问题。由打印机制造商提供的代码块,而不是Microsoft。它们的一个重要问题是它们总是被设计为从桌面程序中使用。 Word,Acrobat等。他们很容易利用这一点,他们经常会弹出一个窗口让你知道他们正在努力。至少垃圾邮件的制造商名称并提醒您墨粉盒已经半空。这些司机可能在服务中行为不端。注释中提到的“运行时例外”短语。

他们最糟糕的问题是他们使用弹出窗口让你知道有问题。从服务使用打印机驱动程序时,这些窗口不可见。所以你必须处理打印工作,因为没有明显的理由拒绝打印。说明中的“服务绩效减少”一词。这是非常难以处理的,当他们无法看到任何诊断时,IT人员无法解决问题。

您的方法无法解决这一根本问题。如果您真的想要这样做,请联系打印机制造商并询问具体建议。不要抱有希望,从硬件公司那里得到好的答案是非常困难的。

答案 1 :(得分:1)

这是权限问题和Session 0隔离的组合......

以下内容可能会解决您遇到的问题,但我不推荐它:

如果你真的想要/需要做这项工作,你需要从Session 0内部(不是来自“普通”用户)登录远程服务器(在你的示例server1中)(事先!)会话) - 交互式(您可以通过rundll32 winsta.dll,WinStationSwitchToServicesSession切换到会话0桌面)或通过某些调用(例如使用WNetAddConnection2和远程计算机的正确凭据,遗憾的是这可以从.NET使用只能通过p / invoke或COM使用WScript.Network)。用于此登录的凭据需要具有有关在远程计算机上打印的完全权限。

答案 2 :(得分:0)

您是否在拥有使用打印机所需权利的帐户中运行服务? Windows Services FAQ

中的更多详细信息