【问题标题】:print pdf silently in c#在 C# 中静默打印 pdf
【发布时间】:2015-02-18 10:11:08
【问题描述】:

我正在尝试使用 adobe reader 静默打印 pdf。 我从以下位置获取了示例:

http://www.codeproject.com/Tips/598424/How-to-Silently-Print-PDFs-using-Adobe-Reader-and

我可以在我的本地主机中使用上述示例代码。

但是当我在服务器上部署我的应用程序时,我无法打印 PDF。

在我的 localhost 上的按钮单击事件中,我正在创建 PDF 并将其保存到一个位置并打印相同的文件。当打印 adobe 窗口打开并打印 PDF 并自动退出时。

这在我的服务器上不起作用。我能够创建和保存 PDF,但 adobe 无法打开和打印我的文件。我什至没有收到任何异常/错误。它根本不显示 adobe窗口。

有没有人遇到过同样的问题。 在这方面的任何帮助。 提前致谢。

【问题讨论】:

    标签: pdf-generation adobe acrobat


    【解决方案1】:

    编辑:

    如果您在使用 ASP.NET 或一般 IIS 的 Web 服务器上运行,则新进程将在具有受限权限的 Web 服务器上执行。我指出this answer 可以解释问题的原因。


    但是,您使用的代码不会打印任何错误消息。您可能无权访问 AcroRd32.exe 所在的目录。

    让我们从您发布的文章中获取此功能:

    public static Boolean PrintPDFs(string pdfFileName)
    {
         try
           {
                    Process proc = new Process();
                    proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                    proc.StartInfo.Verb = "print";
    
                    //Define location of adobe reader/command line
                    //switches to launch adobe in "print" mode
                    proc.StartInfo.FileName = 
                      @"C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe";
                    proc.StartInfo.Arguments = String.Format(@"/p /h {0}", pdfFileName);
                    proc.StartInfo.UseShellExecute = false;
                    proc.StartInfo.CreateNoWindow = true;
    
                    proc.Start();
                    proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                    if (proc.HasExited == false)
                    {
                        proc.WaitForExit(10000);
                    }
    
                    proc.EnableRaisingEvents = true;
    
                    proc.Close();
                    KillAdobe("AcroRd32");
                    return true;
                }
                catch
                {
                    return false;
                }
      }
    

    PrintPDFs 使用一个进程,该进程由 .NET 框架使用 Process 类调用。在 StartInfo 选项中你仔细看看设置了两个选项:

    proc.StartInfo.UseShellExecute = false;
    proc.StartInfo.CreateNoWindow = true;
    proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    

    第一个将标准输出流重定向到您的应用程序,而第二个隐藏 cmd 窗口。前者在不向用户显示命令窗口的情况下使用过程很方便,但后者隐藏了控制台窗口。主要缺点是,如果您正在调试,您可能不会看到错误发生。

    一种调试方法需要在行中添加以下内容:

     proc.StartInfo.RedirectStandardOutput = true;
     proc.Start();    
    
     Console.WriteLine(proc.StandardOutput.ReadToEnd());
    

    您可以查看的另一个属性是ExitCode。如果大于零意味着您的进程退出并出现一些错误。

    希望对您有所帮助。

    【讨论】:

    • 当我从控制台应用程序使用此 dll 时,我可以打印。当我从 Web 应用程序使用相同的 dll 时,它不起作用
    • 您的问题是在权限有限的情况下执行该进程。我编辑了答案
    【解决方案2】:

    可以使用 Acroread 命令行参数或 PDF JavaScript 事件处理程序(当然,如果您的 PDF 生成器工具可以定义/注入 PDF 的 OpenAction 处理程序)实现静默打印。

    http://pd4ml.com/cookbook/pdf_automated_printing.htm

    使用 JavaScript 方法,您不会被绑定到打印机驱动程序、网络名称或 IP 地址。另一方面,可以禁用 Acroread 中的 JavaScript,例如,通过公司安全策略。

    【讨论】:

      【解决方案3】:

      将此与Ghostscript 一起使用,即 GNU:

      ProcessStartInfo info = new ProcessStartInfo();
              var FileName = @"C:\ResultadoFormulario_CClastMovements.pdf";
              var pathPrinter = @"\\Server\namePrinter";
              info.CreateNoWindow = true;
              var pathGsw = @"path gswin64c here\";
              info.WindowStyle = ProcessWindowStyle.Hidden;
              string strCmdText = $"{pathGsw}gswin64c.exe -sDEVICE=mswinpr2 -dBATCH -dNOPAUSE -dNOPROMPT -dNoCancel -dPDFFitPage -sOutputFile=\"%printer%{direccionImpresora}\" \"{FileName}\"";
              Process.Start("CMD.exe", strCmdText);
      

      【讨论】:

        猜你喜欢
        • 2011-05-28
        • 2010-11-27
        • 2015-06-07
        • 2010-11-01
        • 2017-04-11
        • 2015-01-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多