86 votes

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, ni sur un système soumis à des contraintes de sécurité très strictes. Existe-t-il une sorte d'outil gratuit .NET qui permettra 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 bien lorsqu'il est appelé à partir de threads de type interface utilisateur, mais rien ne se passe lorsqu'il est appelé à partir d'un thread de type service. Modification de Print() à ShowPrintPreviewDialog() produit l'erreur IE script suivante :

Erreur : dialogArguments.___IE_PrintType est nul ou n'est pas un objet.

URL : res://ieframe.dll/preview.dlg

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

0 votes

@mruanova Aucune des réponses n'a fonctionné la dernière fois que je les ai essayées. Si vous avez quelque chose qui fonctionne, faites-le nous savoir.

0 votes

Je sais que cette question était considérée comme pertinente en 2008, mais elle est hors sujet maintenant.

0 votes

Joshua, comment ça ?

36voto

ICR Points 6960

Vous pouvez imprimer à partir de 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 si vous pouvez vous permettre d'é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 plus, je pense.

0 votes

Excellente réponse - j'allais la marquer comme acceptée, et j'ai fait mon test. Il semble que la dll fasse toujours apparaître la boîte de dialogue d'impression, et comme il s'agit de fonctionner comme un service Windows non surveillé, nous devons contourner cela d'une manière ou d'une autre. J'ai pratiquement épuisé Google et je ne sais plus où donner de la tête.

0 votes

Malheureusement, la boîte de dialogue de l'imprimante apparaît. J'ai testé sur Windows 7 x64.

8voto

EndangeredMassa Points 9532

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 "Design View".

Cela peut valoir la peine de s'y intéresser.

Sinon, je ne vois rien d'autre que le contrôle du navigateur Web.

6voto

Colonel Panic Points 18390

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

  1. rendre le HTML en 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

0 votes

Aux dernières nouvelles, la partie 2 (impression via la ligne de commande avec Adobe) ne fonctionne pas dans un service - elle nécessite une interaction avec l'utilisateur.

1 votes

Essayez Sumatra PDF, c'est beaucoup plus rapide. blog.kowalczyk.info/software/sumatrapdf/

0 votes

@ColonelPanic Wow. Excellent conseil. J'ai mis des siècles à en trouver un qui fonctionne, même à partir d'un service, et il semble que SumatraPdf soit réellement utilisable dans les paquets commerciaux.

4voto

user314783 Points 36

Si votre budget le permet (~3000 $), jetez un coup d'œil à PrinceXML .

Il convertit le HTML en PDF, fonctionne bien dans un environnement de service et prend en charge des fonctions avancées telles que le fait de ne pas interrompre une page au milieu d'une cellule de tableau (ce que beaucoup de navigateurs ne prennent pas en charge actuellement).

-2voto

Greg Ogle Points 3964

Je ne connais pas les outils spécifiques, mais il existe des utilitaires qui enregistrent / rejouent les clics. En d'autres termes, vous pourriez automatiser le "clic" sur la boîte de dialogue d'impression. (Je sais que c'est un hack, mais quand tout le reste échoue...)

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