-1

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

打印机中的页面为 A4。

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

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

所以看起来 Mono 或三星 ML-331x 系列打印机由于未知原因缩放位图,导致输出太大且不清晰。

如何解决这个问题,以便像在 windows 中一样打印位图?

可能的解决方案:

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

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

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

  4. 也许一些 wkhtmltoimage 命令行开关喜欢--width=750--dpi可以解决这个问题?

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

1 回答 1

0

您可以使用此HTML to PDF Converter for Mono解决方案从 EvoPdf。在 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);
于 2016-07-08T17:58:49.803 回答