问题描述
前言:
我们正在开发一套应用程序(移动和桌面),这些应用程序利用由 Windows Server 2008 R2 服务器上运行的ASP.NET应用程序维护的restapi。我们在后端集成的功能之一是打印功能,该功能从我们的SSRS服务中提取pdf,然后打印到网络打印机。
静默打印和利用不同的产品有很多线程,并且大多数解决方案都在我的本地计算机上运行( Windows 10 );但是,将代码移至服务器时,我们发现部分代码已执行,但文档从未到达打印机。
我们的代码:
private async Task<bool> Print(string filename,string printer)
{
var processFilename = Microsoft.Win32.Registry.LocalMachine
.OpenSubKey("Software")
.OpenSubKey("Microsoft")
.OpenSubKey("Windows")
.OpenSubKey("CurrentVersion")
.OpenSubKey("App Paths")
.OpenSubKey("AcroRd32.exe")
.GetValue(String.Empty).ToString();
var fileInfo = new FileInfo(processFilename);
var workingDirectory = fileInfo.Directory.FullName;
Process process = new Process();
process.EnableRaisingEvents = true;
process.StartInfo = new processstartinfo()
{
CreateNowindow = true,FileName = processFilename,UseShellExecute = true,WindowStyle = ProcessWindowStyle.Hidden,ErrorDialog = false,Arguments = $"/t {filename} \"{printer}\"",WorkingDirectory = workingDirectory
};
try
{
var processstarted = process.Start();
if (processstarted)
{
LogHelper.WriteLog($"Print Process Started. Process: {process.ProcessName}");
}
else
{
process.Close();
LogHelper.WriteLog($"Print Process Not Started.");
throw new Exception("Error in PrintHelper.Print(): Print Process did not start.");
}
Console.WriteLine("Began Printing! (Test)");
}
catch (Exception e)
{
LogHelper.WriteLog($"Error in PrintHelper.Print(): {e.Message}");
throw e;
}
finally
{
process.Close();
Console.WriteLine("Finished Printing! (Test)");
}
LogHelper.WriteLog("Ending PrintHelper.Print().");
return true;
}
我们尝试过:
- 将文件名设置为.PDF以进行打印,并使用动词“ Print”和“ PrintTo”
- 将UseShellExecute设置为True和False
- 将网络凭据和LoadUserProfile传递为True
- 将运行我们的应用的ASP.NET AppPool设置为LocalSystem
- 通过命令行运行相同的打印命令(以其他用户身份登录)并打印文档。
重要发现:
- 利用Adobe Acrobat Reader DC,我们看到它在服务器上以用户名空白而不是SYstem或其他名称启动,尽管没有文档发送到打印机。在本地运行代码时,Adobe Acrobat Reader DC将以用户登录时的用户名启动,并成功打印文档。
- PDF文档存在,并且已经在本地和服务器上进行了验证。
- 没有引发异常,Adobe Acrobat Reader DC成功打开,只是没有文档发送到服务器上的打印机。
作为我们意图的另一个基本原理:我们希望将打印逻辑集中在多个单独的应用程序上,而不是为每个应用程序实现打印。打印还利用了一个映射,该映射使我们可以为SSRS中的各种报告定义它们应动态转到的打印机;因此我们认为应该走这条路。我觉得我们真的很接近,我不确定这里出了什么问题。
请让我知道您的想法,我将非常感谢。
解决方法
通过大量的阅读和反复试验,我们找到了一种解决此问题的解决方案:从使用Adobe Acrobat Reader转换为Foxit Reader。主要区别似乎在于Adobe Acrobat Reader需要加载用户配置文件才能正常工作,而Foxit则不需要。
我正在发布此信息,以便万一遇到任何需要的人,他们可以看到对我们有用的方法。该代码确实有效,但正是我们利用的其他应用程序却没有。