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

Translate

Je souhaite 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 ne fonctionne bien sur un système avec des contraintes de sécurité très strictes. Y a-t-il une sorte de gratuit.NETbibliothèque qui prendra en charge 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 passe lorsqu'il est appelé à partir d'un thread de type service. En changeantPrint()àShowPrintPreviewDialog()renvoie l'erreur de script IE suivante:

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

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

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

This question and all comments follow the "Attribution Required."

Toutes les réponses

ICR
Translate

Vous pouvez imprimer à partir de la ligne de commande en utilisant les éléments suivants:

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 à partir de la mémoire (ou que 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();
}

NB Cela ne fonctionne que sur Windows 2000 et plus je pense.

La source
Translate

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

Cela vaut peut-être la peine de se pencher là-dessus.

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

La source
Translate

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.pdfimprime un fichier PDF sur une imprimante par défaut
  • -print-to $printer_name $file.pdfimprime un PDF sur une imprimante donnée
La source
Translate

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

Il rendra le HTML dans un PDF, fonctionnera 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 de nombreux navigateurs ne prennent actuellement pas en charge).

La source
Translate

Peut-être que cela aidera.http://www.codeproject.com/KB/printing/printhml.aspxVous ne savez pas non plus à partir 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.

La source
Translate

L'outil qui fonctionne très bien pour moi est HiQPdf.https://www.hiqpdf.com/

Le prix est raisonnable (à partir de 245 $) et il peut rendre le HTML en PDF et également gérer l'impression des fichiers PDF directement.

La source
Translate

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

La source