Ema112 Ответов: 1

Почему печать 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 блок молча игнорирует все ошибки, что сделает невозможной диагностику каких-либо проблем. Вы должны добавить некоторый код для регистрации исключений, чтобы у вас, по крайней мере, была подсказка, с чего начать поиск.

1 Ответов

Рейтинг:
0

Dave Kreskowiak

Системная учетная запись не имеет настройки принтеров. Вам нужно создать учетную запись на компьютере,чтобы запустить свою службу. Вам также необходимо войти в систему с этой учетной записью и сначала настроить принтер для использования. Как только у вас есть эта настройка, вы можете настроить свой сервис для использования этой учетной записи.

Кроме того, как было предложено выше, наличие пустого блока catch просто скроет от вас любые ошибки, что сделает невозможным узнать, пошло ли что-то не так и что это за сообщение об ошибке.


Ema112

Я изменил учетную запись службы с помощью своих учетных данных.Я разместил эту службу в самой своей машине. У меня есть права администратора. Но все равно печать не выполняется при запуске службы windows. Все остальное идет нормально. Если я отлаживаю, запустив initialisecomponent () службы windows, функция печати работает. Никаких проблем как таковых не наблюдалось. Используемый принтер является сетевым принтером.

Dave Kreskowiak

Когда этот код работает как обычное приложение, нужно ли вам вообще что-то делать, чтобы заставить его напечатать, кроме запуска кода, который вы опубликовали?

Dave Kreskowiak

Глядя на ваш другой вопрос по этому поводу, работает ли эта служба на компьютере, когда установлен Acrobat Reader?

Ema112

Да, служба работает на машине с установленным Acrobat Reader. Код при работе в обычном приложении ничего не делается, и он отлично печатается.Но как услуга на хостинге печать терпит неудачу. Ошибка не показана.