PrintControl刷新后打印边距丢失 如何强制设置固定打印边距
边距自动跳变问题修复方案
问题原因
- 你当前代码仅修改了
PrinterSettings.DefaultPageSettings下的边距配置,但打印预览和实际打印渲染时,读取的是PrintDocument实例自身DefaultPageSettings的配置,前者的设置不会自动同步到后者。 - 你调用的第三方打印栏控件的
loadDefaults()方法,会自动读取当前打印机的默认配置,直接覆盖你之前手动设置的边距值。初始加载时25.4mm是打印机默认的1英寸不可打印区域边距,刷新后跳变到5.08mm就是配置被覆盖导致的。 - 注意:
Margins构造函数的参数单位是1/100英寸,不是毫米,换算关系为1mm ≈ 3.94个Margins单位,比如25.4mm(1英寸)对应参数值100。
修复步骤
- 所有纸张尺寸、边距配置直接赋值给
printDocument1.DefaultPageSettings,不要通过PrinterSettings.DefaultPageSettings中转设置。 - 如果必须调用
loadDefaults()加载控件的其他默认配置,要在该方法执行完成后,重新覆盖边距配置,避免被控件重置。 - 兜底方案:绑定
printDocument1的BeginPrint事件,在每次预览、打印触发前强制写入固定边距,彻底杜绝其他逻辑篡改配置。
修复后代码参考
private void setupReport() { PaperSize ps = new PaperSize(); ps.RawKind = 9; // 对应A4纸张 // 直接给PrintDocument的页面配置赋值 printDocument1.DefaultPageSettings.PaperSize = ps; // 按需求设置固定边距,示例为四边25.4mm,需要其他尺寸自行换算参数即可 printDocument1.DefaultPageSettings.Margins = new Margins(100, 100, 100, 100); this.preview = new System.Windows.Forms.PrintPreviewControl(); this.preview.Dock = System.Windows.Forms.DockStyle.Fill; this.preview.Location = new System.Drawing.Point(3, 42); this.preview.Name = "printPreviewControl1"; this.preview.Size = new System.Drawing.Size(786, 362); this.preview.TabIndex = 2; this.preview.Document = this.printDocument1; this.ucPrintBar1.PreviewControl = this.preview; this.tabPage3.Controls.Add(this.preview); this.ucPrintBar1.loadDefaults(); // 控件加载默认配置后,重新强制写入固定边距 printDocument1.DefaultPageSettings.Margins = new Margins(100, 100, 100, 100); // 刷新预览生效 this.preview.InvalidatePreview(); } // 绑定到printDocument1的BeginPrint事件,兜底锁死边距 private void printDocument1_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e) { if (sender is PrintDocument doc) { doc.DefaultPageSettings.Margins = new Margins(100, 100, 100, 100); } }
问题效果对比
- 刷新前边距正常状态:

- 刷新后边距异常状态:

内容的提问来源于stack exchange,提问作者Molnar Istvan
相关产品推荐
相关产品推荐

