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

C# PrintDocument如何设置整体从右到左布局避免文字超出

解决方案

你遇到的问题根源是:右到左文本的绘制起始点设置错误,仅给字符串格式加方向标识未适配页面布局,导致文本从X=0位置向左渲染,直接超出页面左边界。按以下步骤修改即可:

1. 核心修改点说明

  • 不要固定绘制起始X坐标为0,右到左文本的绘制起始点应为页面可打印区域的右边界减去文本本身的宽度,保证文本从页面右侧开始向左排布不会溢出
  • 为PrintDocument的页面设置开启右到左布局属性
  • 补充GDI资源释放逻辑,避免内存泄漏

2. 修改后的完整代码

private void printDocument_PrintPage(object sender, PrintPageEventArgs e)
{
    e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
    // 用using包裹GDI资源,用完自动释放
    using (Font normalFont = new Font("B nazanin", 25))
    using (StringFormat format = new StringFormat(StringFormatFlags.DirectionRightToLeft))
    {
        // 设置文本对齐适配右到左
        format.Alignment = StringAlignment.Far;
        format.LineAlignment = StringAlignment.Near;
        
        // 获取页面可打印区域的边界
        float printWidth = e.PageSettings.PrintableArea.Width;
        float printHeight = e.PageSettings.PrintableArea.Height;
        
        // 绘制文本时使用可打印区域右边界作为X坐标,配合Far对齐自动右到左排版
        e.Graphics.DrawString("سلام", normalFont, Brushes.Black, printWidth, 0, format);
    }
}

private void btnPrint_Click(object sender, EventArgs e)
{
    try
    {
        // 给打印文档全局设置右到左布局
        printDocument.DefaultPageSettings.RightToLeft = RightToLeft.Yes;
        
        printPreviewDialog.Document = printDocument;
        pageSetupDialog.PageSettings = printDocument.DefaultPageSettings;
        if (pageSetupDialog.ShowDialog() == DialogResult.OK)
        {
            printDocument.DefaultPageSettings = pageSetupDialog.PageSettings;
            printPreviewDialog.ShowDialog();
        }
    }
    catch
    {
        MessageBox.Show("error");
    }
}

3. 补充说明

如果需要打印多段右到左文本,只需要复用上述计算逻辑,所有文本的X坐标都设置为printWidth,配合StringAlignment.Far对齐即可自动适配右到左排版,不会超出页面边界。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:06:01