Work at SourceForge, help us to make it a better place! We have an immediate need for a Support Technician in our San Francisco or Denver office.

Close

Text Leading

Help
James
2012-09-18
2013-01-26
  • James
    James
    2012-09-18

    I'm not sure if Text Leading does not work or if I am misinterpreting how to use it.  I have tried something like this:

                composer.SetFont(bodyFont, 10);
                composer.SetTextLead(40);
                blockComposer.ShowText("Text paragraph 1...several lines of wrapped text");
                SizeF breakSize = new SizeF(0, 15); // Indentation (0pt) and top margin (15pt).
                blockComposer.ShowBreak(breakSize);
                blockComposer.ShowText("Text paragraph 2...several lines of wrapped text");
                blockComposer.End();
                composer.End();
    

    But no matter what value I put into composer.SetTextLead(##); the line spacing is always the same (auto according to font size).

    Any suggestions?

     
  • Short answer: PrimitiveComposer.SetTextLead(…) is a relic you should currently ignore (I'm going to decide about its suppression/enhancement in the upcoming 0.1.2 release) - use BlockComposer.LineSpace property instead (see the explanation below).

    Comprehensive answer: in PDF format, some text parameters are "weak", somewhat like non-mandatory hints: they are typically applied only when particular circumstances occur (for example, word spacing is applied only to the occurrences of single-byte character code 32 (ASCII space), thus ignoring any space character differently mapped!). The same principle applies to the text leading, which works only when certain text-positioning operators are used; as a matter of fact, those operators are currently not used by PrimitiveComposer as they are considered redundant (it works with absolute positioning operators). Nonetheless, I may add ShowTextLine(…) methods to fill the gap.

    As I mentioned above, BlockComposer.LineSpace property is the way to go for interline spacing. But… what's the difference between LineSpace and SetTextLead()?

    Well, let's recap some concepts: text line height is composed by content height and interline space.
    The traditional typographic concept of text leading (vertical distance between the baselines of adjacent lines of text) is related to text line height; it's quite clumsy, as it forces a fix distance without considering the actual height of its contents. On the other hand, interline spacing ensures the isolation of content height avoiding any potential overlap; this is the technique adopted by modern typographic descriptors like CSS.

    PDF Clown's BlockComposer adopts the latter approach but, differently from CSS, it applies full-top leading instead of half-top/bottom leading. Here it is an example (note the adaptation to multiple font sizes):

    You can see BlockComposer.LineSpace property in action in GraphicsSample (included in the downloadable distribution).
    Stefano