我搜索了谷歌并找到了几个解决方案。我使用了以下代码。当应用程序通过带有IIS Express的Visual Studio运行时,它可以打印到我的网络打印机但是当我将应用程序托管到我的本地主机时,以下代码不会打印任何内容。
ProcessStartInfo psi = new ProcessStartInfo(pdfFileName) { Verb = "Print" };
psi.CreateNoWindow = true;
psi.WindowStyle = ProcessWindowStyle.Hidden;
Process p = new Process();
p.StartInfo = psi;
Process.Start(psi);
System.Threading.Thread.Sleep(5000);
if (false == p.CloseMainWindow())
{
p.Kill();
}
else
{
p.WaitForInputIdle();
}
我完全陷入困境。请给我建议或给我样本代码或链接。
答案 0 :(得分:0)
如果我正确地理解了这一点,那么您将使用PDF的文件名启动一个新进程,并尝试将动词传递给该进程,以便它知道该怎么做(打印PDF)。
我会注释掉“CreateNoWindow”部分,看看会发生什么。服务器上是否有能够打开和显示PDF文件的内容? PDF可以由Edge,Adobe Reader,Reader应用程序(在8.1上),IrfanView等处理,这些应用程序无疑将以不同的方式处理“打印”动词。
您的睡眠功能也会产生不一致的结果,因为它正在等待特定的时间。您可能会从AutoItX工具包中获得类似WinWaitActive的更好运气(因为您正在进行UI自动化)。
此外,而不是做
if (false == p.CloseMainWindow())
你可以做到
if (!p.CloseMainWindow())
这可以提高代码的可读性(!与“not”基本相同,因此检查返回的值是否为True)。
编辑:其他注意事项是IIS Express将在您的本地帐户下运行,毫无疑问会安装打印机。完整的IIS服务器可能作为网络服务帐户运行,可能没有安装任何打印机。
您可能会认为这可能是更明智的设计决定,例如,将您的PDF生成到文件夹中,然后在服务器上运行另一个C#应用程序作为打印服务它们进入时此文件夹中的所有文件。您可以以安装了这些打印机的用户身份运行该服务。您可以实现FileSystemWatcher,仅在将新文件放入该目录,处理打印作业,然后删除PDF时触发。请参阅此处了解所有工作原理(文件正在观看):Using FileSystemWatcher to monitor a directory