我们有一个要求:某些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可执行文件。
答案 0 :(得分:0)
因为我们不知道错误,所以帮助你的任何希望都会丢失。为什么你吃这个例外?
将try { ... } catch { return false; }
更改为
try { ... }
catch (Exception e)
{
Debug.WriteLine(e.Message);
return false;
}
更新
确保pdfFileName
是绝对路径,例如" C:\ FOO \ foo.pdf"不
" foo.pdf"
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应安装在客户端计算机上以便使用此代码。