我使用的打印机存在不可打印的边界,在使用 PrintPreviewDialog 时,发现总是忽略了不可打印边界,将打印内容放在最左上角。
检查代码,发现PrintDocument.DefaultPageSettings 存在不为0 的 HardMarginX HardMarginY 两个参数,但是在 PrintController.CreatePrintPageEvent(PageSettings pageSettings) 方法中计算 MarginBounds 时,未计入此两参数,造成此错误现象。
参见代码 PrintController.cs Line 153:
private PrintPageEventArgs CreatePrintPageEvent(PageSettings pageSettings) {
IntSecurity.AllPrintingAndUnmanagedCode.Assert();
Debug.Assert(modeHandle != IntPtr.Zero, "modeHandle is null. Someone must have forgot to call base.StartPrint");
Rectangle pageBounds = pageSettings.GetBounds(modeHandle);
Rectangle marginBounds = new Rectangle(pageSettings.Margins.Left,
pageSettings.Margins.Top,
pageBounds.Width - (pageSettings.Margins.Left + pageSettings.Margins.Right),
pageBounds.Height - (pageSettings.Margins.Top + pageSettings.Margins.Bottom));
PrintPageEventArgs pageEvent = new PrintPageEventArgs(null, marginBounds, pageBounds, pageSettings);
return pageEvent;
}
Charles