c# - mandar - imprimir html con javascript
¿Cómo imprimo un documento HTML desde un servicio web? (7)
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
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 hilos de tipo UI, pero no sucede nada cuando se llama desde un hilo de tipo servicio.
Cambiar
Print()
a
ShowPrintPreviewDialog()
produce el siguiente error de script IE:
Error:
dialogArguments.___IE_PrintType
es nulo o no es un objeto.URL:
res://ieframe.dll/preview.dlg
Y aparece un pequeño diálogo de vista previa de impresión vacía.
¡Fácil! Divide tu problema en dos partes más simples:
- renderizar el HTML a PDF
- imprima 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
Mi herramienta que funciona muy bien para mí es HiQPdf. https://www.hiqpdf.com/
El precio es razonable (comienza en $ 245) y puede representar HTML en un PDF y también administrar la impresión de los archivos PDF directamente.
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 ...)
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 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();
}
Nota: creo que esto solo funciona en Windows 2000 y versiones posteriores.
Sé que Visual Studio en sí (al menos en la versión 2003) hace referencia a la 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.
Si lo tiene en el presupuesto (~ $ 3000), consulte PrinceXML .
Representará HTML en un PDF, funcionará 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 actualmente).
Tal vez esto ayude. http://www.codeproject.com/KB/printing/printhml.aspx Tampoco estoy seguro de desde qué hilo está intentando acceder al control del navegador, pero debe ser STA
Nota: el proyecto mencionado en el enlace le permite navegar a una página y realizar una impresión sin mostrar el diálogo de impresión.