Автоматическая печать InfoPath с использованием службы Windows не работает
У меня есть служба Windows, которая печатает вид формы InfoPath по умолчанию, используя xdocument.PrintOut()
функция. Он работает на нескольких конфигурациях машины, за исключением одного случая. Он не работает на некоторых машинах под управлением Windows 2012 (и Win2012R2) (x64), SharePoint 2013 (x64) и Office профессиональный плюс 2013 (x86). Я не уверен, что SharePoint как-то связан с этой проблемой.
Вот что происходит, когда я проверил разницу в журналах монитора процесса.
Когда выполняется как служба Windows и xdocument.PrintOut()
называется, запускает INFOPATH.EXE
в фоновом режиме отправляет команду печати, запускает spoolsv.exe (диспетчер очереди печати принтера), диспетчер очереди печати принтера обнаруживает принтер по умолчанию и после этого ничего не происходит.
Когда один и тот же код выполняется с помощью консольного приложения, происходит набор событий для симлера и, кроме того, он создает файлы спулера вC:\Windows\System32\spool\PRINTERS\FP00003.SPL
" а также "C:\Windows\System32\spool\PRINTERS\FP00003.SHD
". Файлы SPL - это фактические файлы спулинга (задания на печать). Файлы SHD предоставляют информацию о том, на какой принтер было отправлено задание на печать и от кого поступило задание на печать.
Обратите внимание, что служба работает под той же учетной записью, что и при запуске приложения консоли, и драйвер принтера всегда одинаков во всех системах. Кроме того, работает точно такой же код, но благодаря автоматизации MS-Word для печати на том же принтере из службы, также работает нормально.
Я попытался объяснить проблему, и, пожалуйста, не стесняйтесь спрашивать разъяснения в комментариях.
Вот код, используемый в службе Windows и консольном приложении:
//** Create inforpath application instance
Microsoft.Office.Interop.InfoPath.Application app = new Microsoft.Office.Interop.InfoPath.Application();
//** Open XML file
XDocument xdoc = app.XDocuments.Open(@"F:\InfoPathTestFiles\8f2de6cb86594203b5ecb301cb2f4a94.xml", 1);
//** give enough time for infopath.exe to open the XML file
System.Threading.Thread.Sleep(5000);
//** Send print command.
xdoc.PrintOut();
//** let it cool for 5 seconds.
System.Threading.Thread.Sleep(5000);
//** quit the application.
app.Quit(true);
Обратите внимание, что файл InfoPath (xml) должен быть полностью доверенным, чтобы он мог печатать таким образом.