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
相关产品推荐
相关产品推荐

