2009-08-27 2 views
2

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

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, то же самое с xLi mit и 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% от высоты страницы *

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

«Hello World !» «Привет Мир!»

И вот что я получаю: "Hello World!"

     "Hello World!" 

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

ответ

6

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

Сообщение об ошибке гласит: «DrawString: с XLineAlignment.BaseLine высота прямоугольника макета должна быть равна 0.» Текст будет выровнен по строке, поэтому высота должна быть равна 0. Да, это строка. Используйте другое выравнивание, если вы укажете прямоугольник.

Образец TextLayout показывает, как форматировать текст.
Редактирование: образец графики также показывает, как текст макета (отдельные строки текста, автоматические разрывы строк, техника, показанная в образце TextLayout, обрабатывает разрывы строк автоматически, используя класс XTextFormatter).

+0

Свойство XLineAlignment фактически демонстрируется только в примере ** Graphics **, а не в образце TextLayout. Должно быть, это должно быть в образце TextLayout, но эй! – noelicus

+0

@noelicus: Правильно, образец TextLayout показывает, как текст макета без XLineAlignment. Вопрос касался макета текста. В образце Graphics также показаны способы компоновки текста с использованием XLineAlignment. –

2

При попытке выяснить, как позиционирование текста работает с 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 координат? Это связано с тем, что полная высота шрифта включает в себя некоторый прыжок сверху. Таким образом, результат вычисления не будет тем, что ожидается. С другой стороны, вам не нужно заботиться о прыжке, если вам это нужно. В моем конкретном случае я не требую прыжка, поэтому я должен снять его с высоты строки.

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

Спасибо!

Смежные вопросы