Comment imprimer un document HTML à partir d’un service Web?

Je veux imprimer du HTML à partir d’un service Web C #. Le contrôle du navigateur Web est excessif et ne fonctionne pas bien dans un environnement de service. Il ne fonctionne pas non plus avec un système avec des contraintes de sécurité très ssortingctes. Existe-t-il une sorte de bibliothèque .NET gratuite qui prend en charge l’impression d’une page HTML de base? Voici le code que j’ai à ce jour, qui ne fonctionne pas correctement.

 public void PrintThing(ssortingng document) { if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA) { Thread thread = new Thread((ThreadStart) delegate { PrintDocument(document); }); thread.SetApartmentState(ApartmentState.STA); thread.Start(); } else { PrintDocument(document); } } protected void PrintDocument(ssortingng document) { WebBrowser browser = new WebBrowser(); browser.DocumentText = document; while (browser.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); } browser.Print(); } 

Cela fonctionne bien lorsqu’il est appelé à partir de threads de type interface utilisateur, mais rien ne se produit lorsqu’il est appelé à partir d’un thread de type service. Changer Print() en ShowPrintPreviewDialog() l’erreur de script IE suivante:

Erreur: ‘dialogArguments .___ IE_PrintType’ est nul ou non un object
URL: res: //ieframe.dll/preview.dlg

Et une petite boîte de dialog d’aperçu d’impression vide apparaît.

Vous pouvez imprimer depuis la ligne de commande en utilisant ce qui suit:

rundll32.exe% WINDIR% \ System32 \ mshtml.dll, PrintHTML “% 1”

Où% 1 est le chemin du fichier html à imprimer.

Si vous n’avez pas besoin d’imprimer depuis la mémoire (ou pouvez vous permettre d’écrire sur le disque dans un fichier temporaire), vous pouvez utiliser:

 using (Process printProcess = new Process()) { ssortingng systemPath = Environment.GetFolderPath(Environment.SpecialFolder.System); printProcess.StartInfo.FileName = systemPath + @"\rundll32.exe"; printProcess.StartInfo.Arguments = systemPath + @"\mshtml.dll,PrintHTML """ + fileToPrint + @""""; printProcess.Start(); } 

NB Je pense que cela ne fonctionne que sous Windows 2000 et au-dessus.

Je sais que Visual Studio lui-même (au moins dans la version 2003) fait directement référence à la DLL IE pour rendre la “vue de conception”.

Il peut être intéressant de regarder cela.

Sinon, je ne peux rien penser au-delà du contrôle du navigateur Web.

Facile! Divisez votre problème en deux parties plus simples:

  1. rendre le HTML au format PDF
  2. imprimer le PDF ( SumatraPDF )
  • -print-to-default $file.pdf imprime un fichier PDF sur une imprimante par défaut
  • -print-to $printer_name $file.pdf imprime un PDF sur une imprimante donnée

Si vous l’avez dans le budget (~ 3000 $), consultez PrinceXML .

Il rend le HTML dans un fichier PDF, fonctionne bien dans un environnement de service et prend en charge des fonctionnalités avancées telles que ne pas casser une page au milieu d’une cellule de tableau (ce que ne supportent pas actuellement beaucoup de navigateurs).

Peut-être que cela aidera. http://www.codeproject.com/KB/printing/printhml.aspx Aussi, vous ne savez pas à partir de quel thread vous essayez d’accéder au contrôle du navigateur, mais il doit s’agir de STA

Remarque – Le projet auquel il est fait référence dans le lien vous permet d’accéder à une page et d’effectuer une impression sans afficher la boîte de dialog d’impression.

Je ne connais pas les outils spécifiques, mais certains utilitaires enregistrent / rejouent les clics. En d’autres termes, vous pouvez automatiser le “clic” sur la boîte de dialog d’impression. (Je sais que c’est un hack, mais quand tout échoue …)