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

voix
68

Je veux imprimer HTML à partir d' un C # service Web. Le contrôle du navigateur Web est surpuissant et ne fonctionne pas bien dans un environnement de service et ne fonctionne bien sur un système avec des contraintes de sécurité très strictes. Y at - il sorte de libre .NETbibliothèque qui soutiendra l'impression d'une page HTML de base? Voici le code que j'ai jusqu'à présent, ce 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 fils de type d'interface utilisateur, mais rien ne se passe lorsqu'il est appelé à partir d' un fil de type de service. Changement Print()de ShowPrintPreviewDialog()rendement l'erreur de script IE suivant:

Erreur: « dialogArguments de IE_PrintType » est nulle ou non un objet
URL: res: //ieframe.dll/preview.dlg

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

Créé 01/08/2008 à 19:33
source utilisateur
Dans d'autres langues...                            


6 réponses

voix
29

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 du fichier html à imprimer.

Si vous n'avez pas besoin d'imprimer de la mémoire (ou peut se 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();
}

NB Cela ne fonctionne que sur Windows 2000 et au-dessus, je pense.

Créé 03/08/2008 à 19:06
source utilisateur

voix
3

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
Créé 15/08/2012 à 14:27
source utilisateur

voix
3

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

Il rendra 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 table (que beaucoup de navigateurs ne prennent pas en charge).

Créé 12/04/2010 à 18:57
source utilisateur

voix
3

Je sais que Visual Studio lui-même (au moins dans la version 2003) fait référence à l'IE dll directement pour rendre le « Mode Création ».

Il peut être intéressant de regarder dans cette.

Sinon, je ne peux pas penser à quoi que ce soit au-delà du contrôle du navigateur Web.

Créé 02/08/2008 à 01:42
source utilisateur

voix
0

Peut - être que cela vous aidera. http://www.codeproject.com/KB/printing/printhml.aspx également pas sûr de ce fil que vous essayez d'accéder au contrôle du navigateur à partir, mais il doit être STA

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

Créé 17/06/2009 à 18:36
source utilisateur

voix
-1

Je ne connais pas les outils spécifiques, mais il y a des utilitaires d'enregistrement / rejeu 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 ...)

Créé 20/09/2008 à 18:37
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more