如何在不打开客户端 - 服务器架构的情况下打印Pdf

时间:2015-09-22 13:04:30

标签: c# asp.net pdf

我们有一个要求:某些PDF将在服务器端生成。我们需要让客户端在不打开这些文件的情况下获取这些文件的PrintOut。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PdfPrinter
{
class Program
{
    static void Main(string[] args)
    {
        string[] files = Directory.GetFiles(@"d:\files");
        foreach (string file in files.Where(
                    file => file.ToUpper().Contains(".PDF")))
        {
            Pdf.PrintPDFs(file);
        }
    }
}//END Class

public class Pdf
{
    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\Acrobat Reader    DC\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;
        }
    }

    //For whatever reason, sometimes adobe likes to be a stage 5 clinger.
    //So here we kill it with fire.
    private static bool KillAdobe(string name)
    {
        foreach (Process clsProcess in Process.GetProcesses().Where(
                     clsProcess => clsProcess.ProcessName.StartsWith(name)))
        {
            clsProcess.Kill();
            return true;
        }
        return false;
    }
}//END Class
}//END Namespace

以上程序在开发人员端工作正常,但它不在客户端工作。我想我无法调用客户端的Adobe Reader。

任何人都可以帮助我,我如何调用客户端的AdobeReader可执行文件。

4 个答案:

答案 0 :(得分:0)

因为我们不知道错误,所以帮助你的任何希望都会丢失。为什么你吃这个例外?

try { ... } catch { return false; }更改为

 try { ... }
 catch (Exception e)
 {
   Debug.WriteLine(e.Message);
   return false;
 }

更新

  1. 确保pdfFileName是绝对路径,例如" C:\ FOO \ foo.pdf"不 " foo.pdf"

  2. pdf文件的路径可能包含空格,请尝试

    proc.StartInfo.Arguments = String.Format("/p /h \"{0}\"", pdfFileName);

答案 1 :(得分:0)

由于非常明显的原因,您无法从网页上启动客户端计算机上的任意可执行文件。

此外,您显示的代码在服务器上运行。在开发过程中,您的开发机器恰好是服务器,这让您认为它有效。

在没有用户干预的情况下,没有万无一失的,跨浏览器,跨平台的方式来正确地从网页打印文档。

唯一可行的解​​决方法是在iframe / embed中显示PDF,并从父框架上调用window.print()。请参阅Print PDF directly from JavaScript

答案 2 :(得分:0)

它适用于"开发者方面"因为服务器和客户端都引用同一台机器。它不适用于客户端"因为打印是在不同的机器上进行的。它将被打印在服务器上,而位于不同计算机上的客户端将永远不会看到它。

从网页上检查此答案是否有无预览选项 https://stackoverflow.com/a/30569808/1434413

答案 3 :(得分:-1)

我们可以通过在C#

中使用System.Web.UI命名空间来完成此操作

首先将以下代码添加到.aspx

 <object id = "Object1" name="Pdf2" 
     type="application/pdf" width="1" height="1" >
    <param name='SRC' value='NameOfPDFfile'/>

然后使用以下代码.CS文件

ClientScript.RegisterScript(typeof(Page),"MessagePopUp","<script language="+"JavaScript"+">document.Pdf2.printAll()></script>");

请注意,AdobeReader应安装在客户端计算机上以便使用此代码。