Search code examples
c#consoletextblockadobe-indesign

Determining height of a block of text in a console application


I'm trying to determine the size of the textframe that will be needed for a block of text. This is to then be exported for an InDesign script to create the page. All in a console application.

I've tried to create a WPF TextBlock and assign the Text and a Width, but the Height and ActualHeight is NaN.

How can I determine the size of a textframe that will be needed for some text? Is using a WPF / Winforms textblock the best solution (to try and take advantage of existing code), or is there some other, better workflow?


Solution

  • There are two classes in C# that are used to draw text. TextRenderer and Graphics.

    TextRenderer uses GDI to render the text, whereas Graphics uses GDI+. The two use a slightly different method for laying out text.

    You can make use of Graphics.MeasureString or TextRenderer.MeasureText

    Example

    using( Graphics g = Graphics.FromHwnd(IntPtr.Zero) )
    {
         SizeF size = g.MeasureString("some text", SystemFonts.DefaultFont);
    }
    

    For your case I would suggest using TextRenderer. Text wrapping example -

    var size = TextRenderer.MeasureText(text, font, new Size(width, height), TextFormatFlags.WordBreak);
    

    The third argument is size of the drawing rectangle. You can pass height as 0 if you don't know it.