c# - Wie drucke ich ein HTML-Dokument aus einem Webdienst?

Translate

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 irgendeine Art von frei.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. ÄndernPrint()zuShowPrintPreviewDialog()ergibt den folgenden IE-Skriptfehler:

Error: dialogArguments.___IE_PrintTypeist null oder kein Objekt.

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

Ein kleines leeres Druckvorschau-Dialogfeld wird angezeigt.

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

Alle Antworten

ICR
Translate

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.

Quelle
Translate

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.

Quelle
Translate

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.pdfdruckt eine PDF-Datei auf einem Standarddrucker
  • -print-to $printer_name $file.pdfdruckt ein PDF auf einem bestimmten Drucker
Quelle
Translate

Wenn Sie es im Budget haben (~ $ 3000), schauen Sie sich das anPrinceXML.

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 (was viele Browser derzeit nicht unterstützen).

Quelle
Translate

Vielleicht hilft das.http://www.codeproject.com/KB/printing/printhml.aspxSie 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.

Quelle
Translate

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.

Quelle
Translate

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 ...)

Quelle