Wie kann ich ein HTML-Dokument von einem Webdienst drucken?

stimmen
68

Ich mag HTML - Code aus einem C # Web - Service drucken. Die Web - Browser - Steuerung ist übertrieben, und funktioniert nicht gut in einer Service - Umgebung, auch nicht gut mit sehr engen Sicherheitseinschränkungen auf einem System funktionieren. Gibt es eine Art freier .NETBibliothek, die das Drucken einer einfachen HTML - Seite unterstützen? Hier ist der Code , den ich bisher habe, die nicht richtig laufen.

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 sie von UI-Typ - Threads aufgerufen, aber es passiert nichts , wenn sie von einem Service-Typ Thread aufgerufen. Ändern Print()zu ShowPrintPreviewDialog()Ausbeuten der folgenden IE Skriptfehler:

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

Und ein kleiner leerer Druckvorschau-Dialog erscheint.

Veröffentlicht am 01/08/2008 um 19:33
quelle vom benutzer
In anderen Sprachen...                            


6 antworten

stimmen
29

Sie können über die Befehlszeile drucken die folgende Verwendung:

rundll32.exe% WINDIR% \ System32 \ Mshtml.DLL, PrintHTML "% 1"

Wo% 1 der Dateipfad der HTML-Datei ist gedruckt werden.

Wenn Sie aus dem Speicher drucken müssen, können Sie nicht (oder kann es sich leisten auf die Platte in eine temporäre Datei zu schreiben) 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.

Beantwortet am 03/08/2008 um 19:06
quelle vom benutzer

stimmen
3

Einfach! Split Ihr Problem in zwei einfachere Teile:

  1. machen die HTML zu PDF
  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 eine PDF auf einem bestimmten Drucker
Beantwortet am 15/08/2012 um 14:27
quelle vom benutzer

stimmen
3

Wenn Sie es im Haushalt haben (~ $ 3000) Besuche PrinceXML .

Es wird HTML in eine PDF-Funktionen auch in einer Service-Umgebung machen, und erweiterte Funktionen unterstützt, wie eine Seite nicht in der Mitte einer Tabellenzelle zu brechen (was viele Browser derzeit nicht unterstützen).

Beantwortet am 12/04/2010 um 18:57
quelle vom benutzer

stimmen
3

Ich weiß, dass Visual Studio selbst (zumindest in Version 2003) verweist auf die IE dll direkt die „Entwurfsansicht“ zu machen.

Es kann ein Blick in die es wert sein.

Ansonsten kann ich glaube nicht über den Web-Browser die Kontrolle über alles.

Beantwortet am 02/08/2008 um 01:42
quelle vom benutzer

stimmen
0

Vielleicht wird dies helfen. http://www.codeproject.com/KB/printing/printhml.aspx auch nicht sicher , welchen Thread Sie versuchen , aus der Browser - Steuerung zuzugreifen, aber es muss STA sein

Hinweis - Das Projekt im Sinne der Link auf eine externe Seite navigieren lässt und einen Druck durchzuführen, ohne den Druckdialog zeigt.

Beantwortet am 17/06/2009 um 18:36
quelle vom benutzer

stimmen
-1

Ich weiß nicht, die spezifischen Werkzeuge, aber es gibt einige Programme, die Aufzeichnung / Wiedergabe klickt. Mit anderen Worten, Sie könnten die „Klick“ auf dem Druckdialog automatisieren. (Ich weiß, das ist ein Hack, aber wenn alles andere fehlschlägt ...)

Beantwortet am 20/09/2008 um 18:37
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more