Wie drucke ich ein HTML-Dokument von einem Webdienst?

Lesezeit: 4 Minuten

Benutzer-Avatar
Chris Marasti-Georg

Ich möchte HTML von einem C#-Webdienst drucken. Die Webbrowser-Steuerung ist übertrieben und funktioniert nicht gut in einer Dienstumgebung, noch funktioniert sie gut auf einem System mit sehr strengen Sicherheitsbeschränkungen. Gibt es irgendeine Art von freiem .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();
}

Dies funktioniert gut, wenn es von UI-artigen Threads aufgerufen wird, aber es passiert nichts, wenn es von einem Dienst-artigen Thread aufgerufen wird. Ändern Print() zu ShowPrintPreviewDialog() ergibt den folgenden IE-Skriptfehler:

Fehler: dialogArguments.___IE_PrintType ist null oder kein Objekt.

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

Und ein kleiner leerer Druckvorschau-Dialog erscheint.

  • @mruanova Keine der Antworten hat funktioniert, als ich sie zuletzt ausprobiert habe. Wenn Sie etwas haben, das funktioniert, lassen Sie es uns wissen.

    – Chris Marasti-Georg

    23. September 2017 um 20:49 Uhr

  • Ich weiß, dass dies ’08 als gute Frage angesehen wurde, aber jetzt ist es nicht mehr zum Thema.

    – Josua

    8. September 2019 um 14:42 Uhr

  • @ Joshua wie das?

    – Chris Marasti-Georg

    30. September 2019 um 16:16 Uhr

  • Siehe meta.stackoverflow.com/questions/251134/…

    – Josua

    30. September 2019 um 16:31 Uhr

Benutzer-Avatar
IKR

Sie können folgendermaßen von der Befehlszeile aus drucken:

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

Wobei %1 der Dateipfad der zu druckenden HTML-Datei ist.

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

  • Tolle Antwort – wollte es als akzeptiert markieren und meinen Test durchführen. Scheint, dass dll immer noch den Druckdialog öffnet, und da dies als unbeaufsichtigter Windows-Dienst ausgeführt werden soll, müssen wir das irgendwie umgehen. Ich habe Google ziemlich erschöpft und bin mit meinem Latein am Ende.

    – Chris Marasti-Georg

    24. August 2009 um 16:25 Uhr

  • Leider erscheint ein Druckerdialog. Getestet habe ich auf Windows 7 x64.

    – Lukasz Taraszka

    2. November 2016 um 13:45 Uhr

Ich weiß, dass Visual Studio selbst (zumindest in der Version 2003) direkt auf die IE-DLL verweist, um die “Designansicht” zu rendern.

Es kann sich lohnen, dem nachzugehen.

Ansonsten fällt mir nichts ein, was über die Webbrowser-Steuerung hinausgeht.

Benutzer-Avatar
Oberst Panik

Einfach! Teilen Sie Ihr Problem in zwei einfachere Teile auf:

  1. HTML in PDF rendern
  2. Drucken Sie das PDF (SumatraPDF)
  • -print-to-default $file.pdf druckt eine PDF-Datei auf einem Standarddrucker
  • -print-to $printer_name $file.pdf druckt ein PDF auf einem bestimmten Drucker

  • Zuletzt habe ich überprüft, Teil 2 (Drucken über die Befehlszeile mit Adobe) funktioniert nicht in einem Dienst – es erfordert eine Benutzerinteraktion.

    – Chris Marasti-Georg

    16. August 2012 um 14:37 Uhr

  • Probieren Sie Sumatra PDF aus, es ist viel schneller blog.kowalczyk.info/software/sumatrapdf/…

    – Oberst Panik

    16. August 2012 um 14:41 Uhr


  • @ColonelPanic Wow. Toller Hinweis. Ich habe ewig gebraucht, um eines zu finden, das sogar von einem Dienst aus funktioniert, und es scheint, dass SumatraPdf tatsächlich in kommerziellen Paketen verwendet werden kann.

    – Nyerguds

    12. Juli 2018 um 13:36 Uhr


Benutzer-Avatar
Benutzer314783

Wenn Sie es im Budget haben (~ $ 3000), schauen Sie es sich an PrinceXML.

Es rendert HTML in ein PDF, funktioniert gut in einer Serviceumgebung und unterstützt erweiterte Funktionen, wie z. B. das Nichtumbrechen einer Seite in der Mitte einer Tabellenzelle (was viele Browser derzeit nicht unterstützen).

Das Tool, das für mich sehr gut funktioniert, ist HiQPdf. https://www.hiqpdf.com/

Der Preis ist angemessen (ab 245 $) und es kann HTML in ein PDF rendern und auch den Druck der PDF-Dateien direkt verwalten.

Benutzer-Avatar
NastyNateDoggy

Vielleicht hilft das. http://www.codeproject.com/KB/printing/printhml.aspx
Sie sind sich auch nicht sicher, von welchem ​​​​Thread Sie versuchen, auf das Browsersteuerelement zuzugreifen, aber es muss STA sein

Hinweis – Das Projekt, auf das im Link verwiesen wird, ermöglicht es Ihnen, zu einer Seite zu navigieren und einen Druck durchzuführen, ohne den Druckdialog anzuzeigen.

Benutzer-Avatar
Oglester

Ich kenne die spezifischen Tools nicht, aber es gibt einige Dienstprogramme, die Klicks aufzeichnen / wiedergeben. Mit anderen Worten, Sie könnten das “Klicken” auf den Druckdialog automatisieren. (Ich weiß, das ist ein Hack, aber wenn alles andere fehlschlägt …)

1317840cookie-checkWie drucke ich ein HTML-Dokument von einem Webdienst?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy