谢谢大家的意见。不幸的是,这个“php start printjob”是一个更大的项目的一部分,该项目今天被取消,因为......我不知道......政治原因。猜猜这个项目已经死了。
无论如何,我在最后几天又尝试了几次,但无法让它与 IIS 一起工作。我已经实现和测试的解决方案:删除 IIS,安装带有本地 apache 和 PHP 的 XAMPP 或 WAMPP 包,该包以管理员访问权限运行。
这成功了。我pclose(popen('...command...', 'r'));
在 PHP 中使用以启动.exe
and 以便 PHP 不会等到 PDF 完成。这一切都很好。
这是我的 C# 代码,它使用 Acrobat Reader 启动打印作业
public void Print(string pathname, string acrobatDirectory)
{
var proc = new Process
{
StartInfo =
{
Arguments = String.Format("/t \"{0}\"", pathname),
FileName = acrobatDirectory,
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = false,
RedirectStandardError = false,
}
};
proc.Start();
}
第一个参数是要打印的 PDF 的路径,第二个参数是AcroRd32.exe
.
剩下的唯一问题是它AcroRd32.exe
被启动、打印并且再也没有关闭。所以每个打印作业都会启动一个新实例AcroRd32.exe
(我使用的是 Acrobat Reader 9.0)。因此,如果您打印 10 次,则会创建 10 个 acrobat reader 实例。
我所做的是开始打印作业,然后等待 X 秒,希望打印机完成,然后杀死所有AcroRd32.exe
实例:
public void Print(string pathname, string acrobatDirectory)
{
Debug.WriteLine("Printing...");
Printer.Print(pathname, acrobatDirectory);
Thread.Sleep(30000);
try
{
Debug.WriteLine("Trying to kill runnung AcroRd32.exe's ");
FindAndKillProcess("AcroRd32");
}
catch (Exception)
{
Debug.WriteLine("AcroRd32.exe could not be killed...");
}
}
private bool FindAndKillProcess(string name)
{
foreach (Process clsProcess in Process.GetProcesses())
{
if (clsProcess.ProcessName.StartsWith(name))
{
clsProcess.Kill();
return true;
}
}
return false;
}
这效果很好。
请注意,上述(杀死所有AcroRd32.exe
并以管理员权限运行 PHP)仅是可行的,因为:整个事情一次只能由一个用户使用,并且使用范围非常有限。
它应该用于部署在客户端 POS 的触摸屏应用程序。销售人员会使用 PHP 应用程序来配置产品,然后 PHP 会调用我的 .exe,它会在后台创建和打印 PDF。然后将打印的文件交给客户。因此,在这种情况下,安全等并不是真正的问题。
如果有人有解决方案以便将其与 IIS 一起使用,我仍然愿意接受它作为答案。