感谢大家的 cmets。不幸的是,这个“php start printjob”是一个更大的项目的一部分,该项目今天被取消,因为......我不知道......政治原因。猜猜这个项目已经死了。
无论如何,最近几天我又尝试了几次,但无法让它与 IIS 一起工作。我已经实现和测试的解决方案:删除 IIS,安装带有本地 apache 和 PHP 的 XAMPP 或 WAMPP 包,该包以 admin 访问权限 运行。
这成功了。我在 PHP 中使用了pclose(popen('...command...', 'r')); 来启动.exe,这样 PHP 就不会等到 PDF 完成。这一切都很好。
这是我使用 Acrobat Reader 启动打印作业的 C# 代码
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 一起使用,我仍然愿意接受它作为答案。