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

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

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

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

Любая помощь будет принята с благодарностью.

EDIT: Мы находимся на версии 2.0 фреймворка .NET.

Решение

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

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

Комментарии (0)

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

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

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

I' ve, сделанный это. It' s боль в A*s. Проблема состоит в том, что печать требует, что двигатель GDI, чтобы существовать, который обычно означает, что у Вас должен быть рабочий стол, который только загружает когда you' ре загрузилось. Если you' ре, пытающееся сделать это от Обслуживания на Сервер, тогда, Вы обычно - not' t загрузился.

Таким образом, сначала Вы can' t бегут как нормальный сервисный пользователь, но вместо этого как настоящий пользователь, который имеет интерактивные права логина. Тогда Вы должны щипнуть сервисные записи регистрации (я забываю, как в данный момент, должен был бы найти кодекс, который я могу сделать сегодня вечером если you' ре, действительно заинтересованное). Наконец, Вы должны молиться.

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

Комментарии (0)

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

Один у Вас есть печать готовый файл, который Вы можете послать ей в принтер UNC, который разделен, непосредственно в в местном масштабе установленный принтер, или даже к IP устройства (СЫРЬЕ или данные о типе LPR).

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

Другой выбор состоит в том, чтобы начать [Ghostscript][1], который должен быть свободным для Ваших потребностей (проверьте лицензирование, поскольку у них есть некоторые различная версия, некоторая ГНУ, некоторый GPL и т.д.), и любое использование it' s построенный в функции печати или просто преобразовывают в Постскриптум и посылают в устройство. I' ve много раз использовал Ghostscript в Сервисных приложениях, но не огромном поклоннике, поскольку Вы будете в основном выкладывать и выполнять приложение командной строки, чтобы сделать преобразование. Однако it' s стабильное приложение, которое действительно имеет тенденцию терпеть неудачу изящно

[1]: http://pages.cs.wisc.edu / ~ призрак /

Комментарии (0)

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

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

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

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

Комментарии (0)

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

Комментарии (0)

Если Вы можете произвести, чтобы опубликовать сценарий, некоторые принтеры напечатают что-либо, что получает FTPed к определенному справочнику на них.

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

Комментарии (0)

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

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

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

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

Комментарии (0)

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

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

Комментарии (0)

Я думаю, что мы собираемся пойти сторонним путем. Мне нравится XSL-> HTML-> PDF-> поток Принтера... Winnovative' s HTML к PDF взгляды, хорошие для первой части, но I' m столкновение с блоком, находящим хорошее решение для печати PDF... какие-либо предложения? Идеально лицензия была бы на основе разработчика, не на развернутой основе во время выполнения.

Комментарии (0)

Печать Системы использования. Рисование. Печать не поддержана MS согласно Yann Trevin' s ответ. Однако Вы могли бы быть в состоянии использовать новое, основанное на WPF, Систему. Печать (я думаю),

Комментарии (0)