2008-08-11 12 views
19

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

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

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

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

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

ответ

13

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

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

1

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

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

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

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

8

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

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

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

GDI + никогда не разрабатывался и не тестировался для работы в контексте обслуживания. Вот почему это не работает. Вы должны использовать GDI и его функцию для рисования. Обратитесь к этому документу, чтобы найти эквивалентные вызовы Win32: http://msdn.microsoft.com/en-us/library/aa302340.aspx#win32map_printingfunctions – Signcodeindie

0

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

4

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

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

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

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

3

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

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

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

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

5

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

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

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

1

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

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

0

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

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

0

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

1

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