繁体   English   中英

省略号或使用PDFsharp包装

[英]Ellipsis or wrapping with PDFsharp

有没有一种方法可以将DrawString限制为指定的矩形? 如果字符串不合适,我希望字符串被截断(最好用省略号“ ...”)。

从关于StackOverflow和试错法的其他问题中,我已经能够使PDFsharp包裹文本, 前提是它包含空白

var stringToPrint = "m m m m m m m m m m m m";
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 tf = new XTextFormatter(gfx);

gfx.DrawRectangle(XBrushes.Red, rect);
tf.DrawString(stringToPrint, font, XBrushes.Black, rect, topLeftStringFormat);

上面的代码有效,但是正如我所说,仅当字符串包含空格时。 在像var stringToPrint = "mmmmmmmmmmmm"; 它会写入整个字符串,并继续经过矩形外部的右侧边缘。

PDFsharp是开源的,因此总有一种方法。

XTextFormatter类是作为示例提供的,可以帮助您入门。 您可以更改该类以添加省略号或在其他字符处中断。

PDFsharp被创建为MigraDoc的工具。 如果您不想处理换行符和分页符,也许MigraDoc对您来说是一个更好的解决方案。 XTextFormatter类故意缺少您在MigraDoc中发现的许多功能。

我最终要做的是实现一种用于限制stringToPrint的长度的方法,以使其适合矩形内部。 我可以通过测量内容的宽度,然后一次截断一个字符直到适合为止来做到这一点。

private static string GetFittedStringToPrint(XGraphics gfx, XFont font, XRect rect, 
string input)
{
    var output = input;
    var stringMeasurement = gfx.MeasureString(input, font);
    if (stringMeasurement.Width > rect.Width)
    {
        var inputMinusOneChar = input;
        do
        {
            inputMinusOneChar = inputMinusOneChar.Substring(0, inputMinusOneChar.Length - 1).Trim();
            stringMeasurement = gfx.MeasureString(inputMinusOneChar + '…', font);
        } while (stringMeasurement.Width > rect.Width);
        output = inputMinusOneChar + '…';
    }
    return output;
}

对该方法的调用将是

stringToPrint = GetFittedStringToPrint(gfx, font, rect, stringToPrint);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM