我遇到了一个问题,需要我从服务器打印PDF文件,作为ASP.NET Web服务的一部分。
由于我必须打印的PDF文件只能使用Adobe Reader打印(它们是使用Adobe LiveCycle创建的,并且在其中有一些奇怪的保护),因此问题更加复杂。
这段代码似乎可以在Visual Studio开发Web服务器中完成,但在IIS中运行该站点时不会执行任何操作。
我假设这可能是某种权限问题!?
我知道这是一个理想的事情要做的FAR,但我没有多少选择!任何想法将不胜感激!
Dim starter As ProcessStartInfo
Dim Prc As Process
' Pass File Path And Arguments
starter = New ProcessStartInfo("c:\program files\...\AcroRd32.exe", "/t ""test.pdf"" ""Printer""")
starter.CreateNoWindow = True
starter.RedirectStandardOutput = True
starter.UseShellExecute = False
' Start Adobe Process
Prc = New Process()
Prc.StartInfo = starter
Prc.Start()
答案 0 :(得分:3)
首先是的,它可能是一个许可问题。确保您运行的网络应用程序所拥有的任何帐户都可以访问。
其次要小心使用RedirectStandadoutput。这会创建子进程的管道。如果管道填满,那么子进程会在下次尝试写入控制台时阻塞,直到主机读取管道为止。如果主机进程尝试同步管道中的读取并且不存在任何数据,则主机将阻止。如果你真的想重定向标准输出,请确保使用异步读取方法BeginOutputReadLine。
// I'm not a vb expert expert in c# you'd do this
StringBuilder builder = new StringBuilder();
prc.BeginOutputReadLine((sender, args) => builder.Append(args.Data));
if (!prc.WaitForExit(timeOut))
{
prc.Kill();
}
prc.WaitForExit();
如果在prc.WaitForExit上添加超时,请确保添加kill和第二个WaitForExit。具有超时的WaitForExit不会等待从管道读取所有输出。
最后,这不适用于大型文档或多个并发请求。当文档假脱机到打印机时,Web服务中将发生连接超时。
为什么不使用Message Queue或DB表来存储您的请求,然后创建一个NT服务来处理打印部分。在任何一种情况下,服务都可以轮询消息,打印,然后在打印完成时通过电子邮件通知用户。