从.Net Windows服务打印tiff文件

时间:2008-11-04 17:15:42

标签: .net printing service

我们已经构建了一个应用程序,它接收多个不同格式的文件,pdf,tiff,jpeg,doc等。收到后,使用第三方打印驱动程序将它们转换为tiff文件,该驱动程序本地安装在服务器上并设置作为默认打印机。为此,我们使用命令行和参数打开System.Diagnostics.Process,以使用适当的应用程序打印文件。

现在新版本需要是一个Windows服务,到目前为止一切正常,除了打印部分。每当进程启动时,它永远不会引发异常,一切似乎都正常工作,但文件永远不会被打印出来。如果我打开任务管理器,我可以看到MS Paint已执行(如果是jpeg文件),但没有输出tiff文件。

作为旁注,最终文件需要是tiff文件,因为我们的客户使用的是另一种第三方工具,这是它支持的唯一格式。

任何帮助将不胜感激。 塞尔吉奥罗梅罗

我们使用的代码如下:

private const string PROCESS_COMMAND = "mspaint.exe";  
private const string PROCESS_ARGUMENTS = @"""{0}""";  

Process proc = new Process();  
ProcessStartInfo startInfo = new ProcessStartInfo();  
string error = string.Empty;  

startInfo.FileName = PROCESS_COMMAND;  
startInfo.Arguments = string.Format(PROCESS_ARGUMENTS, fileFullPath);  
startInfo.UseShellExecute = false;  
startInfo.RedirectStandardError = true;  

proc.EnableRaisingEvents = false;  
proc.StartInfo = startInfo;  

proc.Start();  

using(StreamReader errorReader = proc.StandardError)  
{  
    string standardError = string.Empty;  
    while((standardError = errorReader.ReadLine()) != null)  
    {  
        error += standardError + " ";  
    }  
}  
proc.WaitForExit();

5 个答案:

答案 0 :(得分:3)

我建议的第一件事就是让服务在特定用户的上下文中运行。然后以该用户身份登录服务器并确保已安装打印机,将其设置为默认值等等。

其次,放弃MS Paint解决方案以简化操作。您可以使用System.Drawing.Image.FromFile(YourImageFilePath)在.NET中加载图像,并使用PrintDocument完成其余的工作......

创建一个PrintDocument对象,定义你的设置(要使用的打印机,边距等),为文档的PrintPage事件添加一个处理程序,它执行e.Graphics.DrawImage(YourTiffImageObject,New Rectangle(0)的行。 ,0,e.MarginBounds.Width,e.MarginBounds.Height))将TIFF图像绘制到页面上。最后,您调用PrintDocument对象的.Print方法,然后将其移除。

这样,.NET正在处理打印 - 而不是一些随机的第三方应用程序。

当您一次处理多个页面时,会有一些小的代码更改(主要是调用SelectActiveFrom来更改多页TIFF页面并在PrintPage事件中设置e.HasMorePages = True,直到您阅读最后一页)但这些都非常容易且记录完备。

更新: 为了完整起见,我想我应该添加其他人已经提到的内容......某些应用程序可能需要桌面访问才能正常运行。如果您坚持使用MS Paint,则可能需要在服务属性中启用“允许服务与桌面交互”。

答案 1 :(得分:0)

我不确定关于MSPaint的部分......但是如果您的应用程序作为控制台应用程序而不是服务,则可能是服务器没有权限执行您的用户帐户所做的事情。

您可能希望尝试在服务登录时排除权限问题。

答案 2 :(得分:0)

检查用于安装服务的用户是否具有正确的打印权限和/或访问文件,我还建议使用事件记录

答案 3 :(得分:0)

从控制台应用运行时,MSPaint是否会打开?如果是这样,可能是因为你的服务无头;它没有显示UI的权限。所以,MSPaint基本上是因为无法在没有错误的情况下打开它的UI而保释。

为什么不直接从.NET打印?您可以通过服务执行此操作。但是,有一些关于System.Printing的警告并非设计用于服务。我不知道为什么,所以。我之前没有遇到任何问题......

答案 4 :(得分:0)

我们遇到了服务试图启动应用程序的各种问题。通常使用安全/凭证,或者也可以像启用“允许服务与桌面交互”一样,因为应用程序(在本例中为mspaint)可能需要这样做。

话虽这么说,我同意Kevin,沟通MSPaint并且在.NET内本地打印,或者只是转换问题,使用.NET进行转换。另一种方法是研究一些比MSPaint更复杂的东西,例如LibTIFF等库,甚至像Ghostscript这样的东西来处理.NET内部可能不支持的格式,如PDF。