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