微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法从服务器端ASP.NET App打印PDF文档

如何解决无法从服务器端ASP.NET App打印PDF文档

前言:

我们正在开发一套应用程序(移动和桌面),这些应用程序利用由 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;
}

我们尝试过:

  1. 文件名设置为.PDF以进行打印,并使用动词“ Print”和“ PrintTo”
  2. 将UseShellExecute设置为True和False
  3. 将网络凭据和LoadUserProfile传递为True
  4. 将运行我们的应用的ASP.NET AppPool设置为LocalSystem
  5. 通过命令行运行相同的打印命令(以其他用户身份登录)并打印文档。

重要发现:

  1. 利用Adobe Acrobat Reader DC,我们看到它在服务器上以用户名空白而不是SYstem或其他名称启动,尽管没有文档发送到打印机。在本地运行代码时,Adobe Acrobat Reader DC将以用户登录时的用户名启动,并成功打印文档。
  2. PDF文档存在,并且已经在本地和服务器上进行了验证。
  3. 没有引发异常,Adobe Acrobat Reader DC成功打开,只是没有文档发送到服务器上的打印机。

作为我们意图的另一个基本原理:我们希望将打印逻辑集中在多个单独的应用程序上,而不是为每个应用程序实现打印。打印还利用了一个映射,该映射使我们可以为SSRS中的各种报告定义它们应动态转到的打印机;因此我们认为应该走这条路。我觉得我们真的很接近,我不确定这里出了什么问题。

请让我知道您的想法,我将非常感谢。

解决方法

通过大量的阅读和反复试验,我们找到了一种解决此问题的解决方案:从使用Adobe Acrobat Reader转换为Foxit Reader。主要区别似乎在于Adobe Acrobat Reader需要加载用户配置文件才能正常工作,而Foxit则不需要。

我正在发布此信息,以便万一遇到任何需要的人,他们可以看到对我们有用的方法。该代码确实有效,但正是我们利用的其他应用程序却没有。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。