2010-10-14 72 views
8

Busco una manera de imprimir un archivo con formato HTML en modo horizontal en C# (principalmente WPF). Imprimir diálogo sería bueno para establecer la configuración de la página en horizontal. Intenté usar el convertidor html de Microsoft a xaml y destruyó el formato. Me parece bastante sorprendente que no haya un método o que agarre un archivo y lo envíe directamente a una impresora.Impresión de una página con formato HTML en C#

Cualquier idea sería muy apreciada.

Respuesta

2

Me parece que lo mejor que puede hacer es elegir primero el motor de representación HTML y buscar soporte de impresión. No existe una forma "estándar" de imprimir un documento HTML independientemente del idioma, sistema operativo o marco.

9

Puede acceder al método Print() de la clase WebBrowser, en C# para hacer esto. Lo bueno es que no necesita mostrar realmente WebBrowser en ninguna parte de su aplicación. Simplemente alimentar el contenido al control WebBrowser así:

webBrowser1.DocumentContent = openfiledialog.FileName;

Y luego simplemente llamar al método webBrowser1.Print();. He aquí una referencia de MSDN:

http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.print.aspx

Espero que esto ayude.

+0

Debe tener en cuenta que esto solo es compatible con el control WebBrowser de Windows Forms, no con el de WPF. – ygoe

1

Tal vez algo como:

webBrowser1.DocumentContent = YOUR_FILE_NAME; 
mshtml.IHTMLDocument2 doc = webBrowser1.Document as mshtml.IHTMLDocument2; 
doc.execCommand("Print", true, null); 
11
WebBrowser myWebBrowser = new WebBrowser(); 
     private void Form1_Load(object sender, EventArgs e) 
     { 
      myWebBrowser.DocumentCompleted += myWebBrowser_DocumentCompleted; 
      myWebBrowser.DocumentText =System .IO.File .ReadAllText (@"C:\a.htm"); 
     } 

     private void myWebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
     { 
      myWebBrowser.Print(); 
     } 
+0

¡Funciona como un encanto! –

+0

Este código es obviamente para Windows Forms en lugar de WPF. El control WPF WebBrowser no es compatible con esto (no se puede imprimir). – ygoe

4

Durante muchos años hemos utilizado el control WebBrowser .NET como se indica en otras respuestas, sin embargo, más recientemente, de que el control se ha vuelto más y más inestable. Incluso reconstruyendo la máquina que utilizamos para imprimir nuestras hojas de recogida en el almacén para ejecutar Windows 10, todavía tenemos problemas con páginas que simplemente nunca imprimen hasta que reiniciamos la computadora. El mismo código nos sirvió durante más de 4 años, pero ahora parece que las actualizaciones recientes de Microsoft han hecho que este control sea aún más complicado de lo que era en el pasado.

El otro problema importante es que no hay una forma fácil de imprimir en una impresora que no sea el predeterminado para Internet Explorer, por lo que si desea imprimir en diferentes impresoras, no tiene suerte con ese control.

Hace muchos años, escribimos una versión de nuestro código de impresión para las hojas de empaque utilizando C++ y la biblioteca QtWebKit. Entonces, para resolver estos problemas, desenterré la antigua aplicación C++ que imprimía archivos de páginas web y la convertí en este proyecto para imprimirla a través de la línea de comandos, y pude imprimirla en diferentes impresoras.

Puede obtener el código fuente desde aquí:

https://github.com/kendallb/PrintHtml

y se puede descargar un binario de 32 bits pre-compilado para Windows utilizando MinGW desde aquí:

https://github.com/kendallb/PrintHtml/blob/master/deploy/PrintHtml-window-x86.zip?raw=true

El código es completamente portátil, por lo que puede compilarlo fácilmente para ejecutarlo en macOS o Linux si lo desea desde el código fuente.

La línea de comandos es bastante fácil de usar y el uso es el siguiente:

Usage: PrintHtml [-test] [-p printer] [-l left] [-t top] [-r right] [-b bottom] <url> [url2] 

-test   - Don't print, just show what would have printed. 
-p printer - Printer to print to. Use 'Default' for default printer. 
-l left  - Optional left margin for page. 
-t top  - Optional top margin for page. 
-r right  - Optional right margin for page. 
-b bottom  - Optional bottom margin for page. 
url   - Defines the list of URLs to print, one after the other. 

evidentemente para esto desde una aplicación .NET que necesitará para desovar en la línea de comandos, pero que es bastante fácil que hacer. Suponiendo que el programa PrintHtml.exe se encuentra en el directorio bin para su aplicación o sitio web, puede ejecutarlo desde .NET, así:

public bool PrintHtmlPages(
    string printer, 
    List<string> urls) 
{ 
    try { 
     // Spawn the code to print the packing slips 
     var info = new ProcessStartInfo(); 
     info.Arguments = $"-p \"{printer}\" \"{string.Join("\" \"", urls)}\""; 
     var pathToExe = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
     info.FileName = Path.Combine(pathToExe, "PrintHtml.exe"); 
     using (var p = Process.Start(info)) { 
      // Wait until it is finished 
      while (!p.HasExited) { 
       Application.DoEvents(); 
       System.Threading.Thread.Sleep(10); 
      } 

      // Return the exit code 
      return p.ExitCode == 0; 
     } 
    } catch { 
     return false; 
    } 
} 

Enjoy!

+0

Para decir gracias, tengo que pasar un día para ganar +50 reputaciones: D. Me salvaste la vida. – huydq5000

Cuestiones relacionadas