Ema112 Ответов: 1

Как распечатать pdf-файл в Windows service C#?


Печать pdf-файла через службу windows работает как приложение. но со службой это не удается.
Служба запускается с учетной записью, в которой установлен принтер, но печать по-прежнему не выполняется.


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();

             string passwordStr = "july2016.";
             //System.Security.SecureString password = new System.Security.SecureString();

             //foreach (char c in passwordStr)
             //    password.AppendChar(c);
             //infoPrintPdf.UserName = "veena.cjohn@chn.nestgroup.net";
             //infoPrintPdf.Password = password;
             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


Что я уже пробовал:

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();

                string passwordStr = "july2016.";
                //System.Security.SecureString password = new System.Security.SecureString();

                //foreach (char c in passwordStr)
                //    password.AppendChar(c);
                //infoPrintPdf.UserName = "veena.cjohn@chn.nestgroup.net";
                //infoPrintPdf.Password = password;
                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

F-ES Sitecore

Службы не могут взаимодействовать с рабочим столом, поэтому, если ваш процесс показывает какие-либо диалоговые окна и т. д., Он не будет работать, вам нужен метод печати, который не требует доступа к рабочему столу.

Ema112

служба работает с учетными данными учетной записи Пользователя, в которой установлен сетевой принтер. Тем не менее печать не вызывается во время работы в качестве службы windows. Этот код прекрасно работает как приложение windows или вызывая функцию с in initialize компонентом службы windows.

1 Ответов

Рейтинг:
1

Garth J Lancaster

Может быть, что-то вроде этого сработает Как программно (C# .NET) распечатать pdf-файл непосредственно на принтере | vishalsbsinha[^]

он отправляет на принтер по умолчанию - довольно легко адаптируется


Ema112

Печать выполняется на компьютере в службе windows, на котором установлен принтер. Но при попытке на другой машине печать работает как приложение, где я даю имя сетевого принтера. Но когда он размещается как служба windows, он не работает. Я дал учетные данные администратора службы, на которой установлен принтер.

Garth J Lancaster

как вы указываете имя сетевого принтера ?