Сохранение документа Word в PDF через Print2PDF

DDT

Новичок
Сохранение документа Word в PDF через Print2PDF

Привет.

Есть задача:
На сервере посредством PHP сохранять документ MS Word в формате PDF.

Найденный вариант решения:
Использую утилиту Print2PDF, которая создает PDF-принтер. Имя принтера "Print2PDF"

Вот код, который берет шаблон документа Word и печатает его на этом принтере:
PHP:
$word = new COM("word.application") or die("Unable to instanciate Word");

$word->Documents->Add("D:\\tpl.dot");

$word->ActivePrinter = "Print2PDF";
$word->ActiveDocument->PrintOut(0, 0, '', "D:\\test.pdf");
$word->ActiveDocument->Close();
$word->Quit();
unset($word);
В результате получается файл D:\test.pdf, который нормально открывается Акробатом.

Все хорошо, НО:
Во время печати документа порождается процесс Print2PDF.exe от учетной записи SYSTEM. Этот процесс отвечает за печать документа на этом принтере.

После окончания печати документа процесс ОСТАЕТСЯ висеть и не дает печатать следующий документ.

Симптомы:
При печати следующего документа приложение Word ожидает ответа от принтера и будет ждать его сколь угодно долго, пока не будет остановлен предыдущий экземпляр процесса Print2PDF.exe

Вопросы:
Есть ли идеи у кого по этому поводу?
Кто-нибудь имел дело с этой утилитой Print2PDF?
Может кто-то использовал другой PDF-принтер (я еще пробовал PDFCreator - не подходит, сохраняет документы в непонятном для Акробата формате)?
 

DiMA

php.spb.ru
Команда форума
Аналогично будет висеть в памяти, например, тот же Эксель.ехе, если пхп вылетит с ошибкой, не выполнив уничтожение приложения или не написав Quit().

Перед запуском убить процесс "pskill.exe Print2PDF.exe". Чтобы не нарушить предыдущий незавершенный процесс - пишем очередь на обработку для отложенной печати документов.

Если очередь делать лениво, то запускаем не процесс Print2PDF.exe, а $procname="Print2PDF_".time().".exe" (файл нужно скопировать). Далее через pslist.exe получаем список процессов по шаблону и узнаем время предыдущего запуска. Либо сразу убиваем, либо ждем таймаута и убиваем.
 
Сверху