Wie drucke ich ein HTML-Dokument von einem Webservice aus?

  • Ich möchte HTML von einem C # Webservice aus drucken. Die Webbrowser-Steuerung ist übertrieben und funktioniert weder in einer Service-Umgebung noch in einem System mit sehr engen Sicherheitsbeschränkungen. Gibt es eine Art kostenlose .NET -Bibliothek, die das Drucken einer einfachen HTML-Seite unterstützt? Hier ist der Code, den ich bisher habe, der nicht richtig läuft.

     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();
    }
     

    Das funktioniert gut, wenn von aufgerufen wird UI-Typ-Threads, es passiert jedoch nichts, wenn von einem Dienst-Thread aufgerufen wird. Das Ändern von Print() in ShowPrintPreviewDialog() führt zu dem folgenden IE-Skriptfehler:

    Fehler: 'dialogArguments .___ IE_PrintType' ist null oder kein Objekt
    URL: res: //ieframe.dll/preview.dlg

    Ein kleines leeres Dialogfeld für die Druckvorschau wird angezeigt.

    22 December 2017
    Paul RatazziDylanJ
5 answers
  • Sie können von der Befehlszeile aus wie folgt drucken:

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

    Dabei steht% 1 für den Dateipfad der zu druckenden HTML-Datei.

    Wenn Sie nicht aus dem Speicher drucken müssen (oder es sich leisten können, in einer temporären Datei auf die Festplatte zu schreiben), können Sie Folgendes verwenden:

     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 Das funktioniert nur unter Windows 2000 und höher, denke ich.

    03 August 2008
    ICRpackage
  • Ich weiß, dass Visual Studio (zumindest in der Version 2003) die IE-DLL direkt referenziert, um die "Entwurfsansicht" zu rendern.

    Es lohnt sich vielleicht, nachzusehen in das.

    Ansonsten fällt mir nichts ein, was sich außerhalb des Webbrowser-Steuerelements befindet.

    02 August 2008
    EndangeredMassa
  • Wenn Sie das Budget haben (~ 3000 $), besuchen Sie PrinceXML .

    HTML wird in eine PDF-Datei gerendert, funktioniert in einer Service-Umgebung gut und unterstützt erweiterte Funktionen, z Browser unterstützen derzeit nicht).

    13 April 2010
    Chris Marasti-Georg
  • Ich kenne die spezifischen Tools nicht, aber es gibt einige Dienstprogramme, die Klicks aufzeichnen / wiedergeben. Mit anderen Worten, Sie könnten den "Klick" im Druckdialogfeld automatisieren. (Ich weiß, das ist ein Hack, aber wenn alles andere fehlschlägt ...)

    20 September 2008
    Greg Ogle
  • Vielleicht hilft das. http://www.codeproject.com/KB/printing/printhml.aspx Sie sind sich auch nicht sicher, von welchem ​​Thread aus Sie auf die Browsersteuerung zugreifen möchten, es muss jedoch STA sein.

    Hinweis - Das im Link genannte Projekt lässt Sie zu um zu einer Seite zu navigieren und einen Druck durchzuführen, ohne das Druckdialogfeld anzuzeigen.

    17 June 2009
    NastyNateDoggy