Спасибо всем за ваши комментарии. К сожалению, эта вещь "php start printjob" была частью более крупного проекта, который был отменен сегодня из-за ... ну, я не знаю ... политических причин. Угадай, проект в значительной степени мертв.
В любом случае, я пробовал себя еще несколько раз в последние дни и не смог заставить его работать с IIS. Мое решение, которое я уже внедрил и протестировал: удалите IIS, установите пакет XAMPP или WAMPP с локальным apache и PHP, который работает с правами доступа администратора .
Это добилось цели. Я использовал pclose(popen('...command...', 'r'));
в PHP, чтобы запустить .exe
и чтобы 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
был запущен, напечатан и больше никогда не закрывался. Так что каждый printjob запускал новый экземпляр 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, я все равно готов принять его в качестве ответа.