2008-08-01 13 views
66

Quiero imprimir HTML desde un servicio web C#. El control del navegador web es excesivo, y no funciona bien en un entorno de servicio, ni funciona bien en un sistema con restricciones de seguridad muy estrictas. ¿Hay algún tipo de biblioteca .NET que sea compatible con la impresión de una página HTML básica? Aquí está el código que tengo hasta ahora, que no se ejecuta correctamente.¿Cómo imprimo un documento HTML desde un servicio web?

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

Esto funciona bien cuando se llama desde roscas tipo de interfaz de usuario, pero no pasa nada cuando se llama desde un hilo de tipo de servicio. Cambiando Print() a ShowPrintPreviewDialog() produce el siguiente error de script IE:

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

y aparece un pequeño diálogo de vista previa de impresión vacío.

+0

Por favor, seleccione la mejor respuesta, gracias. – mruanova

+0

@mruanova Ninguna de las respuestas funcionó la última vez que las probé. Si tiene algo que funciona, háganoslo saber. –

Respuesta

3

Sé que el mismo Visual Studio (al menos en la versión de 2003) hace referencia al dll de IE directamente para representar la "Vista de diseño".

Puede valer la pena investigar eso.

De lo contrario, no puedo pensar en nada más allá del control del navegador web.

28

Puede imprimir desde la línea de comandos utilizando la siguiente:

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

donde% 1 es la ruta del archivo del archivo HTML que desea imprimir.

Si no necesita imprimir desde la memoria (o puede permitirse el lujo de escribir en el disco en un archivo temporal) que puede utilizar:

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. Esto solo funciona en Windows 2000 y más arriba, creo.

+0

Excelente respuesta: la iba a marcar como aceptada y ejecuté mi prueba. Parece que dll aún aparece el cuadro de diálogo Imprimir, y como esto se debe ejecutar como un Servicio de Windows desatendido, debemos omitirlo de alguna manera. Agoté bastante a Google, y estoy en mi ingenio. –

+0

Desafortunadamente, aparece el cuadro de diálogo de la impresora. Probé en Windows 7 x64. – LukTar

-1

No conozco las herramientas específicas, pero hay algunas utilidades que registran/reproducen clics. En otras palabras, puede automatizar el "clic" en el diálogo de impresión. (Sé que esto es un truco, pero cuando todo lo demás falla ...)

0

Quizás esto ayude. http://www.codeproject.com/KB/printing/printhml.aspx Además, no es seguro de qué hilo que está intentando acceder al control del explorador de, pero que tiene que ser STA

Nota - El proyecto mencionado en el enlace no le permiten navegar a una página y realizar una impresión sin mostrar el cuadro de diálogo de impresión.

3

Si lo tiene en el presupuesto (~ $ 3000), consulte PrinceXML.

Hará HTML en un PDF, funciona bien en un entorno de servicio y admite funciones avanzadas como no romper una página en el medio de una celda de tabla (que muchos navegadores no admiten en la actualidad).

3

¡Fácil! Dividir el problema en dos partes más simples:

  1. render the HTML to PDF
  2. imprimir el 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

La última vez que revisé, la parte 2 (imprimir a través de la línea de comandos con Adobe) no funciona en un servicio; requiere la interacción del usuario. –

+1

Pruebe Sumatra PDF, es mucho más rápido http://blog.kowalczyk.info/software/sumatrapdf/manual.html#manual-cmd-line –

Cuestiones relacionadas