2013-08-08 2 views
4

Мне нужно распечатать документ-документ на стороне сервера сетевому принтеру. Моя веб-страница отправляет местоположение документа и файла на сервер, чтобы открыть и заменить элементы слияния, а затем распечатать документ до предпочтительного (не по умолчанию) сетевого принтера. Предпочтительное имя принтера изменяется при выборе документа при изменении веб-страницыПечать в сетевой (общий) принтер - Word Interop

Я использую Библиотеку объектов Word 14.0, Asp.Net MVC 4.0, .Net Framework 4.0, IIS 7 на сервере Windows 2008 R2. В IIS я создал пул приложений, который запускается в определенной учетной записи Identity (accountName @ DomainName). Загрузите профиль пользователя в true для загрузки подключений сетевого принтера в реестр. Я разрешил учетной записи иметь разрешения на запуск служб COM-взаимодействия. Мне удалось открыть документ и заменить поля слияния и сохранить его в формате pdf для отправки файла в виде вложения в электронное письмо.

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

Следующие два метода вызывают исключения, если я пытаюсь изменить свойство ActivePrinter.

Word.Application wordApp = new Word.Application(); 

Первый способ:

wordApp.ActivePrinter = "preferredPrinterName"; 

Второй метод;

object[] oWordDialogParams = { "\\<serverName>\<PrinterName>", true }; 
string[] argNames = { "Printer", "DoNotSetAsSysDefault" }; 
object wordBasic = wordApp.WordBasic; 

wordBasic.GetType().InvokeMember("FilePrintSetup" 
      , System.Reflection.BindingFlags.InvokeMethod 
      , null 
      , wordBasic 
      , oWordDialogParams 
      , null 
      , null 
      , argNames); 

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

Как получить все установленные общие принтеры под профилем пользователя, загруженным в объект приложения Word?

ответ

1

Использование приложений Office Interop в серверном сценарии (например, ASP.NET, служба Windows и т.д.) не поддерживается MS - см http://support.microsoft.com/default.aspx?scid=kb;EN-US;q257757#kb2

Дополнительно было несколько изменилась, связанные с безопасностью, так как Windows Vista, которые в основном делает в Windows Service действительно сложно сделать что-нибудь «настольное» (IIS/ASP.NET - это просто особый случай службы Windows в этом отношении).

Другое дело, что «печать» из сценария сервера может вызвать проблемы, поскольку IIS является (специальной) службой Windows ... Windows Service обычно не имеет «полного/реального» рабочего стола, который, в свою очередь, необходимый для печати ...

Я не думаю, что там есть простое решение для вашего сценария ...

я бы разбить его на различные компоненты:

  • Слово обработки документов (например, с Aspose.Words)
  • Создать PDF из результирующего файла Word (например, с Aspose.Words)
  • Реализовать HotFolder на целевом сетевом принтере
  • Скопируйте PDF на этот HotFolder для печати

Это будет надежный и поддерживаемый вариант для вашего сценария ...

+0

Aspose.words - это замечательно. Не нужно включать DCOM на сервер, он отлично работал, чтобы печатать текстовые документы на нужные сетевые принтеры на стороне сервера. Это работает для моего сценария. Однако Лицензии стоят дорого. Если кто-то не хочет покупать лицензию на Aspose.words, я предлагаю включить DCOM и использовать учетную запись службы с максимально ограниченными правами, чтобы автоматизировать MS WORD с помощью сборок interop и сохранить файл в формате PDF в HotFolders для печати. Однако я не пробовал для HotFolders. –

Смежные вопросы