如何在客户端-服务器架构中打印Pdf's而不打开它们

本文关键字:Pdf 客户端 服务器 打印 | 更新日期: 2023-09-27 18:13:52

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

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可执行文件

如何在客户端-服务器架构中打印Pdf's而不打开它们

你不能从一个网页在客户端机器上启动任意的可执行文件,原因很明显。

同样,您所显示的代码在服务器上运行。在开发时,您的开发机器恰好是服务器,这使您认为它可以工作。

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

唯一可行的解决方法是在iframe/embed中显示PDF,并从父框架中调用window.print()

好吧,我们不知道这个错误,所以任何帮助你的希望都破灭了。你为什么要吃例外?

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);

它在"开发端"工作,因为服务器和客户端都引用同一台机器。它不能在"客户端"工作,因为打印是在不同的机器上进行的。它被打印在服务器上,而在另一台机器上的客户端永远不会看到它。

检查这个答案从网页打印不预览选项https://stackoverflow.com/a/30569808/1434413

我们可以在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必须安装在客户端机器上才能运行此代码。