You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

生成文本与二维码打印质量低下,调整图形设置无效求助

解决打印文本与二维码质量极差的问题

问题根源

你的代码先将所有内容绘制到中间Bitmap,再转绘到打印画布上,这会把矢量文本和二维码转换成低分辨率位图,导致打印时模糊失真;同时Bitmap的分辨率设置时机错误,打印画布的高质量渲染参数也未配置完全。

修复方案

直接在打印事件提供的e.Graphics上绘制内容,跳过中间Bitmap,同时配置打印画布的全量高质量参数,保留内容的矢量特性以获取最佳打印效果。

修改后的代码

private void doc_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
    // 配置打印画布的高质量渲染参数
    var printGraphics = e.Graphics;
    printGraphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
    printGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
    printGraphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
    printGraphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
    printGraphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;

    // 用using包裹字体,自动释放GDI+资源
    using (var font1 = new System.Drawing.Font("Tahoma", 35, FontStyle.Bold, GraphicsUnit.Point))
    using (var fontjob = new System.Drawing.Font("Tahoma", 20, FontStyle.Regular, GraphicsUnit.Point))
    {
        StringFormat stringFormat = new StringFormat();
        stringFormat.Alignment = StringAlignment.Center;

        // 绘制用户名
        Rectangle rectname = new Rectangle(100, 100, 363, 100);
        printGraphics.DrawString(user_name, font1, Brushes.Black, rectname, stringFormat);

        // 绘制职位标题
        Rectangle rectnjob = new Rectangle(100, 200, 363, 50);
        printGraphics.DrawString("JOB TITLE", fontjob, Brushes.Black, rectnjob, stringFormat);

        // 直接在打印画布上绘制二维码,避免中间位图缩放损失
        Zen.Barcode.CodeQrBarcodeDraw qrcode = Zen.Barcode.BarcodeDrawFactory.CodeQr;
        qrcode.Draw(printGraphics, barcode_token_key, new Rectangle(100, 300, 100, 100));
    }
}

关键改动说明

  • 移除中间Bitmap:直接在打印画布上绘制,保留文本和二维码的矢量特性,彻底避免位图转译的质量损失
  • 完善渲染参数:补充CompositingQuality并升级插值模式,确保全链路高质量渲染
  • 资源自动释放:用using管理字体资源,防止GDI+资源泄漏
  • 二维码直接输出:使用Draw重载直接绘制到打印画布,跳过中间图片生成与缩放步骤

额外优化建议

  • 确认打印机设置已调至最高分辨率(如300DPI)
  • 若必须使用中间Bitmap,需在创建时立即指定分辨率:
    Bitmap flag = new Bitmap(xwidth, xheight, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
    flag.SetResolution(300, 300);
    

原打印效果

内容的提问来源于stack exchange,提问作者Joe Jbr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 06:47:39