3

我们已经构建了一个应用程序,可以接收多个不同格式的文件,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();
4

5 回答 5

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,您可能需要在服务属性中启用“允许服务与桌面交互”。

于 2008-11-04T17:45:08.730 回答
0

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

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

于 2008-11-04T17:26:22.343 回答
0

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

于 2008-11-04T17:34:48.190 回答
0

从控制台应用程序运行时,MSPaint 是否打开?如果是这样,可能是因为您的服务正在无头运行;它无权显示 UI。因此,MSPaint 基本上可以保释,因为它无法在不出错的情况下打开其 UI。

为什么不直接从.NET 打印呢?您可以通过服务执行此操作。但是,有一些关于 System.Printing 的警告不是为服务使用而设计的。我不知道为什么,寿。我以前做过,没有问题...

于 2008-11-04T17:40:15.247 回答
0

我们在尝试启动应用程序时遇到了各种问题。通常是使用安全/凭据,或者也可以是启用“允许服务与桌面交互”之类的东西,因为应用程序(在本例中为 mspaint)可能需要它。

话虽如此,我同意 Kevin 的观点,放弃 MSPaint 并在 .NET 中本地打印,或者如果只是转换问题,则使用 .NET 进行转换。另一种方法是使用诸如 LibTIFF 之类的库或什至诸如 Ghostscript 之类的库来研究比 MSPaint 更复杂的东西,以处理 .NET 内部可能不支持的格式,例如 PDF。

于 2008-11-04T18:52:47.037 回答