2013-08-08 2 views
4

J'ai besoin d'imprimer un document Word sur le serveur à une imprimante réseau. Ma page Web envoie le document et l'emplacement du fichier au serveur pour ouvrir et remplacer les éléments de fusion et publipostage, puis imprimer le document à une imprimante réseau préférée (pas par défaut). Le nom d'imprimante préféré change lorsque le document sélectionné sur les changements de page WebImprimer vers une imprimante réseau (partagée) - Word Interop

J'utilise bibliothèque d'objets Word 14.0, Asp.Net MVC 4.0, .Net Framework 4.0, IIS 7 sur Windows Server 2008 R2. Sur IIS, j'ai créé un pool d'applications qui s'exécute sur un compte spécifique Identity (accountName @ DomainName). Chargez le profil utilisateur défini sur true pour charger les connexions de l'imprimante réseau dans le registre. J'ai permis au compte d'avoir des autorisations pour exécuter le mot COM interop services. J'ai réussi à ouvrir le document et à remplacer les champs de fusion et publipostage et l'enregistrer en tant que pdf pour envoyer le fichier en pièce jointe à un e-mail.

Le mot application a l'imprimante par défaut dans sa propriété ActivePrinter, de sorte que je puisse également imprimer sur l'imprimante par défaut. Mais mon but final est d'imprimer le mot sur une imprimante réseau préférée avant de fermer l'application mot et le document actif.

Les deux méthodes suivantes provoquaient des exceptions si j'essayais de modifier la propriété ActivePrinter.

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

Première méthode:

wordApp.ActivePrinter = "preferredPrinterName"; 

Deuxième méthode;

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); 

J'ai trouvé que l'objet application Word ne se charge pas toutes les imprimantes installées sur le compte de l'utilisateur. Il charge uniquement l'imprimante par défaut. Je suppose que c'était la raison des exceptions quand plus de deux méthodes essayaient de changer ou d'ajouter l'imprimante préférée à l'objet d'application parce que l'imprimante que j'essaye de placer n'a jamais été trouvée dans la liste active d'imprimantes.

Comment puis-je charger toutes les imprimantes partagées installées sous le profil utilisateur dans l'objet Application Word?

Répondre

1

L'utilisation interop Office dans un serveur scénario (comme ASP.NET, service Windows, etc.) ne sont pas pris en charge par MS - voir http://support.microsoft.com/default.aspx?scid=kb;EN-US;q257757#kb2

De plus il y a eu plusieurs changé depuis Windows Vista en matière de sécurité qui font essentiellement il est vraiment difficile de faire quoi que ce soit "de bureau" dans un service Windows (IIS/ASP.NET est juste un cas particulier du service Windows à cet égard). Un autre point est "impression" à partir d'un serveur-scénario est susceptible de causer des problèmes depuis IIS est un service (spécial) Windows ... Windows Service ne disposent généralement pas d'un bureau "full/real" qui est à son tour nécessaire pour l'impression robuste ...

Je ne pense pas qu'il existe une solution facile pour votre scénario ...

Je décomposer différents composants:

  • Mot de traitement des documents (par exemple avec Aspose.Words)
  • Créer un PDF à partir du fichier Word résultant (par exemple avec Aspose.Words)
  • Mettre en oeuvre une HotFolder sur l'imprimante réseau cible
  • Copiez le fichier PDF sur ce HotFolder pour l'imprimer

Ce serait une option robuste et pris en charge pour votre scénario ...

+0

Aspose.words est génial. Pas besoin d'activer DCOM sur le serveur, cela fonctionnait parfaitement pour imprimer des documents Word sur les imprimantes réseau souhaitées côté serveur. Cela fonctionne pour mon scénario. Cependant, les licences sont chères. Si quelqu'un ne veut pas acheter une licence pour Aspose.words, je suggère d'activer DCOM et d'utiliser un compte de service avec des privilèges aussi limités que possible pour automatiser MS WORD avec des assemblages interop et enregistrer le fichier en PDF dans les HotFolders pour l'impression. Cependant, je n'ai pas essayé HotFolders. –

Questions connexes