2008-08-01 12 views
66

Ich möchte HTML aus einem C# -Webdienst drucken. Die Web-Browser-Kontrolle ist übertrieben und funktioniert nicht gut in einer Service-Umgebung, noch funktioniert sie gut auf einem System mit sehr engen Sicherheitsbeschränkungen. Gibt es eine kostenlose .NET Bibliothek, die das Drucken einer einfachen HTML-Seite unterstützt? Hier ist der Code den ich bisher habe, der nicht richtig läuft.Wie drucke ich ein HTML-Dokument von einem Web-Service?

Das funktioniert gut, wenn von UI-Typ-Threads aufgerufen wird, aber nichts geschieht, wenn von einem Service-Typ-Thread aufgerufen wird. Ändern Print() zu ShowPrintPreviewDialog() ergibt die folgenden IE Skriptfehler:

Error: 'dialogArguments.___IE_PrintType' is null or not an object
URL: res://ieframe.dll/preview.dlg

Und ein kleiner leerer Druckvorschau-Dialog erscheint.

+0

Bitte wählen Sie beste Antwort, danke. – mruanova

+0

@mruanova Keine der Antworten funktionierte zuletzt Ich habe sie ausprobiert. Wenn Sie etwas haben, das funktioniert, lassen Sie es uns wissen. –

Antwort

3

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

Es kann sich lohnen, dies zu untersuchen.

Ansonsten kann ich über nichts anderes als die Webbrowsersteuerung nachdenken.

28

Sie können über die Befehlszeile drucken folgendes mit:

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

Wo% 1 den Dateipfad der HTML-Datei gedruckt werden soll.

Wenn Sie nicht aus dem Speicher drucken möchten (oder können in einer temporären Datei auf die Festplatte schreiben leisten) können Sie:

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(); 
} 

N. B. Dies funktioniert nur unter Windows 2000 und höher, denke ich.

+0

Große Antwort - würde es akzeptieren, und führte meinen Test. Scheint, dass dll immer noch das Drucken-Dialogfeld ö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 ich bin am Ende meiner Weisheit. –

+0

Leider Drucker Dialog erscheint. Ich habe auf Windows 7 x64 getestet. – LukTar

-1

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

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

Hinweis sein - Das genannte Projekt in der Verbindung ermöglicht es Ihnen, auf einer Seite zu navigieren und einen Druck durchzuführen, ohne zeigen der Druckdialog

3

Wenn Sie es im Budget (~ 3000 $) haben, überprüfen Sie PrinceXML.

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

3

Einfach! Split Ihr Problem in zwei einfachere Teile:

  1. render the HTML to PDF
  2. Druck der PDF (SumatraPDF)
  • -print-to-default $file.pdf prints a PDF file on a default printer
  • -print-to $printer_name $file.pdf prints a PDF on a given printer
+0

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

+1

Versuchen Sie Sumatra PDF es ist viel schneller http://blog.kowalczyk.info/software/sumatrapdf/manual.html#manual-cmd-line –