使用ASP.NET和Acrobat Reader打印PDF

问题描述 投票:1回答:2

我在IIS上有一个Web应用程序,我将打印一个文件pdf。

  • 打印机是共享打印机,物理连接到另一台计算机。
  • 该网站具有应用程序池标识,并且虚拟帐户(DomainName \ NameComputer $)对打印机具有完全权限。
  • 'IIS APPPOOL \ NameAP'可以完全控制Acrobat Reader(AcroRd32.exe)
  • 操作系统:Windows Server 2008 R2

我使用Process类与此代码:

ProcessStartInfo infoPrintPdf = new ProcessStartInfo();
infoPrintPdf.FileName = pathPdf;
string printerName = "\\namePC\namePrinter";
infoPrintPdf.FileName = "...\AcroRd32.exe";
infoPrintPdf.Arguments = string.Format("/t {0} \"{1}\"", 
    pathPdf, printerName);
infoPrintPdf.CreateNoWindow = true;
infoPrintPdf.UseShellExecute = false;
infoPrintPdf.WindowStyle = ProcessWindowStyle.Hidden;
Process printPdf = new Process();
printPdf.StartInfo = infoPrintPdf;
printPdf.Start();
printPdf.WaitForExit();
printPdf.Close();

进程AcroRd32.exe保持运行状态,不打印。任何的想法?


我尝试在服务器上打开文件pdf并且不起作用。提取:Process.Start(@“... \ Print.pdf”);进程AcroRd32.exe运行时使用用户名'IIS APPPOOL \ NameAP'使用Visual Studio进行调试此代码可以正常运行。

c# asp.net pdf iis
2个回答
0
投票

我在Console应用程序中进行了测试,它正在运行,修改代码并使用更好的命名:

var exePath = @"C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe";
var pdfFile = @"E:\program.pdf";
var infoPrintPdf = new ProcessStartInfo
{
    FileName = exePath,
    Arguments = String.Format("/t {0} ", pdfFile),
    CreateNoWindow = true,
    UseShellExecute = false,
    WindowStyle = ProcessWindowStyle.Hidden
};

var printPdf = new Process();
printPdf.StartInfo = infoPrintPdf;
printPdf.Start();
printPdf.WaitForExit();
printPdf.Close();

除了app pool Identity,请检查传递的参数。


0
投票

我刚刚测试了它,它为我打印。

问题可能是您的打印机名称:"....\file.pdf"。这应该是Windows控制面板中“设备和打印机”中显示的打印机名称。如果您不提供打印机名称,则使用默认打印机。

修复后,如果仍然无法打印,可能是应用程序池标识无法访问您的打印机?打开打印机属性时,有一个“安全”选项卡。 Mine显示默认情况下“Everyone”存在,所以这可能不是问题,但您可以尝试添加应用程序池组(IIS_IUSRS)并查看它是否有所作为。

在我的测试中,Reader在打印后确实保持打开状态。显然,这种行为无法改变。来自Adobe forums

使用Reader不可能做到这一点。

您可以使用单独的命令来终止Reader进程,但问题是您不能告诉它等到发送打印命令,因此它不太可能工作。

但我确实发现这个程序只是为了解决这个问题:http://www.biopdf.com/acrowrap/close_adobe_reader.php

© www.soinside.com 2019 - 2024. All rights reserved.