打印到网络(共享)打印机 - Word Interop

时间:2013-08-08 16:15:40

标签: c# asp.net asp.net-mvc-4 interop

我需要在服务器端将 word文档打印到网络打印机。我的网页将文档和文件位置发送到服务器以打开和替换邮件合并项,然后将文档打印到首选(非默认)网络打印机。在网页上选择文档时,首选打印机名称会更改

我在Windows Server 2008 R2上使用 Word 14.0对象库,Asp.Net MVC 4.0,.Net Framework 4.0,IIS 7 。在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应用程序对象未加载安装到用户帐户的所有打印机。它只加载默认打印机。我假设当上述两种方法试图更改或将首选打印机添加到应用程序对象时,这是异常的原因,因为我尝试设置的打印机从未在活动打印机列表中找到。

如何在Word应用程序对象中加载用户配置文件下的所有已安装的共享打印机?

1 个答案:

答案 0 :(得分:1)

MS不支持在服务器场景中使用Office互操作(如ASP.NET,Windows服务等) - 请参阅http://support.microsoft.com/default.aspx?scid=kb;EN-US;q257757#kb2

此外,自Windows Vista以来已经发生了一些与安全相关的更改,基本上很难在Windows服务中执行任何“类似桌面”的操作(IIS / ASP.NET只是Windows服务在这方面的特例) )。

另一点是从服务器场景“打印”可能会导致问题,因为IIS是(特殊的)Windows服务... Windows服务通常没有“完整/真实”桌面,而这又需要用于印刷... ...

我不认为你的方案有一个简单的解决方案......

我会将其分解为不同的组件:

  • Word文档处理(例如使用Aspose.Words
  • 从生成的Word文件创建PDF(例如使用Aspose.Words
  • 在目标网络打印机上实施HotFolder
  • 将PDF复制到该HotFolder进行打印

对于您的方案,这将是一个强大且受支持的选项......