PdfSharp: высота текста / проблема позиционирования - PullRequest
3 голосов
/ 27 августа 2009

Независимо от того, использую я XTextFormatter или нет, я получаю ту же ошибку о том, что LayoutRectangle должен иметь высоту 0 или что-то вроде этого.

new PdfSharp.Drawing.Layout.XTextFormatter(_gfx).DrawString(text 
    , new PdfSharp.Drawing.XFont(fontName, fontSize, (PdfSharp.Drawing.XFontStyle)fontStyle) 
    , new PdfSharp.Drawing.XSolidBrush(PdfSharp.Drawing.XColor.FromArgb(foreColour)) 
    , new PdfSharp.Drawing.XRect(new PdfSharp.Drawing.XPoint(xPos, yPos), new PdfSharp.Drawing.XPoint(xLimit, yLimit)) 
    , PdfSharp.Drawing.XStringFormats.Default);

fontStyle имеет тип System.Drawing.FontStyle foreColour имеет тип System.Drawing.Color Я уже предопределил _gfx из PdfPage с Ориентация = Пейзаж, Размер = Письмо xPos и yPos - это параметры типа double, то же самое с xLimit и yLimit .


Я получаю ошибку во время выполнения, что LayoutRectangle должен иметь высоту ноль (0) ...


По определению, прямоугольник должен иметь высоту, в противном случае назовите его линией! Я не понимаю! ...

Я пытался использовать метод XGraphics.DrawString () напрямую, и я получаю ту же ошибку. Кажется, что я не могу использовать LayoutRectangle, но должен управлять тем, чтобы текст помещался в нужной области вручную.

var textFont = new PdfSharp.Drawing.XFont(fontName, fontSize, (PdfSharp.Drawing.XFontStyle)fontStyle);

while (xPos + _gfx.MeasureString(text, textFont).Width > xLimit)
    textFont = new PdfSharp.Drawing.XFont(fontName, --fontSize, (PdfSharp.Drawing.XFontStyle)fontStyle);

while (yPos + _gfx.MeasureString(text, textFont).Height > yLimit && fontSize > 0)
    textFont = new PdfSharp.Drawing.XFont(fontName, --fontSize, (PdfSharp.Drawing.XFontStyle)fontStyle);

_gfx.DrawString(text
    , textFont
    , new PdfSharp.Drawing.XSolidBrush(PdfSharp.Drawing.XColor.FromArgb(foreColour))
    , new PdfSharp.Drawing.XPoint(xPos, yPos));

Хотя значение переменной yPos является точно таким же значением!

* yPos = Page.Height * .4093, либо 40,93% от высоты страницы. *

Приведу пример того, что я пытаюсь сделать:

"Привет, мир!" "Привет World! "

И вот что я получаю:

                      "Hello World!" 

«Привет, мир!»

И из-за разных пределов области печати и размера шрифта, а также из-за разного стиля шрифта я не могу просто написать их в одном простом предложении, включающем правильное количество пробелов.

Ответы [ 2 ]

8 голосов
/ 31 августа 2009

Цитирование сообщений об ошибках в точности помогает другим вам помочь.

Сообщение об ошибке гласит:

DrawString: С XLineAlignment.BaseLine высота прямоугольника макета должна быть 0.

Текст будет выровнен по линии, поэтому высота должна быть 0. Да, это линия. Используйте другое выравнивание, если вы указываете прямоугольник.

Пример TextLayout показывает, как форматировать текст.

Образец Graphics также показывает, как размещать текст (отдельные строки текста, автоматические разрывы строк отсутствуют; техника, показанная в примере TextLayout, обрабатывает разрывы строк автоматически с использованием класса XTextFormatter).

2 голосов
/ 31 августа 2009

Пытаясь выяснить, как позиционирование текста работает с PdfSharp, я заметил, что метод DrawString () записывает поверх указанной Y координаты.

Если я хочу написать в (0, 100) (x, y), это указывает на левый нижний угол, в то время как я думал, что это были координаты верхнего левого угла. В результате координата Y текстовой строки, которую я должен был указать, равна 100 + string.Height * .6.

PdfDocument pdfDoc = new PdfDocument();
PdfPage pdfPage = new pdfPage();
pdfPage.Size = PageSize.Letter;
pdfPage.Orientation = Orientation.Landscape;
pdfDoc.Pages.Add(pdfPage);

double posX = 0;
double posY = pdfPage.Height * .4093;
string helloString = "Hello"
string worldString = "World!"

XFont helloFont = new XFont("Helvetica", 25, XFontStyle.Regular);
XFont worldFont = new XFont("Helvetica", 270, XFontStyle.Bold);

using(var pdfGfx = XGraphics.FromPdfPage(pdfPage)) { // assuming the default Point UOM
    XSize helloStringSize = pdfGfx.MeasureString(helloString, helloFont);
    XSize worldStringSize = pdfGfx.MeasureString(worldString, worldFont);
pdfGfx.DrawString(helloString
    , helloFont
    , XBrushes.Black
    , posX
    , posY + helloStringSize.Height * .6
    , XStringFormats.Default);
pdfGfx.DrawString(worldString
    , worldFont
    , XBrushes.Black
    , pdfPage.Width * .3978
    , posY + (worldStringSize.Height + helloStringSize.Height) * .6
    , XStringFormats.Default);

}

Возможно, вы удивитесь, почему я добавляю только 60% размера строки, когда хочу, чтобы моя строка была написана ниже моей координаты Y? Это потому, что полная высота шрифта включает в себя некоторый скачок сверху. Таким образом, результат вычислений не будет таким, как ожидается. С другой стороны, вам не нужно заботиться о прыжке, если он вам нужен. В моем конкретном случае мне не требуется прыжок, поэтому я должен снять его с высоты струны.

Если вы чувствуете, что мое объяснение нуждается в более точных деталях, пожалуйста, не стесняйтесь добавлять их в качестве комментариев или держать меня в курсе, чтобы я мог включить их.

Спасибо!

...