Frage

Ich möchte HTML von einem C#-Webdienst drucken.Die Webbrowser-Steuerung ist übertrieben und funktioniert weder in einer Serviceumgebung noch auf einem System mit sehr strengen Sicherheitsbeschränkungen gut.Gibt es irgendeine Art von Gratis? .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-Threads aufgerufen wird, aber nichts passiert, wenn es von einem Service-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 es erscheint ein kleiner, leerer Druckvorschaudialog.

Keine korrekte Lösung

Andere Tipps

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

rundll32.exe%winTir% 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:Ich glaube, das funktioniert nur unter Windows 2000 und höher.

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

Es könnte sich lohnen, sich damit zu befassen.

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

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

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

Wenn Sie es im Budget haben (ca. 3.000 US-Dollar), schauen Sie es sich an PrinceXML.

Es rendert HTML in eine PDF-Datei, funktioniert gut in einer Serviceumgebung und unterstützt erweiterte Funktionen, z. B. das Vermeiden eines Seitenumbruchs in der Mitte einer Tabellenzelle (was derzeit von vielen Browsern nicht unterstützt wird).

Vielleicht hilft das. http://www.codeproject.com/KB/printing/printhml.aspxIch bin mir auch nicht sicher, von welchem ​​Thread aus Sie auf die Browsersteuerung zugreifen möchten, aber es muss STA sein

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

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top