You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于英寸打印矩形出现尺寸错误的问题排查

打印矩形尺寸与打印机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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 01:55:17