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

如何让PDFsharp的DrawString限制在指定矩形内,超出时截断并显示省略号?

解决PDFsharp中无空格长文本超出矩形并添加省略号的问题

这个确实是PDFsharp里XTextFormatter的一个默认局限——它只会基于空格来换行或截断文本,碰到没有空格的长串字符就会直接超出矩形范围。要实现无论是否有空格都能在矩形内截断并显示省略号,我们可以手动处理文本的截断逻辑,步骤如下:

核心思路

  1. 先测量原始文本的宽度,判断是否超出目标矩形的宽度;
  2. 如果超出,逐步截断文本内容,同时测量截断后的文本宽度(还要预留省略号的宽度);
  3. 当截断后的文本+省略号的宽度刚好小于等于矩形宽度时,停止截断,拼接省略号后再绘制。

完整代码示例

var stringToPrint = "mmmmmmmmmmmm";
var font = new XFont("Arial", 12);
var gfx = XGraphics.FromPdfPage(page); // 假设你已经初始化了gfx和page对象

// 定义目标显示矩形
var temp = gfx.MeasureString(stringToPrint, font);
var rect = new XRect(
    new XPoint(leftMargin + leftPush, topMargin + topPush),
    new XPoint(leftMargin + page.Width / 2, topMargin + temp.Height)
);
var topLeftStringFormat = new XStringFormat { Alignment = XStringAlignment.Near, LineAlignment = XLineAlignment.Near };

// 绘制红色边框方便查看矩形范围
gfx.DrawRectangle(XBrushes.Red, rect);

// 处理文本截断逻辑
var truncatedText = stringToPrint;
var ellipsis = "...";
var ellipsisWidth = gfx.MeasureString(ellipsis, font).Width;

// 检查原始文本是否超出矩形宽度
if (gfx.MeasureString(truncatedText, font).Width > rect.Width)
{
    // 逐步截断文本,直到加上省略号后能放入矩形
    while (truncatedText.Length > 0)
    {
        truncatedText = truncatedText.Substring(0, truncatedText.Length - 1);
        var currentWidth = gfx.MeasureString(truncatedText + ellipsis, font).Width;
        if (currentWidth <= rect.Width)
        {
            truncatedText += ellipsis;
            break;
        }
    }
    // 极端情况:单个字符+省略号都超出,只保留省略号(可根据需求调整)
    if (truncatedText.Length == 0)
    {
        truncatedText = ellipsis;
    }
}

// 绘制处理后的文本
var tf = new XTextFormatter(gfx);
tf.DrawString(truncatedText, font, XBrushes.Black, rect, topLeftStringFormat);

关键细节说明

  • 单独测量省略号的宽度,避免截断后的文本加省略号仍超出矩形;
  • 循环截断时每次去掉最后一个字符,逻辑简单直接,适合大多数场景;
  • 针对极端小矩形做了兜底处理,你可以根据实际需求调整这部分逻辑;
  • 如果需要支持多行文本截断,可以先按换行拆分内容,再对每行执行类似的截断操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:53:20