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

如何检测指定字体下一行可打印的字符数

解决思路

因为你用的是等宽字体(Lucida Console),每个字符宽度一致,可通过以下步骤计算单行可打印的最大字符数:

  • 第一步:获取打印区域的可用宽度,直接调用PrintPageEventArgs的MarginBounds.Width属性,这是去除页面边距后的实际可打印宽度。
  • 第二步:计算单个字符的实际宽度,用Graphics.MeasureString方法传入单个测试字符(比如"A")和目标字体,得到该字符在打印上下文里的准确宽度。
  • 第三步:用可用宽度除以单个字符宽度,向下取整得到单行能容纳的最大字符数(确保不会超出打印边界)。

修改后的代码示例:

private static void pr__PrintPage(object sender, PrintPageEventArgs e)
{
    var font = new Font("Lucida Console", 10);
    
    // 计算单个字符的打印宽度
    char testChar = 'A';
    float charWidth = e.Graphics.MeasureString(testChar.ToString(), font).Width;
    
    // 获取去除边距后的可打印宽度
    float availableWidth = e.MarginBounds.Width;
    
    // 计算单行最大字符数,向下取整避免超出边界
    int number_or_characters = (int)Math.Floor(availableWidth / charWidth);
    
    // 可选:为规避字体渲染的微小误差,可适当减1
    // number_or_characters = Math.Max(0, number_or_characters - 1);
    
    var text = new string('A', number_or_characters);
    e.Graphics.DrawString(text, font, new SolidBrush(Color.Black), 0, 0);
}

补充说明:

  • 如果使用非等宽字体,需要循环累加字符宽度直到接近可用宽度,但你的场景是等宽字体,上述方法足够高效准确。
  • MeasureString会自动适配当前Graphics的打印上下文(如DPI、单位),无需额外做单位转换。

内容的提问来源于stack exchange,提问作者pedroPG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:30:49