Aquí podría ser tu PUBLICIDAD


¿Cómo imprimo un documento HTML desde un servicio web?

votos
68

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 .NETbiblioteca gratuita que admita la impresión de una página HTML básica? Aquí está el código que tengo hasta ahora, que no se ejecuta correctamente.

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 subprocesos tipo UI, pero no ocurre nada cuando se llama desde un subproceso de tipo servicio. Cambiando Print()para ShowPrintPreviewDialog()producir el siguiente error de script de IE:

Error: 'dialogArguments .___ IE_PrintType' es nulo o no es un objeto
URL: res: //ieframe.dll/preview.dlg

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

Publicado el 01/08/2008 a las 19:33
fuente por usuario Chris Marasti-Georg
En otros idiomas...        العربية       

6 respuestas

votos
29

Puede imprimir desde la línea de comando usando lo siguiente:

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

Donde% 1 es la ruta de archivo del archivo html que se imprimirá.

Si no necesita imprimir desde la memoria (o puede permitirse escribir en el disco en un archivo temporal), puede usar:

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

Respondida el 03/08/2008 a las 07:06
fuente por usuario ICR


Aquí podría ser tu PUBLICIDAD


votos
3

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

  1. hacer que el HTML a PDF
  2. imprimir el PDF ( SumatraPDF )
  • -print-to-default $file.pdf imprime un archivo PDF en una impresora predeterminada
  • -print-to $printer_name $file.pdf imprime un PDF en una impresora determinada
Respondida el 15/08/2012 a las 02:27
fuente por usuario Colonel Panic

votos
3

Si lo tienes en el presupuesto (~ $ 3000), echa un vistazo a PrinceXML .

Será representar HTML en un PDF, funciona bien en un entorno de servicio, y soporta características avanzadas tales como no romper una página en medio de una celda de tabla (la cual una gran cantidad de navegadores no admiten actualmente).

Respondida el 12/04/2010 a las 06:57
fuente por usuario user314783

votos
3

Sé que el propio 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.

Respondida el 02/08/2008 a las 01:42
fuente por usuario EndangeredMassa

votos
0

Tal vez esto ayude. http://www.codeproject.com/KB/printing/printhml.aspx También no estoy seguro de qué thread estás tratando de acceder al control del navegador, pero debe ser STA

Nota: El proyecto al que se hace referencia en el enlace le permite navegar a una página y realizar una impresión sin mostrar el cuadro de diálogo de impresión.

Respondida el 17/06/2009 a las 06:36
fuente por usuario NastyNateDoggy

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

Respondida el 20/09/2008 a las 06:37
fuente por usuario Greg Ogle