如何让PDFsharp的DrawString限制在指定矩形内,超出时截断并显示省略号?
解决PDFsharp中无空格长文本超出矩形并添加省略号的问题
这个确实是PDFsharp里XTextFormatter的一个默认局限——它只会基于空格来换行或截断文本,碰到没有空格的长串字符就会直接超出矩形范围。要实现无论是否有空格都能在矩形内截断并显示省略号,我们可以手动处理文本的截断逻辑,步骤如下:
核心思路
- 先测量原始文本的宽度,判断是否超出目标矩形的宽度;
- 如果超出,逐步截断文本内容,同时测量截断后的文本宽度(还要预留省略号的宽度);
- 当截断后的文本+省略号的宽度刚好小于等于矩形宽度时,停止截断,拼接省略号后再绘制。
完整代码示例
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
相关产品推荐
相关产品推荐

