PDFsharp include una classe XTextFormatter che può essere utilizzata per disegnare il testo con interruzioni di riga.
Tuttavia non è possibile determinare l'altezza necessaria per il testo. Ispirato da un commento di @ Wakka02 ho migliorato questa classe, generando la classe XTextFormatterEx.
A mio parere risponde anche alla domanda originale, quindi invio una risposta.
So che questa è una vecchia domanda e la risposta potrebbe non aiutare l'OP, ma è una domanda frequente e la risposta può aiutare gli altri.
La nuova classe ha 500 righe di codice - e penso che questo sarebbe troppo per questo post.
Il codice sorgente può essere trovato sul forum PDFsharp:
http://forum.pdfsharp.net/viewtopic.php?p=9213#p9213
Può anche essere trovato a mio modesto blog:
http://developer.th-soft.com/developer/pdfsharp-improving-the-xtextformatter-class-measuring-the-height-of-the-text/
Quando si utilizza la nuova classe, è possibile chiamare prima PrepareDrawString
per scoprire quanta parte del testo si adatta e quale altezza ha il testo di adattamento. Quindi il decodificatore può disegnare il testo preparato o preparare un altro testo o preparare lo stesso testo con un rettangolo diverso.
La mia nuova classe al lavoro: 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 preparazione del testo richiama MeasureString molte volte. Successivamente il testo preparato può essere disegnato senza richiamare MeasureString di nuovo.
A partire da oggi (17 luglio 2015) la classe XTextFormatterEx (come l'originale XTextFormatter) utilizza i campi interni della classe XFont. Ciò richiede un trattamento speciale durante la compilazione della classe. Ho deciso di copiare la mia classe XTextFormatterEx nella cartella PDFsharp dopo aver scaricato il pacchetto sorgente completo per PDFsharp 1.32.
Chiunque tenti di modificare la classe XTextFormatter o XTextFormatterEx dovrà affrontare lo stesso problema.
Spero che questo problema venga risolto con le versioni future di PDFsharp, consentendo l'inclusione di versioni modificate di queste classi nel progetto dell'applicazione.
Questa non sembra la risposta. MeasureString non prende il rect/width e quindi non può conoscere l'altezza disegnata - o ho perso qualcosa? – noelicus
Usa XGraphics.MeasureString per trovare le dimensioni di una singola riga di testo. Vedi la classe XTextFormatter per il codice che interrompe le linee automaticamente (usando MeasureString()). Dovrebbe essere facile aggiungere un nuovo metodo XTextFormatter.MeasureString che restituisce l'altezza. Normalmente utilizziamo MigraDoc nella nostra applicazione in modo da aggiungere solo del testo al documento e MigraDoc si prende cura dei linebreak e delle interruzioni di pagina. –