compninja25 Ответов: 4

Печать pdf-файла из службы windows


Всем Привет,

Я борюсь с этой проблемой уже несколько дней и не могу понять, как ее решить. У меня есть служба windows, которая получает информацию из сетевого сокета, а затем генерирует PDF-файл, который мне нужно автоматически распечатать на складе. Я использую pdfsharp для создания файлов и пробовал использовать метод печати, но не могу заставить его работать как сервис. Он отлично работает в программе windows form, но тот же код в службе не работает. Из того, что я могу сказать, не похоже, что этот процесс когда-либо запускает программу acrobat reader...хотя я никогда не получаю никаких ошибок....

Затем я попытался посмотреть на adobe SDK, но, похоже, не смог заставить его работать. Кто-нибудь мог успешно распечатать pdf-файл из службы windows до того, как это могло бы дать мне некоторые указания? Я пробовал все следующее, но безуспешно:
AcroPDF pdfPrinter = new AcroPDF();

      pdfPrinter.LoadFile(filePath);
      pdfPrinter.Print();

//print the document
     PdfFilePrinter.AdobeReaderPath = @"C:\Program Files (x86)\Adobe\Reader 10.0\Reader\AcroRd32.exe";
      PdfFilePrinter makeOutput = new PdfFilePrinter(_orderNumber + ".pdf");

//    makeOutput.PrinterName = "mySharp";
           makeOutput.WorkingDirectory = SavePath;

           makeOutput.Print();

string pdfArguments = string.Format(" /t " + "\"" + SavePath + "\\" + _orderNumber + ".pdf \" " + "\"Microsoft XPS Document Writer\"");
       string pdfPrinterLocation =  @"C:\Program Files (x86)\Adobe\Reader 10.0\Reader\AcroRd32.exe";

       ProcessStartInfo newProcess = new ProcessStartInfo(pdfPrinterLocation, pdfArguments);
       newProcess.CreateNoWindow = true;
       newProcess.RedirectStandardOutput = true;
       newProcess.UseShellExecute = false;

       Process pdfProcess = new Process();
       pdfProcess.StartInfo = newProcess;
       pdfProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
       pdfProcess.Start();
       pdfProcess.WaitForExit();

Member 12642169

Как печатать на дефалюте печать по этой статье

4 Ответов

Рейтинг:
22

fjdiewornncalwe

Проверьте оснастку "ваши услуги". Это может быть так же просто, как включить свойство "разрешить службе взаимодействовать с рабочим столом". Вы можете добраться до него, выбрав меню "Свойства" в контекстном меню для конкретной службы, а затем перейдя на вкладку Вход. Я, конечно, проверил это, но это догадка, основанная на другом проекте, который я сделал пару лет назад, где мне приходилось взаимодействовать с запущенными приложениями forms.


Рейтинг:
2

compninja25

Ну, я изменил процесс, чтобы запустить Foxit Reader, и он работал как чемпион! Я думаю, это было просто что-то, что Adobe не любит?

Да ладно...по крайней мере это работает! фу!

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

string pdfArguments = string.Format(" /t " + "\"" + SavePath + "\\" + _orderNumber + ".pdf\" " + "\"mySharp\"");
      //string pdfPrinterLocation = @"C:\Program Files (x86)\Adobe\Reader 10.0\Reader\AcroRd32.exe";
      string pdfPrinterLocation = @"C:\Program Files (x86)\Foxit Software\Foxit Reader\Foxit Reader.exe";

      ProcessStartInfo newProcess = new ProcessStartInfo(pdfPrinterLocation, pdfArguments);
      newProcess.CreateNoWindow = true;
      newProcess.RedirectStandardOutput = true;
      newProcess.UseShellExecute = false;

      Process pdfProcess = new Process();
      pdfProcess.StartInfo = newProcess;
      pdfProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
      pdfProcess.Start();
      pdfProcess.WaitForExit();
       }


Member 12642169

Если я хочу печатать на принтере по умолчанию. как я буду это делать?

Рейтинг:
1

compninja25

Эй Маркус,

К сожалению, no dice : / я считаю, что это действительно имеет какое-то отношение к службе, работающей в режиме "нет рабочего стола?" среда, но изменение учетной записи на локальную службу и проверка разрешения службе взаимодействовать с рабочим столом, похоже, не сделали ничего другого. Я использую procmon, чтобы увидеть, если acrord32.exe когда-нибудь начнется, и не похоже, что он даже пытается.

ОБНОВЛЕНИЕ
Хорошо, если я использую третий блок кода (где я сам определяю и запускаю процесс). Acrord32.exe запускается и передается то, что кажется правильными параметрами командной строки. Я могу взять эту строку из procmon, вставить ее в командное окно, и она напечатается просто отлично. Тем не менее, даже с галочкой, позволяющей взаимодействовать с рабочим столом, это не работает. Хотя, похоже, другим повезло с этим решением...Интересно, это что-то с windows 7 x64?


Pavan_N

Я тоже столкнулся с подобной проблемой. Не могли бы вы мне помочь, пожалуйста?

С уважением,
Паван

Рейтинг:
1

compninja25

Эй Паван,

Честно говоря, я уже давно не вмешивался в это дело, но посмотрю, что можно сделать. Как далеко вы продвинулись? Где он взрывается?


Pavan_N

Привет,
я попытался с Ghpostscript, знаете, программа, акробат,clprint и т. д. и т. п... Все они отлично работали для моей серверной печати, если я запускал свой код в режиме отладки, то есть из visual studio. Но если я разверну его в своем IIS. очевидно, он работает под сетевым сервисом. поэтому я реализовал олицетворение. даже несмотря на то, что Служба только начинается, но просто зависает . я вижу это в своем диспетчере задач.

С уважением,
Паван

compninja25

Привет Павин,

Вместо того чтобы запускать службу как сетевую службу, вы пробовали "локальную службу" или определяли пользователя с правами администратора? Похоже, это может быть проблема с аутентификацией.