Wie drucke ich ein HTML-Dokument aus einem Webdienst?

79

Ich möchte HTML von einem C # -Webedienst drucken. Die Webbrowser-Steuerung ist übertrieben und funktioniert weder in einer Serviceumgebung noch auf einem System mit sehr strengen Sicherheitsbeschränkungen. Gibt es eine kostenlose .NETBibliothek, die das Drucken einer einfachen HTML-Seite unterstützt? Hier ist der Code, den ich bisher habe und 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 Threads vom Typ UI aufgerufen wird, aber nichts passiert, wenn es von einem Thread vom Typ Service aufgerufen wird. Das Ändern Print()auf ShowPrintPreviewDialog()ergibt den folgenden IE-Skriptfehler:

Fehler: dialogArguments.___IE_PrintType ist null oder kein Objekt.

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

Ein kleines leeres Druckvorschau-Dialogfeld wird angezeigt.

Chris Marasti-Georg
quelle
@ruanova Keine der Antworten hat zuletzt funktioniert. Ich habe sie ausprobiert. Wenn Sie etwas haben, das funktioniert, lassen Sie es uns wissen.
Chris Marasti-Georg
Ich weiß, dass dies eine gute Frage in '08 war, aber es ist jetzt offtopic.
Joshua
@ Joshua wie so?
Chris Marasti-Georg

Antworten:

33

Sie können über die Befehlszeile wie folgt drucken:

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

Dabei ist% 1 der 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();
}

Hinweis: Dies funktioniert nur unter Windows 2000 und höher, denke ich.

ICR
quelle
Tolle Antwort - wollte es als akzeptiert markieren und führte meinen Test durch. Es scheint, dass die DLL immer noch das Dialogfeld "Drucken" öffnet. Da dies als unbeaufsichtigter Windows-Dienst ausgeführt werden soll, müssen wir dies irgendwie umgehen. Ich habe Google ziemlich erschöpft und bin am Ende.
Chris Marasti-Georg
Leider wird der Druckerdialog angezeigt. Ich habe unter Windows 7 x64 getestet.
LukaszTaraszka
6

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

Es kann sich lohnen, dies zu untersuchen.

Ansonsten fällt mir nichts ein, was außerhalb der Kontrolle des Webbrowsers liegt.

Gefährdete Masse
quelle
5

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

  1. Rendern Sie den HTML-Code in PDF
  2. PDF ausdrucken ( 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
Oberst Panik
quelle
Zuletzt habe ich überprüft, dass Teil 2 (Drucken über die Befehlszeile mit Adobe) in einem Dienst nicht funktioniert - es erfordert Benutzerinteraktion.
Chris Marasti-Georg
1
Versuchen Sie Sumatra PDF, es ist viel schneller blog.kowalczyk.info/software/sumatrapdf/…
Colonel Panic
@ColonelPanic Wow. Toller Hinweis. Ich habe ewig gebraucht, um eine zu finden, die sogar von einem Dienst aus funktioniert, und es scheint, dass SumatraPdf tatsächlich in kommerziellen Paketen verwendet werden kann.
Nyerguds
4

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

Es rendert HTML in eine PDF-Datei, funktioniert gut in einer Serviceumgebung und unterstützt erweiterte Funktionen wie das Nicht-Brechen einer Seite in der Mitte einer Tabellenzelle (die viele Browser derzeit nicht unterstützen).

user314783
quelle
1

Vielleicht hilft das. http://www.codeproject.com/KB/printing/printhml.aspx Sie sind sich auch nicht sicher, von welchem ​​Thread Sie auf das Browser-Steuerelement zugreifen möchten, aber es muss STA sein

Hinweis - Mit dem Projekt, auf das im Link verwiesen wird, können Sie zu einer Seite navigieren und einen Druck ausführen, ohne den Druckdialog anzuzeigen.

NastyNateDoggy
quelle
1

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

Der Preis ist angemessen (ab 245 US-Dollar) und es kann HTML in ein PDF rendern und auch das Drucken der PDF-Dateien direkt verwalten.

AnthonyVO
quelle
-1

Ich kenne die spezifischen Tools nicht, aber es gibt einige Dienstprogramme, die Klicks aufzeichnen / wiedergeben. Mit anderen Worten, Sie können das "Klicken" im Druckdialog automatisieren. (Ich weiß, dass dies ein Hack ist, aber wenn alles andere fehlschlägt ...)

Greg Ogle
quelle