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

Je souhaite imprimer du code 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, ni ne fonctionne bien sur un système avec des contraintes de sécurité très strictes. Existe-t-il une sorte de librairie .NET gratuite qui permette l'impression d'une page HTML de base? Voici le code que j'ai jusqu'à présent, qui ne fonctionne pas correctement.

public void PrintThing(string 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(string document)
{
    WebBrowser browser = new WebBrowser();
    browser.DocumentText = document;
    while (browser.ReadyState != WebBrowserReadyState.Complete)
    {
        Application.DoEvents();
    }
    browser.Print();
}

Cela fonctionne correctement lorsqu'il est appelé à partir de threads de type UI, mais rien ne se produit lorsqu'il est appelé à partir d'un thread de type service. La modification de Print() en ShowPrintPreviewDialog() génère l'erreur de script IE suivante:

Error: 'dialogArguments.___IE_PrintType' is null or not an object
URL: res://ieframe.dll/preview.dlg

Et une petite boîte de dialogue d'aperçu avant impression apparaît.

0
ajouté édité
Vues: 3
@mruanova Aucune des réponses travaillées dernièrement je les ai essayées. Si vous avez quelque chose qui fonctionne, faites-le nous savoir.
ajouté l'auteur Chris Marasti-Georg, source
Veuillez sélectionner la meilleure réponse, merci.
ajouté l'auteur mruanova, source

6 Réponses

Je sais que Visual Studio lui-même (au moins dans la version 2003) fait référence à la DLL d'IE directement pour rendre le "Design View".

Cela peut valoir la peine d'examiner cela.

Sinon, je ne peux pas penser à autre chose que le contrôle du navigateur Web.

0
ajouté

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

rundll32.exe   % WINDIR% \ System32 \ mshtml.dll, ImprimerHTML   "% 1"

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

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

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

N.B. Cela ne fonctionne que sur Windows 2000 et supérieur je pense.

0
ajouté
Grande réponse - allait marquer son acceptation, et a couru mon test. Il semble que dll affiche toujours la boîte de dialogue Imprimer, et comme cela doit fonctionner comme un service Windows sans assistance, nous devons contourner cela en quelque sorte. J'ai à peu près épuisé Google, et je suis à bout de nerfs.
ajouté l'auteur Chris Marasti-Georg, source
Malheureusement, une boîte de dialogue d'imprimante apparaît. J'ai testé sur Windows 7 x64.
ajouté l'auteur LukTar, source

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

  1. Rendez le HTML au format PDF
  2. imprimer le PDF ( SumatraPDF )
  • -print-to-default $file.pdf prints a PDF file on a default printer
  • -print-to $printer_name $file.pdf prints a PDF on a given printer
0
ajouté
La dernière fois que j'ai vérifié, la partie 2 (impression via une ligne de commande avec Adobe) ne fonctionne pas dans un service - elle nécessite une interaction de l'utilisateur.
ajouté l'auteur Chris Marasti-Georg, source
Essayez Sumatra PDF c'est beaucoup plus rapide blog.kowalczyk.info/software/ sumatrapdf / & hellip;
ajouté l'auteur Colonel Panic, source

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 dialogue d'impression. (Je sais que c'est un hack, mais quand tout le reste échoue ...)

0
ajouté

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

Remarque - Le projet mentionné dans le lien vous permet de naviguer vers une page et d'effectuer une impression sans afficher la boîte de dialogue d'impression.

0
ajouté

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

Il convertit le HTML en 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 beaucoup de navigateurs ne supportent pas actuellement).

0
ajouté