如何在不使用Debian中的MVC控制器进行缩放的情况下打印位图

时间:2015-11-14 18:14:01

标签: asp.net-mvc bitmap mono system.drawing wkhtmltoimage

使用Mono中的以下代码将文档从MVC控制器打印到Debian Squeeze Linux服务器打印机。

打印机中的页面是A4。

纸张上的印刷文字太大而且不清晰。文本的最右边部分是不可见的,因为它不适合页面。

如果从Windows从.NET打印到HP Laserjet,则输出正确。

因此,看起来Mono或Samsung ML-331x系列打印机因未知原因缩放位图,导致输出过大且不清晰。

如何解决此问题,以便像在Windows中一样打印位图?

可能的解决方案:

  1. 最好的方法是直接打印格式化的html。如何在没有安装浏览器的服务器中执行此操作? wkhtmltopdf不支持打印。我将其发布在How to print formatted html in Linux server

  2. 也许可以使用wkhtmltopdf将html转换为pdf而不是位图我将其作为单独的问题发布在How to print pdf in debian linux from MVC controller

  3. wkhtmltoimage还可以生成其他图像格式。也许其他一些格式更好?

  4. 也许像--width=750--dpi这样的wkhtmltoimage命令行转换可以修复此问题吗?

  5. 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;
        }
    }
    

1 个答案:

答案 0 :(得分:0)

您可以使用EvoPdf提供的HTML to PDF Converter for Mono解决方案。用于在Mono中将HTML转换为PDF的C#代码是:

        // 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);