Почему печать pdf-файла в автоматическом режиме не работает в службе windows C#?
Я не могу печатать файл молча через службу windows. Если я запускаю функцию печати в событии initialisecomponent () службы печати, то она работает нормально.
Служба Windows работает с интервалом в 3 минуты. Я подключил размещенную службу windows и попробовал отладку. Тогда и печать не работает. Файл успешно сгенерирован.
Мой код выглядит следующим образом:
#region SendPDFToPrinter //Added on 17.06.2016 for printing PDF silently public void SendPDFToPrinter(string pathPdf) { try { ProcessStartInfo infoPrintPdf = new ProcessStartInfo(); //pathPdf = @"D:\ITC.pdf"; infoPrintPdf.FileName = pathPdf; // The printer name is hardcoded here, but normally I get this from a combobox with all printers string printerName = System.Configuration.ConfigurationManager.AppSettings["PrinterName"].ToString(); //string printerName = "HP LaserJet Professional P1606dn"; string driverName = System.Configuration.ConfigurationManager.AppSettings["DriverName"].ToString(); string portName = System.Configuration.ConfigurationManager.AppSettings["portName"].ToString(); infoPrintPdf.FileName = System.Configuration.ConfigurationManager.AppSettings["AcrobatExePath"].ToString(); infoPrintPdf.Arguments = string.Format("/t {0} \"{1}\" \"{2}\" \"{3}\"", pathPdf, printerName, driverName, portName); infoPrintPdf.CreateNoWindow = true; infoPrintPdf.UseShellExecute = false; infoPrintPdf.WindowStyle = ProcessWindowStyle.Hidden; Process printPdf = new Process(); printPdf.StartInfo = infoPrintPdf; printPdf.Start(); // This time depends on the printer, but has to be long enough to // let the printer start printing System.Threading.Thread.Sleep(10000); if (!printPdf.CloseMainWindow()) // CloseMainWindow never seems to succeed printPdf.Kill(); printPdf.WaitForExit(); // Kill AcroRd32.exe printPdf.Close(); // Close the process and release resources } catch (Exception ex) { } } //End #endregion
Что я уже пробовал:
Мой код выглядит следующим образом:
#region SendPDFToPrinter
// Добавлено 17.06.2016 для печати PDF молча
public void SendPDFToPrinter(string pathPdf)
{
пробовать
{
ProcessStartInfo infoPrintPdf = новый ProcessStartInfo();
//pathPdf = @"D:\ITC.pdf";
infoPrintPdf.FileName = pathPdf;
// Имя принтера здесь жестко закодировано, но обычно я получаю его из выпадающего списка со всеми принтерами
строка printerName = System.Конфигурация.Конфигурационный менеджер.AppSettings ["PrinterName"].Метод toString();
//string printerName = " HP LaserJet Professional P1606dn";
система строкой имя_драйвера =.Конфигурация.Конфигурационный менеджер.AppSettings ["Имя Драйвера"].Метод toString();
система строкой имя_порта =.Конфигурация.Конфигурационный менеджер.AppSettings ["имя порта"].Метод toString();
infoPrintPdf.Имя Файла = Система.Конфигурация.Конфигурационный менеджер.AppSettings ["AcrobatExePath"].Метод toString();
infoPrintPdf.Аргументы = строка.Формат ("/t {0} \"{1}\" \"{2}\" \"{3}\"",
pathPdf, имя_принтера, имя_драйвера, имя_порта);
infoPrintPdf.CreateNoWindow = истина;
infoPrintPdf.UseShellExecute = false;
infoPrintPdf.WindowStyle = ProcessWindowStyle.Скрытый;
Process printPdf = новый процесс();
printPdf. StartInfo = infoPrintPdf;
с printpdf.Начать();
// Это время зависит от принтера, но должно быть достаточно длительным, чтобы
// пусть принтер начнет печатать
Система.Нарезание резьбы.Нить.Сон(10000);
if (! printPdf. CloseMainWindow()) // CloseMainWindow, похоже, никогда не добьется успеха
с printpdf.Убить();
printPdf. WaitForExit (); / / Kill AcroRd32.exe
printPdf. Close (); / / закройте процесс и освободите ресурсы
}
поймать (исключение бывший)
{
}
}
//Конец
#endregion
Duncan Edwards Jones
От имени какого пользователя работает служба windows и имеет ли этот пользователь доступ к принтеру и файловой системе?
Ema112
локальная системная учетная запись и доступ есть для печати. проблема возникает при печати из размещенной службы. Иначе просто в initailisecomponent это работает.
Richard Deeming
Две вещи, на которые стоит обратить внимание:
1) учетная запись" локальная система", вероятно, не имеет правильной настройки принтера. Возможно, вам придется скопировать некоторые ключи реестра, чтобы заставить его работать.
2) ваш пустой catch
блок молча игнорирует все ошибки, что сделает невозможной диагностику каких-либо проблем. Вы должны добавить некоторый код для регистрации исключений, чтобы у вас, по крайней мере, была подсказка, с чего начать поиск.