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

C#打印含标签、条码、DataGridView的UserControl到纸张模糊,转PDF清晰

解决UserControl打印到纸张模糊的问题

问题原因

你当前代码依赖control.CreateGraphics()获取屏幕级别的Graphics对象,生成的Bitmap分辨率和屏幕一致(通常96DPI),但打印机的分辨率远高于屏幕(多为300DPI及以上),低分辨率Bitmap直接打印会被拉伸放大,导致画面模糊。而PDF打印时会自动适配高分辨率渲染,所以显示清晰。

修复方案

核心思路是基于打印机分辨率生成高清晰度Bitmap,并按比例缩放UserControl的绘制内容,确保打印时匹配打印机的输出精度。

修改后的代码:

{
    var pd = new PrintDocument();
    // 获取打印机的实际分辨率
    int printDpiX = pd.DefaultPageSettings.PrinterResolution.X;
    int printDpiY = pd.DefaultPageSettings.PrinterResolution.Y;

    // 获取屏幕DPI(适配高DPI屏幕)
    using (Graphics screenG = control.CreateGraphics())
    {
        float scaleX = printDpiX / screenG.DpiX;
        float scaleY = printDpiY / screenG.DpiY;

        // 生成对应打印机分辨率的Bitmap
        var bitmap = new Bitmap((int)(control.Width * scaleX), (int)(control.Height * scaleY));
        bitmap.SetResolution(printDpiX, printDpiY);

        // 缩放Graphics后绘制UserControl
        using (Graphics bitmapG = Graphics.FromImage(bitmap))
        {
            bitmapG.ScaleTransform(scaleX, scaleY);
            control.DrawToBitmap(bitmap, new Rectangle(0, 0, control.Width, control.Height));
        }

        pd.PrintPage += (s, e) => 
        {
            // 按Bitmap原始尺寸绘制,避免拉伸模糊
            e.Graphics.DrawImage(bitmap, 0, 0);
        };
    }

    PaperSize ps = new PaperSize();
    ps.RawKind = (int)PaperKind.A4;
    pd.DefaultPageSettings.PaperSize = ps;
    pd.DefaultPageSettings.Landscape = false;
    
    pd.Print();
}

关键优化点

  • 用打印机的实际分辨率替代屏幕分辨率生成Bitmap,保证打印精度匹配
  • 通过屏幕DPI和打印机DPI的比例缩放绘制内容,避免控件元素变形
  • 使用using语句包裹Graphics对象,确保资源及时释放,避免内存泄漏

内容的提问来源于stack exchange,提问作者Krisztián Szőllősi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 05:03:21