PDFsharp incluye una clase XTextFormatter que se puede utilizar para dibujar texto con saltos de línea.
Sin embargo, no puede determinar la altura necesaria para el texto. Inspirado por un comentario de @ Wakka02, mejoré esta clase, generando la clase XTextFormatterEx.
En mi opinión, también responde la pregunta original, por lo tanto, publico una respuesta.
Sé que esta es una pregunta antigua y la respuesta puede no ayudar al OP, pero es una pregunta frecuente y la respuesta puede ayudar a otros.
La nueva clase tiene 500 líneas de código, y creo que esto sería demasiado para esta publicación.
El código fuente se puede encontrar en el foro PDFsharp:
http://forum.pdfsharp.net/viewtopic.php?p=9213#p9213
También se puede encontrar en mi humilde blog:
http://developer.th-soft.com/developer/pdfsharp-improving-the-xtextformatter-class-measuring-the-height-of-the-text/
Al utilizar la nueva clase, primero se puede llamar PrepareDrawString
para averiguar cuánto del texto cabe y qué altura tiene el texto apropiado. Entonces su decodificador puede dibujar el texto preparado o preparar otro texto o preparar el mismo texto con un rectángulo diferente.
Mi nueva clase en el trabajo: 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);
La preparación del texto invoca MeasureString muchas veces. Más tarde, el texto preparado se puede dibujar sin invocar MeasureString nuevamente.
A partir de hoy (17 de julio de 2015), la clase XTextFormatterEx (como el original XTextFormatter) utiliza campos internos de la clase XFont. Esto requiere un tratamiento especial al compilar la clase. Decidí copiar mi clase XTextFormatterEx en la carpeta PDFsharp después de descargar el paquete fuente completo para PDFsharp 1.32.
Cualquiera que intente modificar la clase XTextFormatter o XTextFormatterEx tendrá el mismo problema.
Espero que este problema se resuelva con versiones futuras de PDFsharp, lo que permite incluir versiones modificadas de estas clases en el proyecto de la aplicación.
Esto no parece ser la respuesta. MeasureString no toma rect/width y por lo tanto no puede saber la altura dibujada, ¿o me he perdido algo? – noelicus
Utilice XGraphics.MeasureString para buscar las dimensiones de una sola línea de texto. Consulte la clase XTextFormatter para ver el código que divide líneas automáticamente (usando MeasureString()). Debería ser fácil agregar un nuevo método XTextFormatter.MeasureString que devuelve la altura. Normalmente utilizamos MigraDoc en nuestra aplicación, por lo que solo agregamos texto al documento y MigraDoc se preocupa por los saltos de línea y saltos de página. –