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

C# .NET打印时如何实现文本居中显示?

在C# .NET WinForm中实现打印文本居中显示的方法

嘿,我来帮你搞定这个打印文本居中的问题!你用的是VS2010和.NET4.0的WinForm项目对吧?其实核心是要在PrintDocument的PrintPage事件里做文章——毕竟打印的内容都是在这个事件里绘制的。下面给你两种实用的实现方式:

方法一:手动计算坐标实现居中

这种方式需要先算出文本的宽度,再结合打印页面的宽度推导居中的X坐标,步骤很清晰:

  1. 先给你的PrintDocument对象绑定PrintPage事件,这是绘制打印内容的核心入口;
  2. 完整的按钮点击事件和打印事件代码示例:
private void btn_Print_Click(object sender, EventArgs e)
{
    PrintDialog pd = new PrintDialog();
    PrintDocument pdoc = new PrintDocument();
    PrinterSettings ps = new PrinterSettings();
    PaperSize psize = new PaperSize("Custom", 100, 200);

    // 绑定PrintPage事件,用于绘制打印内容
    pdoc.PrintPage += Pdoc_PrintPage;

    pd.Document = pdoc;
    pd.Document.DefaultPageSettings.PaperSize = psize;

    if (pd.ShowDialog() == DialogResult.OK)
    {
        pdoc.Print();
    }
}

// 处理打印内容的事件方法
private void Pdoc_PrintPage(object sender, PrintPageEventArgs e)
{
    // 要打印的目标文本
    string printText = "这是需要居中显示的文本";
    // 自定义字体,可根据需求调整
    using (Font printFont = new Font("微软雅黑", 12))
    {
        // 计算文本的实际宽度
        float textWidth = e.Graphics.MeasureString(printText, printFont).Width;
        // 计算居中的X坐标:(页面总宽度 - 文本宽度) / 2
        float xPos = (e.PageBounds.Width - textWidth) / 2;
        // Y坐标可自行调整,这里设为50作为起始位置
        float yPos = 50;

        // 绘制居中文本
        e.Graphics.DrawString(printText, printFont, Brushes.Black, xPos, yPos);
    }
}

方法二:用StringFormat直接设置对齐

这种方式更简洁,直接通过StringFormat对象指定水平居中,代码修改起来更简单:

只需要替换上面的Pdoc_PrintPage方法即可:

private void Pdoc_PrintPage(object sender, PrintPageEventArgs e)
{
    string printText = "这是需要居中显示的文本";
    using (Font printFont = new Font("微软雅黑", 12))
    {
        // 创建格式对象,设置水平居中
        StringFormat sf = new StringFormat();
        sf.Alignment = StringAlignment.Center;

        // 定义打印区域矩形:宽度取页面总宽,Y从50开始,高度匹配字体高度
        RectangleF printArea = new RectangleF(0, 50, e.PageBounds.Width, printFont.GetHeight(e.Graphics));
        // 绘制时传入格式对象,文本会自动在矩形内居中
        e.Graphics.DrawString(printText, printFont, Brushes.Black, printArea, sf);
    }
}

小提醒

  • 记得用using语句包裹Font这类实现了IDisposable的对象,避免内存泄漏;
  • 如果需要考虑打印机的边距限制,可以把e.PageBounds换成e.MarginBounds,这样绘制的内容会自动避开打印机的不可打印区域,防止文本被裁剪。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:45:47