在c#中静默打印pdf

时间:2015-02-18 10:11:09

标签: pdf-generation adobe acrobat

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

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

我能够根据需要使用我的localhost中的上述示例代码。

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

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

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

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

3 个答案:

答案 0 :(得分:0)

编辑:

如果您使用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框架使用进程类调用该进程。在 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。如果它大于零意味着您的进程退出并出现一些错误。

希望它有所帮助。

答案 1 :(得分:0)

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

请参阅http://pd4ml.com/cookbook/pdf_automated_printing.htm

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

答案 2 :(得分:0)

将此与 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);