Многоточие или обтекание с помощью PDFsharp - PullRequest
0 голосов
/ 19 февраля 2019

Есть ли способ ограничить 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"; она записывает всю строку и продолжается за правым краем за пределами прямоугольника.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

В итоге я реализовал метод ограничения длины 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);
0 голосов
/ 19 февраля 2019

PDFsharp с открытым исходным кодом, поэтому всегда есть способ.

Класс XTextFormatter предоставляется в качестве примера для начала работы.Вы можете изменить этот класс, чтобы добавить многоточие или разбить на другие символы.

PDFsharp был создан как инструмент для MigraDoc.Может быть, MigraDoc - лучшее решение для вас, если вы не хотите иметь дело с разрывами строк и разрывами страниц.Классу XTextFormatter намеренно не хватает многих функций, которые вы найдете в MigraDoc.

...