从.NET服务打印

Chr*_*org 21 .net c# printing windows-services

我正在处理一个项目,涉及从另一个应用程序接收消息,格式化该消息的内容,并将其发送到打印机.选择的技术是C#windows服务.我想,输出可以称为报告,但不需要报告引擎.一个简单的模板引擎,如StringTemplate,甚至XSLT输出HTML都可以.我遇到的问题是找到一种从服务中打印此类输出的免费方法.因为它似乎认为它会工作,我在一个工作原型使用微软的RDLC,填充本地报表,然后使其作为一个图像到内存流,我会再打印.问题是:

  • 多页打印将是一个很大的问题.
  • 还是要用的PrintDocument打印内存流,这是在Windows服务不支持(虽然它可能工作 - 与原型远远没有得到尚)
  • 如果数据发生变化,我必须更改数据集和数据被反序列化的类.坏坏.

有没有人不得不像这样远程做任何事情?有什么建议?我已经发布了一个问题有关打印HTML无需用户输入,并就浪费约3天后,我来,它不能做的结论,至少不与任何免费提供的工具.

所有帮助表示赞赏.

编辑:我们在.NET框架的2.0版本.

Vai*_*hav 14

相信我,与购买第三方组件相比,您将花更多的钱尝试搜索/开发此解决方案.不要重新发明轮子并寻求付费解决方案.

打印是一个复杂的问题,我很想看到为此添加更好的框架支持的那一天.


Yan*_*vin 9

从Windows服务打印真的很痛苦.它似乎有效......有时候......但最后它不时会出现异常情况或没有任何明确原因.这真的没有希望了.在官方方面,它甚至没有得到任何解释的支持,也没有任何替代解决方案的建议.

最近,我遇到了这个问题,经过几次不成功的试验和试验后,我终于找到了两个可行的解决方案:

  • 使用Win32 API编写自己的打印DLL(例如在C/C++中),然后使用P/Invoke从服务中使用它(工作正常)
  • 编写自己的打印COM +组件,然后从您的服务中使用它.我最近选择了这个解决方案成功(但它是第三方COM +组件,不是自己编写的)它的工作原理也一样.

  • GDI +从未被设计/测试过在服务环境中工作.这就是为什么它不起作用.你应该使用GDI和它的功能来绘制.请参阅此文档以查找等效的Win32调用:http://msdn.microsoft.com/en-us/library/aa302340.aspx#win32map_printingfunctions (2认同)

Nic*_*ick 7

我做到了 这是A*s的痛苦.问题是打印需要GDI引擎到位,这通常意味着您必须拥有桌面,只有在您登录时才会加载.如果您尝试从服务器上的服务执行此操作,那么你通常没有登录.

因此,首先您不能作为普通服务用户运行,而是作为具有交互式登录权限的真实用户运行.然后你必须调整服务注册表项(我忘了现在如果你真的感兴趣的话,必须找到我今晚可以做的代码).最后,你必须祈祷.

您最大的长期头痛将是打印驱动程序.如果您在没有登录用户的情况下作为服务运行,则某些打印驱动程序会不时弹出对话框.打印机墨粉用完后会发生什么?还是没纸了?驱动程序可能会弹出一个永远不会看到的对话框,并因为没有人登录而占用打印机队列!


Dou*_*son 5

要回答您的第一个问题,根据数据,这可能相当简单。我们有各种基于服务的应用程序,可以完全满足您的要求。通常,我们解析传入的文件并在其周围包裹我们自己的 Postscript 或 PCL。如果您的布局相当简单,那么您可以使用一些非常基本的 PCL 代码将其包装起来,以提供您想要的字体/打印布局(我很乐意在此离线为您提供一些指导)。

如果您有打印就绪文件,您可以将其发送到共享的 UNC 打印机、直接发送到本地安装的打印机,甚至发送到设备的 IP(RAW 或 LPR 类型数据)。

但是,如果您要使用 PDF 路径,最简单的方法是将 PDF 输出发送到支持直接 PDF 打印的打印机(现在很多都支持)。在这种情况下,您只需将 PDF 发送到设备并打印出来。

另一种选择是启动Ghostscript,它应该可以免费满足您的需要(检查许可,因为它们有几个不同的版本、一些 GNU、一些 GPL 等)并使用它的内置打印功能或简单地转换为 Postscript 并发送到装置。我已经在服务应用程序中多次使用 Ghostscript,但不是一个超级粉丝,因为您基本上会掏出并执行命令行应用程序来进行转换。话虽如此,它是一个稳定的应用程序,它确实容易优雅地失败