4 votes

Imprimer vers une imprimante réseau (partagée) - Word Interop

J'ai besoin d'imprimer un document Word du côté serveur vers une imprimante réseau. Ma page Web envoie le document et l'emplacement du fichier au serveur pour qu'il ouvre et remplace les éléments de fusion de courrier, puis imprime le document sur une imprimante réseau préférée (pas par défaut). Le nom de l'imprimante préférée change lorsque le document sélectionné sur la page Web change.

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 fonctionne sur un compte spécifique Identity (accountName@DomainName). Charger le profil de l'utilisateur défini sur true pour charger les connexions de l'imprimante réseau dans le registre. J'ai autorisé le compte à avoir des permissions pour exécuter les services d'interopérabilité de word COM. J'ai réussi à ouvrir le document, à remplacer les champs de fusion de courrier et à l'enregistrer au format PDF pour envoyer le fichier en tant que pièce jointe à un courriel.

L'application Word a l'imprimante par défaut dans son ActivePrinter afin que je puisse également imprimer sur l'imprimante par défaut. Mais mon objectif final est d'imprimer le mot sur une imprimante réseau préférée avant de fermer l'application Word et le document actif.

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

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 constaté que l'objet d'application Word ne charge pas toutes les imprimantes installées sur le compte de l'utilisateur. Il ne charge que l'imprimante par défaut. Je suppose que c'est la raison des exceptions lorsque les deux méthodes ci-dessus tentent de modifier ou d'ajouter une imprimante préférée à l'objet d'application, car l'imprimante que j'essaie de définir n'a jamais été trouvée dans la liste des imprimantes actives.

Comment faire pour que toutes les imprimantes partagées installées sous le profil de l'utilisateur soient chargées dans l'objet d'application Word ?

1voto

Yahia Points 49011

L'utilisation de l'interopérabilité d'Office dans un scénario de serveur (comme ASP.NET, Windows Service, etc.) n'est PAS prise en charge par MS. http://support.microsoft.com/default.aspx?scid=kb;EN-US;q257757#kb2

En outre, plusieurs modifications liées à la sécurité ont été apportées depuis Windows Vista, de sorte qu'il est très difficile de faire quoi que ce soit qui ressemble à un bureau dans un service Windows (IIS/ASP.NET n'est qu'un cas particulier de service Windows à cet égard).

Un autre point est que "l'impression" à partir d'un scénario de serveur est susceptible de poser des problèmes puisque IIS est un service Windows (spécial)... Les services Windows ne disposent généralement pas d'un bureau "complet/réel", ce qui est nécessaire pour imprimer de manière robuste...

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

Je le décomposerais en différents éléments :

  • Traitement des documents Word (par exemple avec Aspose.Words )
  • Créez un PDF à partir du fichier Word résultant (par exemple avec Aspose.Words )
  • Implémenter un HotFolder sur l'imprimante réseau cible
  • Copiez le PDF dans ce HotFolder pour l'imprimer.

Ce serait une option robuste et soutenue pour votre scénario...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X