【问题标题】:How to Print Pdf's without opening them in Client-Server Architecture如何在客户端-服务器架构中不打开 Pdf 就打印它们
【发布时间】:2015-09-22 13:04:30
【问题描述】:

我们有一个要求:在服务器端会生成某些 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

上述程序在开发者端运行良好,但在客户端却无法运行。我想我无法调用客户的 Adob​​e Reader。

谁能帮帮我,我如何调用客户端的 Adob​​eReader 可执行文件。

【问题讨论】:

  • 对,所以你是说他们被允许阅读它(在纸上),也不允许阅读它(在屏幕上)。这简直是​​愚蠢的。
  • @JK,批评别人的要求不好,实际上我们的要求是不要让客户将PDF保存到他的机器上。

标签: c# asp.net pdf


【解决方案1】:

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

此外,您显示的代码在服务器上运行。在开发的时候,你的开发机器恰好是服务器,这让你觉得它可以工作。

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

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

【讨论】:

    【解决方案2】:

    因为我们不知道错误,所以任何帮助您的希望都落空了。为什么吃例外?

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

    【讨论】:

    • 是的,你可以。但是让我们先看看错误是什么。
    • 我没有收到任何错误或异常。我认为它没有调用客户端机器的 Adob​​e Reader。你能帮我解决这个问题吗
    【解决方案3】:

    它适用于“开发者端”,因为服务器和客户端都引用同一台机器。它不适用于“客户端”,因为打印是在不同的机器上进行的。它正在服务器上打印,而在另一台机器上的客户端将永远看不到它。

    检查此答案以获取网页中没有预览选项的打印 https://stackoverflow.com/a/30569808/1434413

    【讨论】:

      【解决方案4】:

      我们可以通过在 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>");
      

      请注意,应在客户端计算机上安装 Adob​​eReader 才能使用此代码。

      【讨论】:

      • 等等,你做这一切只是为了自我回答?允许自行回答问题,但该问题仍需满足与任何其他问题相同的质量标准。
      • 而且顺便说一句,这甚至不起作用。用户只需查看源代码并复制src参数即可直接打开PDF。
      猜你喜欢
      • 2011-11-09
      • 1970-01-01
      • 2015-03-06
      • 1970-01-01
      • 2011-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      相关资源
      最近更新 更多