asp.net-mvc bitmap mono system.drawing wkhtmltoimage

asp.net mvc - Cómo imprimir mapa de bits sin zoom desde el controlador MVC en Debian



asp.net-mvc bitmap (1)

Puede usar esta solución HTML to PDF Converter for Mono de EvoPdf. El código de C # para convertir un HTML a PDF en Mono es:

// create the HTML to PDF converter object HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter(serverIPAddress, serverPortNumber); // set service password if necessary if (serverPassword.Length > 0) htmlToPdfConverter.ServicePassword = serverPassword; // set PDF page size htmlToPdfConverter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4; // set PDF page orientation htmlToPdfConverter.PdfDocumentOptions.PdfPageOrientation = PdfPageOrientation.Portrait; // convert the HTML page from given URL to PDF in a buffer byte[] pdfBytes = htmlToPdfConverter.ConvertUrl(urlToConvert);

El documento se imprime desde el controlador MVC a la impresora del servidor Debian Squeeze Linux utilizando el código siguiente en Mono.

La página en la impresora es A4.

El texto impreso en papel es demasiado grande y poco claro. La parte más a la derecha del texto no es visible ya que no se ajusta a la página.

Si se imprime desde Windows desde .NET a HP Laserjet, la salida es correcta.

Por lo tanto, parece que las impresoras Mono o Samsung ML-331x Series amplían el mapa de bits por motivos desconocidos, lo que causa una producción demasiado grande y difusa.

¿Cómo arreglar esto para que el mapa de bits se imprima como en Windows?

Soluciones posibles:

  1. La mejor forma sería imprimir directamente html formateado. ¿Cómo hacerlo en un servidor donde no hay un navegador instalado? wkhtmltopdf no es compatible con la impresión. Lo publiqué en Cómo imprimir html formateado en un servidor Linux

  2. Tal vez sea posible usar wkhtmltopdf convertir html a pdf en lugar de bitmap Lo publiqué como pregunta separada en Cómo imprimir pdf en debian linux desde el controlador MVC

  3. wkhtmltoimage puede producir también otros formatos de imagen. Tal vez algún otro formato es mejor?

  4. Tal vez algunos swithches de línea de comandos wkhtmltoimage como --width=750 o --dpi pueden arreglar esto?

public class Test: Controller { public ActionResult Print() { PrintOrderVormiga(); return new ContentResult() { Content = "OK" }; } void PrintOrderVormiga() { StringBuilder sb = new StringBuilder(); sb.Insert(0, " test ", 500); var bmp = ConvertHtmlToBMP("<html><body>" +sb.Tostring()+ "</body></html>"); var doc = new PrintDocument(); doc.PrinterSettings.PrinterName = "Samsung ML-331x Series"; doc.PrintPage += new PrintPageEventHandler(ProvideContent); pageHeight = doc.DefaultPageSettings.PaperSize.Height; using (bm = new Bitmap(new MemoryStream(bmp))) { lehti = (int)Math.Ceiling(bm.Height / (double)pageHeight); doc.PrinterSettings.FromPage = 1; doc.PrinterSettings.ToPage = lehti; pageno = 0; doc.Print(); } } int pageno, lehti; int pageHeight; Bitmap bm; void ProvideContent(object sender, PrintPageEventArgs e) { Rectangle cropRect = new Rectangle(0, pageHeight * pageno++, bm.Width, pageHeight); Bitmap target = new Bitmap(cropRect.Width, cropRect.Height); e.Graphics.DrawImage(bm, new Rectangle(0, 0, target.Width, target.Height), cropRect, GraphicsUnit.Pixel); e.HasMorePages = pageno < lehti; } static byte[] ConvertHtmlToBMP(string html) { string programm = "wkhtmltoimage"; if (Environment.OSVersion.Platform != PlatformID.Win32NT) { programm = "wkhtmltoimage-amd64"; } var p = new Process { StartInfo = { CreateNoWindow = true, RedirectStandardOutput = true, RedirectStandardError = true, RedirectStandardInput = true, UseShellExecute = false, FileName = Environment.OSVersion.Platform == PlatformID.Win32NT ? "C://Program Files//wkhtmltopdf//bin//" + programm + ".exe" : "/usr/bin/" + programm } }; p.StartInfo.Arguments = "--format bmp --disable-javascript --quality 10"; p.StartInfo.Arguments += " - -"; p.Start(); using (var stream = p.StandardInput) { byte[] ibuffer = System.Text.Encoding.UTF8.GetBytes(html); stream.BaseStream.Write(ibuffer, 0, ibuffer.Length); stream.WriteLine(); } var buffer = new byte[32768]; byte[] file; using (var ms = new MemoryStream()) { while (true) { var read = p.StandardOutput.BaseStream.Read(buffer, 0, buffer.Length); if (read <= 0) { break; } ms.Write(buffer, 0, read); } file = ms.ToArray(); } p.WaitForExit(60000); var returnCode = p.ExitCode; p.Close(); return file; } }