Подтвердить что ты не робот

Печать из службы .NET

Сейчас я работаю над проектом, который включает получение сообщения из другого приложения, форматирование содержимого этого сообщения и отправку его на принтер. Технология выбора - С# windows service. Вывод можно назвать отчетом, я полагаю, но механизм отчетов не требуется. Простой движок шаблонов, такой как StringTemplate, или даже XSLT, выводящий HTML, подойдет. Проблема, с которой я столкнулся, заключается в том, чтобы найти бесплатный способ распечатать такой вывод из службы. Поскольку кажется, что это будет работать, я работаю над прототипом с использованием Microsoft RDLC, заполняю локальный отчет и затем отображаю его в виде изображения в потоке памяти, который затем распечатаю. Проблемы с этим:

  • Многостраничная печать будет большой головной болью.
  • Тем не менее, необходимо использовать PrintDocument для печати потока памяти, который не поддерживается в службе Windows (хотя это может работать - еще не дошли до прототипа)
  • Если встречающиеся данные изменяются, я должен изменить набор данных и класс, в который данные десериализуются. плохо плохо плохо

Кто-нибудь должен был сделать что-нибудь подобное удаленно? Любой совет? Я уже опубликовал вопрос о печати HTML без участия пользователя, и, потратив на это около 3 дней, я пришел к выводу, что этого нельзя сделать, по крайней мере, с помощью любого свободно доступного инструмента.

Вся помощь приветствуется.

РЕДАКТИРОВАТЬ: Мы находимся на версии 2.0.NET Framework.

4b9b3361

Ответ 1

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

Печать - сложная проблема, и мне бы очень хотелось увидеть день, когда для этого добавлена ​​лучшая поддержка фреймворка.

Ответ 2

Печать из службы Windows очень болезненна. Кажется, что это работает... иногда... но, в конце концов, оно время от времени ломается или бросает исключение, без какой-либо ясной причины. Это действительно безнадежно. Официально даже не поддерживается без каких-либо объяснений или предложений альтернативного решения.

Недавно я столкнулся с проблемой, и после нескольких неудачных испытаний и экспериментов я наконец пришел к двум жизнеспособным решениям:

  • Напишите свою собственную DLL для печати, используя API Win32 (например, в C/С++), затем используйте ее из своей службы с помощью P/Invoke (отлично работает)
  • Напишите свой собственный COM + компонент печати, а затем используйте его из своей службы. Я выбрал это решение с успехом в последнее время (но это был сторонний компонент COM +, а не собственный). Он отлично работает.

Ответ 3

Я сделал это. Это боль в * s. Проблема заключается в том, что для печати требуется, чтобы движок GDI был на месте, что обычно означает, что у вас должен быть рабочий стол, который загружается только при входе в систему. Если вы пытаетесь сделать это из службы на сервере, то вы обычно не вошли в систему.

Итак, сначала вы не можете работать как обычный пользователь службы, а вместо этого как настоящий пользователь, имеющий интерактивные права входа. Затем вам нужно настроить записи в системном реестре (я забыл, как на данный момент вам нужно будет найти код, который я могу сделать сегодня вечером, если вы действительно заинтересованы). Наконец, вы должны молиться.

Ваша самая большая долгосрочная головная боль будет связана с драйверами печати. Если вы работаете как служба без входа в систему, некоторые драйверы печати иногда время от времени всплывают. Что происходит, когда на вашем принтере нет тонера? Или из бумаги? Драйвер может открыть диалоговое окно, которое никогда не будет видно, и удерживать очередь принтера, потому что никто не вошел в систему!

Ответ 4

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

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

Если вам нужно, чтобы данные печатались как регулярные интервалы, настройте событие Task через Планировщика заданий. Запуск процесса из службы потребует знания имени пользователя и пароля, что опять-таки плохая практика безопасности.

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

Ответ 5

