如何打印无位变焦从Debian的MVC控制器 [英] How to print bitmap without zoom from MVC controller in Debian

查看:263
本文介绍了如何打印无位变焦从Debian的MVC控制器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在单用下面code

文件从MVC控制器打印到Debian的挤压Linux服务器的打印机。

页打印机为A4。

在纸上打印文本过于庞大,不清晰。文本的最右边的部分是不可见的,因为它不适合于页

如果从Windows打印从.NET中的HP LaserJet,输出是正确的。

因此​​,它看起来像单声道或三星ML-331x系列打印机放大位图由于未知原因,导致过大和不清晰的输出。

如何使位图在Windows打印像解决这个问题?

可能的解决方案:


  1. 最好的办法是直接打印格式的HTML。没有安装任何浏览器的地方怎么办呢服务器? wkhtmltopdf不支持打印。我张贴在如何打印在Linux服务器上的HTML格式


  2. 也许可以使用HTML wkhtmltopdf转换为PDF格式,而不是位图我张贴在<一个单独的问题href=\"http://stackoverflow.com/questions/33712356/how-to-print-pdf-in-debian-linux-from-mvc-controller\">How打印PDF从MVC控制器的Debian Linux的


  3. wkhtmltoimage可以还生产其他图像格式。也许一些其他的格式比较好?


  4. 也许有些wkhtmltoimage命令行swithches像 - 宽度= 750 - DPI 可以修复此?


 公共类测试:控制器
{
    公众的ActionResult打印()
    {
        PrintOrderVormiga();
        返回新ContentResult类型(){CONTENT =OK};
    }    无效PrintOrderVormiga()
    {
        StringBuilder的SB =新的StringBuilder();
        sb.Insert(0,测试,500);
        VAR BMP = ConvertHtmlToBMP(&LT; HTML和GT;&LT;身体GT;+ sb.Tostring()+&LT; /身体GT;&LT; / HTML&gt;中);
        VAR DOC =新的PrintDocument();
        doc.PrinterSettings.PrinterName =三星ML-331x系列;
        doc.PrintPage + =新PrintPageEventHandler(ProvideContent);
        pageHeight = doc.DefaultPageSettings.PaperSize.Height;
        使用(BM =新位图(新的MemoryStream(BMP)))
        {
            lehti =(INT)Math.Ceiling(bm.Height /(双)pageHeight);
            doc.PrinterSettings.FromPage = 1;
            doc.PrinterSettings.ToPage = lehti;
            帮您做生意= 0;
            doc.Print();
        }
    }    INT帮您做生意,lehti;
    INT pageHeight;
    位图BM;    无效ProvideContent(对象发件人,PrintPageEventArgs E)
    {
        矩形CRO preCT =新的Rectangle(0,pageHeight *帮您做生意++,
            bm.Width,pageHeight);
        位图的目标=新位图(CRO prect.Width,CRO prect.Height);
        e.Graphics.DrawImage(BM,新的Rectangle(0,0,target.Width,target.Height)
                       CRO $ P $厘,
                       GraphicsUnit.Pixel);
        e.HasMorePages =帮您做生意&LT; lehti;
    }    静态的byte [] ConvertHtmlToBMP(字符串HTML)
    {
        字符串PROGRAMM =wkhtmltoimage;
        如果(Environment.OSVersion.Platform!= PlatformID.Win32NT)
        {
            PROGRAMM =wkhtmltoimage-AMD64技术;
        }        VAR P =新工艺
        {
            StartInfo的=
            {
                CreateNoWindow = TRUE,
                RedirectStandardOutput = TRUE,
                RedirectStandardError = TRUE,
                RedirectStandardInput = TRUE,
                UseShellExecute =假,
                文件名= Environment.OSVersion.Platform == PlatformID.Win32NT?
                C:\\\\ Program Files文件\\\\ \\\\ wkhtmltopdf斌\\\\+ PROGRAMM +名为.exe:在/ usr /斌/+ PROGRAMM
            }
        };        p.StartInfo.Arguments =--format BMP --disable的JavaScript - 质量10;
        p.StartInfo.Arguments + = - - ;
        p.Start();
        使用(VAR流= p.StandardInput)
        {
            字节[] = ibuffer System.Text.Encoding.UTF8.GetBytes(HTML);
            stream.BaseStream.Write(ibuffer,0,ibuffer.Length);
            stream.WriteLine();
        }        VAR缓冲=新的字节[32768]
        字节[]的文件;        使用(VAR毫秒=新的MemoryStream())
        {
            而(真)
            {
                变种读取= p.StandardOutput.BaseStream.Read(缓冲液,0,buffer.Length);
                如果(读&LT; = 0)
                {
                    打破;
                }
                ms.Write(缓冲,0,读);
            }
            文件= ms.ToArray();
        }        p.WaitForExit(60000);
        VAR回报code = p.Exit code;
        p.Close();
        返回文件;
    }
}


解决方案

您可以使用此的 HTML到PDF转换从EvoPdf单的解决方案。在C#code在单一个HTML转换为PDF格式为:

  //创建HTML PDF转换对象
        HtmlToPdfConverter htmlToPdfConverter =新HtmlToPdfConverter(serverIPAddress,serverPortNumber);        //设置服务密码,如果有必要
        如果(serverPassword.Length大于0)
            htmlToPdfConverter.ServicePassword = SERVERPASSWORD;        //设置PDF页面大小
        htmlToPdfConverter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4;        //设置PDF页面方向
        htmlToPdfConverter.PdfDocumentOptions.PdfPageOrientation = PdfPageOrientation.Portrait;        // HTML页面从给定的URL转换为PDF在缓冲区
        字节[] = pdfBytes htmlToPdfConverter.ConvertUrl(urlToConvert);

Document is printed from MVC controller to Debian Squeeze Linux server printer using code below in Mono.

Page in printer is A4.

Printed text in paper is too big and unsharp. Rightmost part of text is not visible since it does not fit to page.

If printed from Windows from .NET to HP Laserjet, output is correct.

So it looks like Mono or Samsung ML-331x Series printer zooms bitmap for unknown reason which causes too big and unsharp output.

How to fix this so that bitmap is printed like in windows ?

Possible solutions:

  1. Best way would be to print formatted html directly. How to do it in server where there are no browser installed? wkhtmltopdf does not support printing. I posted it in How to print formatted html in Linux server

  2. Maybe it is possible to use wkhtmltopdf convert html to pdf instead of bitmap I posted it as separate question in How to print pdf in debian linux from MVC controller

  3. wkhtmltoimage can produce also other image formats. Maybe some other format is better ?

  4. Maybe some wkhtmltoimage command line swithches like --width=750 or --dpi can fix this ?

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

解决方案

You can use this HTML to PDF Converter for Mono solution from EvoPdf. The C# code for converting a HTML to PDF in Mono is:

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

这篇关于如何打印无位变焦从Debian的MVC控制器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