Отчеты PdfSharp, выровнять по ширине и разные стили в параграфе

Здравствуйте.
Делаю отчет в PdfSharp.
Вроде бы все просто… создал графикс и рисую в нем блоки стандартными методами. Но вот столкнулся с проблемкой.
Надо отобразить примерно такое:

то есть вначале заголовок например с одним стилем и размером. А дальше уже другим стилем. И притом чтобы этот абзац был выровнен например по ширине.

А команда

gfx.DrawString(text, font, XBrushes.Black, Rect, format);

Может рисовать текст только в заданном прямоугольнике. На уме только костыль чтобы нарисовать вначале в большом прямоугольнике текст с одним стилем, а затем в о второй текст вставить кучу пробелов и рисовать его в том же самом прямоугольнике?

Но может существует какой то более удобный вариант??

У XTextFormatter.Alignment вроде есть оно.

Так про форматтер то я знаю. Как в блоке нарисовать заголовок то другим стилем??

В общем с помощью расширения Migra можно добавлять блоки в виде параграфов аналогично RTF.

      internal static PdfDocument GenerateProtocol(BlockInfo printDialogResult)
        { 
            PdfDocument s_document = new PdfDocument();
            s_document.Info.Title = pat.Name;
            s_document.Info.Subject = pat.Name;

            PdfPage page = s_document.AddPage();
            page.Orientation = PdfSharp.PageOrientation.Portrait;

            XGraphics gfx = XGraphics.FromPdfPage(page );
            //gfx.ScaleTransform(0.95, 0.95);
            // HACK²
            gfx.MUH = PdfFontEncoding.Unicode;

            Document doc = new Document();
            Section sec = doc.AddSection();
            // Add a single paragraph with some text and format information.
            Paragraph para = sec.AddParagraph();
            para.Format.Alignment = ParagraphAlignment.Justify;
            para.Format.Font.Name = "Times New Roman";
            para.Format.Font.Size = 12;
            para.Format.Font.Color = Colors.Black;
            para.AddFormattedText("ЗАГОЛОВОК ТЕКСТА: ", TextFormat.Bold);
            para.AddText("А теперь представьте: у вас есть многостраничный документ, например годовой отчёт или дипломная работа. Вы находитесь на энной странице и видите факты, которые нужно перепроверить далее по тексту. Погружаться предстоит глубоко, поэтому номер текущего листа нужно где-то записать. Как возвратиться обратно без напоминалки?");

            // Create a renderer and prepare (=layout) the document
            DocumentRenderer docRenderer = new DocumentRenderer(doc);
            docRenderer.PrepareDocument();

            // Render the paragraph. You can render tables or shapes the same way.
            //docRenderer.RenderObject(gfx, XUnit.FromCentimeter(3), XUnit.FromCentimeter(2), XUnit.FromCentimeter(16.5), para);
            double A4Width = (int)XUnit.FromCentimeter(21).Point;
            double A4Height = (int)XUnit.FromCentimeter(29.7).Point;

            double width = page.Width;
            double height = page.Height;
            page.TrimMargins = new TrimMargins() { All = 0 };

            XRect A4Rect = new XRect(0, 0, A4Width, A4Height);
            int pageCount = docRenderer.FormattedDocument.PageCount;
            for (int idx = 0; idx < pageCount; idx++)
            {
                XRect rect = new XRect(0, 0, A4Width / 3 * 0.9, A4Height / 3 * 0.9);
                rect.X = (idx % 3) * A4Width / 3 + A4Width * 0.05 / 3;
                rect.Y = (idx / 3) * A4Height / 3 + A4Height * 0.05 / 3;

                XGraphicsContainer container = gfx.BeginContainer(A4Rect, A4Rect, XGraphicsUnit.Point);
                // Draw page border for better visual representation
                gfx.DrawRectangle(XPens.Black, A4Rect);

                // Render the page. Note that page numbers start with 1.
                docRenderer.RenderPage(gfx, idx + 1);

                // Note: The outline and the hyperlinks (table of content) does not work in the produced PDF document.

                // Pop the previous graphical state
                gfx.EndContainer(container);
            }
            return s_document;
        }

Да, они вроде и рекомендуют брать MigraDoc, когда не нужно каждый пиксель контролировать. http://www.pdfsharp.net/Overview.ashx

Если без него, то надо было бы много чего велосипедить для выравнивания по ширине, чтоб совпадали размеры после применения стилей. + просто считать символы не прокатит если шрифт не моноширинный.
Без выравнивания можно разбить это на слова, и отдельно выводить на нужной позиции, используя MeasureString.

Ну кто ж эти рекомендации читает без необходимости )))
Раньше для простого одностраничного отчета нормально хватало и обычного рендеринга. А сейчас понадобилось на 20 листов формировать и уже задумался. С мигрой конечно все удобно… она и на страницы режет документ сама… одно удовольствие работать.