基于英寸打印矩形出现尺寸错误的问题排查
打印矩形尺寸与打印机DPI不匹配问题
我尝试基于打印机DPI按英寸打印矩形,在8.5×11英寸的纸张上,可打印区域宽度显示为850,但获取到的打印机DPI为600,这不符合预期。用英寸值乘以DPI计算出的矩形尺寸过大。
获取DPI的代码:
PrinterSettings.DefaultPageSettings.PrinterResolution.X;
返回结果为600。
相关代码片段:
PrintDataPage dp = PrintData[Pageno]; float yloc = Top; Rectangle Box = new(); PointF point; int dpi = prdc.PrinterSettings.DefaultPageSettings.PrinterResolution.X; // float pry = prdc.PrinterSettings.DefaultPageSettings.PrinterResolution.Y; int bFixWidth =(int) (dpi * 1.875f); int bFixHeight = (int)(dpi * .1875f);
问题原因及解决方法
混淆打印机物理分辨率与绘图上下文DPI
PrinterResolution.X获取的是打印机的物理分辨率,但.NET打印时,绘图用的Graphics对象默认使用显示DPI(通常96DPI),而非打印机物理DPI。直接用物理DPI计算尺寸,会让绘制元素被放大约6.25倍(600/96),导致矩形过大。正确获取绘图用DPI
必须在PrintPage事件中,从PrintPageEventArgs传入的Graphics对象获取实际绘图DPI:
private void printDocument1_PrintPage(object sender, PrintPageEventArgs e) { float dpiX = e.Graphics.DpiX; float dpiY = e.Graphics.DpiY; // 用绘图DPI计算目标尺寸 int bFixWidth = (int)(dpiX * 1.875f); int bFixHeight = (int)(dpiY * 0.1875f); // 执行绘制操作 e.Graphics.DrawRectangle(Pens.Black, new Rectangle(10, 10, bFixWidth, bFixHeight)); }
- 验证可打印区域的正确转换
可打印区域的原始单位是百分之一英寸,需用绘图DPI转换为像素:
// 获取纸张与边距设置 Margins margins = prdc.PrinterSettings.DefaultPageSettings.Margins; PaperSize paperSize = prdc.PrinterSettings.DefaultPageSettings.PaperSize; // 计算可打印区域的英寸值 float printableWidthInInches = (paperSize.Width - margins.Left - margins.Right) / 100f; float printableHeightInInches = (paperSize.Height - margins.Top - margins.Bottom) / 100f; // 转换为像素 float printableWidthInPixels = printableWidthInInches * e.Graphics.DpiX; float printableHeightInPixels = printableHeightInInches * e.Graphics.DpiY;
内容的提问来源于stack exchange,提问作者zapdbf
相关产品推荐
相关产品推荐

