Pregunta

Quiero imprimir HTML desde un servicio web C#.El control del navegador web es excesivo y no funciona bien en un entorno de servicios ni en un sistema con restricciones de seguridad muy estrictas.¿Hay algún tipo de gratis? .NET ¿Biblioteca 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 de tipo UI, pero no sucede nada cuando se llama desde un subproceso de tipo servicio.Cambiando Print() a ShowPrintPreviewDialog() produce 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ío.

No hay solución correcta

Otros consejos

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

rundll32.exe%windir% system32 mshtml.dll, printhtml "%1"

Donde %1 es la ruta del archivo html que se va a imprimir.

Si no necesita imprimir desde la memoria (o puede permitirse el lujo de 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();
}

NÓTESE BIEN.Creo que esto sólo funciona en Windows 2000 y superiores.

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

Puede que valga la pena investigar eso.

De lo contrario, no se me ocurre nada más allá del control del navegador web.

¡Fácil!Divida su problema en dos partes más simples:

  1. renderizar 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

Si lo tienes en el presupuesto (~$3000), echa un vistazo PríncipeXML.

Representará HTML en un PDF, funciona bien en un entorno de servicios y admite funciones avanzadas como no dividir una página en medio de una celda de tabla (que muchos navegadores no admiten actualmente).

Tal vez esto ayude. http://www.codeproject.com/KB/printing/printhml.aspxTampoco estoy seguro desde qué hilo estás intentando 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.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top