PDFsharp включает в себя класс XTextFormatter, который может использоваться для рисования текста с помощью разрывов строк.
Однако он не может определить высоту, необходимую для текста. Вдохновленный комментарием от @ Wakka02, я улучшил этот класс, создав класс XTextFormatterEx.
По-моему, это также отвечает на исходный вопрос, поэтому я отправляю ответ.
Я знаю, что это старый вопрос, и ответ может не помочь ОП, но это часто задаваемый вопрос, и ответ может помочь другим.
Новый класс имеет 500 строк кода - и я думаю, что это было бы слишком много для этого сообщения.
Исходный код можно найти на PDFsharp форуме:
http://forum.pdfsharp.net/viewtopic.php?p=9213#p9213
Это также можно найти в моем скромном блоге:
http://developer.th-soft.com/developer/pdfsharp-improving-the-xtextformatter-class-measuring-the-height-of-the-text/
При использовании нового класса, вы можете сначала позвонить PrepareDrawString
чтобы узнать, какая часть текста подходит и какая высота соответствует тексту. Затем ваш декодер может нарисовать подготовленный текст или подготовить другой текст или подготовить тот же текст с другим прямоугольником.
Мой новый класс на работе: XTextFormatterEx tf = new XTextFormatterEx (gfx); int lastCharIndex; double neededHeight;
// Draw the text in a box with the optimal height
// (magic: we know that one page is enough).
XRect rect = new XRect(40, 100, 250, double.MaxValue);
//tf.Alignment = ParagraphAlignment.Left;
tf.PrepareDrawString(text, font, rect,
out lastCharIndex, out neededHeight);
rect = new XRect(40, 100, 250, neededHeight);
gfx.DrawRectangle(XBrushes.SeaShell, rect);
// Both variants should look the same.
// Optimized version: draw the prepared string.
tf.DrawString(XBrushes.Black, XStringFormats.TopLeft);
Подготовка текста многократно вызывает MeasureString. Позже подготовленный текст можно рисовать без повторного вызова MeasureString.
На сегодняшний день (Juli 17, 2015) класс XTextFormatterEx (как и исходный XTextFormatter) использует внутренние поля класса XFont. Это требует специального лечения при компиляции класса. Я решил скопировать мой класс XTextFormatterEx в папку PDFsharp после загрузки полного исходного пакета для PDFsharp 1.32.
Любой, кто пытается изменить класс XTextFormatter или XTextFormatterEx, столкнется с той же проблемой.
Я надеюсь, что эта проблема будет решена с будущими версиями PDFsharp, позволяя включить модифицированные версии этих классов в проект приложения.
Это не похоже на ответ. MeasureString не принимает прямоугольник/ширину и поэтому не может знать нарисованную высоту - или я что-то пропустил? – noelicus
Используйте XGraphics.MeasureString, чтобы найти размеры одной строки текста. См. Класс XTextFormatter для кода, который автоматически разбивает строки (используя MeasureString()). Должно быть легко добавить новый метод XTextFormatter.MeasureString, который возвращает высоту. Обычно мы используем MigraDoc в нашем приложении, поэтому мы добавляем только текст в документ, а MigraDoc заботится о разрыве строк и разломах. –