Чтобы ответить на ваш первый вопрос, это может быть довольно прямолинейным в зависимости от данных. У нас есть множество сервисных приложений, которые выполняют именно то, что вы просите. Как правило, мы анализируем входящий файл и обертываем вокруг него собственный Postscript или PCL. Если вы макет довольно прост, то есть некоторые очень простые коды PCL, которые вы можете обернуть, чтобы обеспечить требуемый размер шрифта/печати (я был бы более счастлив дать вам некоторые рекомендации здесь в автономном режиме).

У вас есть готовый к печати файл, который вы можете отправить на принтер UNC, который является общим, непосредственно на локально установленный принтер или даже на IP-адрес устройства (данные типа RAW или LPR).

Если, однако, вы идете по пути PDF, самым простым методом является отправка вывода PDF на принтер, который поддерживает прямую печать PDF (многие из них сейчас). В этом случае вы просто отправляете PDF файл на устройство и распечатываете его.

Другой вариант - запустить Ghostscript, который должен быть бесплатным для ваших нужд (проверьте лицензирование, поскольку у них есть несколько разных версий, некоторые GNU, некоторые GPL и т.д.) И либо использовать его в функции печати, либо просто конвертировать в Postscript и отправлять на устройство. Я много раз использовал Ghostscript в приложениях Службы, но не был большим поклонником, поскольку вы в основном будете обходить и запускать приложение командной строки для преобразования. Это, как говорится, стабильное приложение, которое, как правило, терпит неудачу.

Ответ 6

Возможно, это не то, что вы ищете, но если мне нужно было сделать это быстро и грязно, я бы:

  • Создайте отдельное приложение WPF (чтобы я мог использовать встроенную обработку документов)
  • Предоставьте службе возможность взаимодействовать с рабочим столом (обратите внимание, что на самом деле вам не нужно ничего показывать на рабочем столе или войти в систему для этого)
  • Попросите службу запустить приложение и дайте ему данные для печати. ​​

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

Для более детального (также бесплатного) решения лучше всего вручную вручную отформатировать документ (используя GDI +, чтобы сделать макет для вас). Это утомительно, подвержено ошибкам, занимает много времени и тратит много бумаги во время разработки, но также дает вам максимальный контроль над тем, что происходит с принтером.

Ответ 7

Если вы можете вывести сообщение script, некоторые принтеры распечатывают все, что передается по FTP в определенный каталог на них.

Мы использовали это, чтобы пройти мимо кредитов на печать, которые наш университет выставил нам, но если ваша услуга выйдет на ps, вы можете просто загрузить файл ps на принтер.

Ответ 8

Мы используем DevExpress 'XtraReports для печати из службы без каких-либо проблем. Их модель отчета аналогична модели Windows Forms, поэтому вы можете динамически вставлять текстовые элементы, а затем выдавать команду печати. ​​

Ответ 9

Я думаю, что мы отправимся на сторонний маршрут. Мне нравится XSL → HTML → PDF → поток принтера... Winnovative HTML в PDF выглядит хорошо для первой части, но я "Я бегу в блок, найдя хорошее решение для печати в формате PDF... любые предложения? В идеале лицензия будет на основе разработчика, а не на развернутой среде выполнения.

Ответ 10

В ответ на ваш вопрос о печати PDF я не нашел элегантного решения. Я был "оболочкой" для Adobe, которая была ненадежной и требовала, чтобы пользователь вошел в систему в любое время. Чтобы исправить эту конкретную проблему, я попросил, чтобы файлы, которые мы обрабатываем (счета-фактуры), были отформатированы как многостраничные Tiff файлы, которые можно разделить и распечатать с использованием собственных функций печати .NET. Позиция Adobe кажется "заставить пользователя просмотреть файл в Adobe Reader, и они могут щелкнуть печать". Бесполезно.

Я все еще хочу найти хороший способ создания отчетов о качестве, которые могут выводиться с веб-сервера...

Ответ 11

Печать с использованием System.Drawing.Printing не поддерживается MS, как ответ Янна Тревина. Однако, возможно, вы сможете использовать новую, основанную на WPF, System.Printing(я думаю)