用PDFsharp省略或包装

问题描述 投票:2回答:2

有没有办法将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";这样的字符串上,它会写出整个字符串并继续经过矩形外的右侧边缘。

c# pdfsharp
2个回答
0
投票

PDFsharp是开源的,所以总有办法。

XTextFormatter课程作为样本提供,以帮助您入门。您可以更改该类以添加省略号或中断其他字符。

PDFsharp是作为MigraDoc的工具创建的。如果您不想处理换行符和分页符,MigraDoc可能是更好的解决方案。 XTextFormatter类故意缺少你在MigraDoc中找到的很多功能。


0
投票

我最终做的是实现一种限制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);
© www.soinside.com 2019 - 2024. All rights reserved.