Как вы уже узнали из комментариев, автоматизируя настольную версию любого из приложений Office, это плохо по нескольким причинам. Подробности можно найти в статье базы знаний KB257757 Considerations for server-side Automation of Office. Основным уходом от этой статьи является:
Корпорация Майкрософт не рекомендует и не поддерживает автоматизацию приложений Microsoft Office из любого без присмотра, неинтерактивного клиентского приложения или компонента (включая ASP, ASP.NET, DCOM и NT Services), поскольку Office может проявлять нестабильное поведение и/или тупик, когда Office запущен в этой среде.
Но, поскольку вы все еще настаиваете на этом, рассмотрите следующий пример как очень простой, наивный, который не должен использоваться рядом с концепцией доказательств, позволяющей быстро справиться со всеми проблемами, упомянутыми в статье KB.
В новом решении создайте приложение службы WCF и консольное приложение. В приложении WCF добавьте следующий интерфейс:
[ServiceContract]
public interface IPrintService
{
[OperationContract]
string Print(Stream wordDoc);
}
и иметь сервисный инструмент, который. Обязательно добавьте ссылку на Microsoft.Office.Interop.Word
, которую вы можете найти на вкладке COM диалогового окна Добавить ссылку.
public class PrintService : IPrintService
{
public string Print(Stream wordDocStream)
{
// copy our stream to a local file
var tempFile = Path.GetTempFileName();
using(var file = File.Create(tempFile))
{
wordDocStream.CopyTo(file);
}
// start word
var wordApp = new Microsoft.Office.Interop.Word.Application();
// setup printer
wordApp.ActivePrinter = "Canon LBP3010/LBP3018/LBP3050";
// open, collect data, print and close
var doc = wordApp.Documents.Open(tempFile);
doc.PrintOut();
var res = doc.Words.Count;
doc.Close(false);
// quit word
wordApp.Quit(false);
// delete temp file
File.Delete(tempFile);
return String.Format("{0} words", res);
}
}
Вы можете увидеть здесь barebone-решение для печати документа, который отправляется как поток в Службу. Служба копирует поток в файл, запускает Word, открывает файл, распечатывает документ, получает некоторые данные из документа и срывает и очищает курицу.
Клиент прямо вперед:
using(var client = new PrintService.PrintServiceClient())
{
using(var file = File.Open(@"small.docx", FileMode.Open))
{
var response = client.Print(file);
Console.WriteLine(response);
}
}
Это технически все, что необходимо, чтобы напечатать документ Word, от службы. Это работает без особых проблем на dev-сервере. Если вы запустите это в IIS, вам, вероятно, придется убедиться, что учетная запись, используемая как идентификатор в AppPool, является «пользователем», который может запускать Word, имеет доступ к принтерам и т. Д. Я уже столкнулся с одной известной проблемой: Я использовал драйвер печати XPS, который вызвал всплывающее диалоговое окно. Это то, что вы не можете иметь на сервере, и нет реального способа предотвратить или обнаружить это.
Помните, что этот служебный интерфейс позволяет только передавать поток. Если вы хотите добавить дополнительные данные, вам придется использовать контракт с сообщением, как описано в msdn в Large Data and Streaming. Ваш контракт должен будет выглядеть в этом случае:
[MessageContract]
public class UploadStreamMessage
{
[MessageHeader]
public string appRef;
[MessageBodyMember]
public Stream data;
}
Если запустить все это, (стресс) тест, рассмотрит развертывание и установить, я уверен, вы будете убедить кого-либо, что это не хорошо идея.
Чтобы уточнить, что он хочет сделать, это в основном запустить версию Office, установленную на удаленном сервере в вашем приложении, чтобы клиент мог выполнять все функции? Или просто выберите документы для печати и распечатайте их через Office, установленный на удаленном сервере? – Taegost
Это, конечно, возможно, но это непросто. Однако решение было бы слишком сложным, чтобы публиковать в качестве ответа здесь. Вам в основном нужно создать WCF или веб-службу, которая печатает документы и которая вызывается вашим клиентским приложением. –
@Taegost, что он, я хочу выполнить действие (печать, сохранение документа) из моего клиентского приложения, без установки Ms-офиса на моем клиенте. Вид дистанционного использования interop :) – sstassin