Пакетный файл, который открывает Adobe Reader для печати PDF, не заканчивается/закрывается

У меня есть следующий код в пакетном файле, который вызывается PHP-скриптом с использованием shell_exec():

"C:\Program Files (x86)\Adobe\Reader 10.0\Reader\AcroRd32.exe" 
/t "D:\xampp\htdocs\instrument\app\webroot\Repair Tickets\%1.pdf"
\\hnurenfp01\Accounts_FS-1128MFP

Параметр %1 — это имя файла, которое отправляется в качестве аргумента пакетному файлу из сценария PHP.

Наблюдаемое поведение:

  • Страница PHP успешно вызывает пакетный файл с правильным аргументом
  • Два экземпляра AcroRd32.exe автоматически запускаются на сервере
  • PDF-файл распечатывается на сетевой принтер
  • Экземпляры AcroRd32.exe не заканчиваются/не закрываются
  • Пакетный файл продолжает работать (до завершения процессов AcroRd32.exe вручную)
  • PHP-скрипт остается исполняемым, поэтому клиентская машина не может делать что-либо дальше

Ожидаемое поведение:

  • Страница PHP успешно вызывает пакетный файл с правильным аргументом
  • Два экземпляра AcroRd32.exe автоматически запускаются на сервере
  • PDF-файл распечатывается на сетевой принтер
  • Экземпляры AcroRd32.exe завершаются/закрываются
  • Пакетный скрипт завершается (что, в свою очередь, должно освободить PHP-скрипт)
  • Сценарий PHP продолжается и в конечном итоге завершается, чтобы конечные пользователи могли продолжить свою работу.

Неудачные решения:

  • Использование TASKKILL в пакетном файле для завершения процессов AcroRd32.exe после печати, но AcroRd32.exe остается открытым даже при использовании флага /F (принудительно). Когда я вручную завершаю процессы AcroRd32.exe, командный файл продолжает работу, а затем выполняет строку TASKKILL, которая, конечно же, возвращает ошибку «процесс не найден», поскольку его больше нет. Так что вроде управление не возвращается обратно в батник после печати, оно остается с AcroRd32.exe.

У кого-нибудь есть идеи, как я могу закрыть Adobe Reader после печати PDF?


person weedave    schedule 03.05.2012    source источник


Ответы (1)


Я нашел следующую цитату на http://www.robvanderwoude.com/commandlineswitches.php#Acrobat

Печать PDF-файла в автоматическом режиме:

AcroRd32.exe /N /T PdfFile PrinterName [ PrinterDriver [ PrinterPort ] ]
Последняя команда откроет новое окно Adobe Reader, распечатает файл PDF и затем закроет его окно, если это окно не окажется единственным оставшимся окном Adobe Reader: останется как минимум одно окно Adobe Reader открыть.

Последнее предложение — плохая новость.

Вы можете вызвать AcroRD32.exe с параметрами /N и /T с помощью команды START, и тогда ваш пакетный файл сможет продолжить работу сразу же, пока выполняется задание на печать. Если вы не возражаете против того, чтобы один экземпляр читалки оставался открытым, то все готово.

Если вы должны закрыть ридер, то ваш пакет должен будет его убить. Но я не уверен, как ваш пакетный файл может определить, когда задание на печать завершено. Вы можете ввести произвольную задержку, используя TIMEOUT, но это звучит рискованно.

Меня немного смущает открытие «двух экземпляров AcroRd32.exe». Если программа работает именно так, то похоже, что переключатель /N закроет 1 из 2 экземпляров. Ваш пакет может запустить задание на печать через START, задержать на пару секунд, чтобы дать время запуститься процессам задания на печать, а затем использовать TASKLIST|FINDSTR для отслеживания количества процессов AcroRd32.exe в цикле. Когда счетчик изменится с 2 на 1, задание на печать должно быть завершено, и вы можете завершить оставшийся процесс. Во всяком случае в теории :)

Удачи.

person dbenham    schedule 03.05.2012
comment
Хорошая идея и она работает. Думал, что нет, но просто не используйте START как в shell_exec(), так и в пакетном файле. Я использовал только в командном файле. Спасибо. :) - person weedave; 03.05.2012
comment
Казалось бы, я немного поторопился с празднованием... он все еще блокирует мой PHP-скрипт. Я поиграю с этим и дам вам знать, если я получу его работу. - person weedave; 03.05.2012
comment
Не удалось заставить его работать с помощью Adobe Reader. Пробовал команды LPR с сервисом LPD и т.д. - для меня катастрофа! ржу не могу. В итоге использовал Fox It PDF Reader с аналогичной командой: START "Print Document" "C:\Program Files (x86)\Foxit Software\Foxit Reader\Foxit Reader.exe" /t "D:\xampp\htdocs\instrument\app\webroot\Docs\%1.pdf" "\\<machine_name>\<printer_name>" - person weedave; 14.05.2012
comment
Программа Fox It PDF Reader закрылась после того, как вы закончили печатать? - person Impulss; 09.01.2013
comment
@Impulss Извините за поздний ответ, экземпляр foxit закрывается после печати. - person weedave; 09.05.2013
comment
Обратите внимание, что печать из командной строки не работает в Foxit v7.0. Работал корректно на 6.2. - person dlchambers; 29.12.2014