使用PrintDocument打印图片右侧被裁切,设无边距仍无效的解决方法
解决PrintDocument打印图片右侧裁切的问题
核心问题分析
你直接用e.Graphics.DrawImage(img, 0, 0)绘制图片时,忽略了两个关键限制:
- 多数打印机存在硬件最小边距限制,强制设置0边距不会生效,超出可打印区域的内容会被自动裁切
- 图片尺寸与纸张尺寸比例不匹配时,直接绘制会导致部分内容超出纸张范围
解决方案
1. 基于打印机实际可打印区域适配图片
修改PrintDocument_PrintPage方法的绘制逻辑,先获取打印机支持的可打印区域,再按比例缩放图片,确保内容完全落在区域内:
private void PrintDocument_PrintPage(object sender, PrintPageEventArgs e) { int savePage = iv.Image.Page; try { iv.Image.Page = _printPage; _printPage++; using (Image img = RasterImageConverter.ConvertToImage(iv.Image, ConvertToImageOptions.None)) { if (LeadToolsHelper.CanRunPrintPreview) { // 获取打印机实际可打印区域(已自动适配硬件边距限制) Rectangle printArea = e.MarginBounds; // 计算缩放比例,保持图片宽高比,避免拉伸变形 float scaleX = (float)printArea.Width / img.Width; float scaleY = (float)printArea.Height / img.Height; float scaleFactor = Math.Min(scaleX, scaleY); // 计算居中绘制的坐标(若不需要居中,可直接用printArea.Left/Top) int drawX = printArea.Left + (int)((printArea.Width - img.Width * scaleFactor) / 2); int drawY = printArea.Top + (int)((printArea.Height - img.Height * scaleFactor) / 2); // 绘制缩放后的图片 e.Graphics.DrawImage(img, drawX, drawY, (int)(img.Width * scaleFactor), (int)(img.Height * scaleFactor)); } } e.HasMorePages = _printPage <= iv.Image.PageCount; if (_printPage > iv.Image.PageCount) _printPage = 1; } finally { iv.Image.Page = savePage; } }
2. 确保纸张尺寸与图片匹配
如果图片是固定尺寸(比如A4),显式设置打印文档的纸张尺寸,避免打印机自动适配错误:
// 在初始化_printDocument时添加 _printDocument.DefaultPageSettings.PaperSize = new PaperSize(PaperName.A4, 827, 1169); // 注:参数单位为百分之一英寸,A4标准尺寸210mm×297mm对应827×1169
3. 边距设置的补充说明
不要强制设置0边距,因为大部分打印机不支持该操作。正确做法是使用e.MarginBounds获取打印机允许的最大可打印区域,该值已自动考虑硬件限制。
内容的提问来源于stack exchange,提问作者Arvo Bowen
相关产品推荐
相关产品推荐

