首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PdfSharp:文本高度/定位问题

PdfSharp:文本高度/定位问题
EN

Stack Overflow用户
提问于 2009-08-27 15:04:04
回答 2查看 18.8K关注 0票数 4

无论我是否使用XTextFormatter,对于LayoutRectangle必须有0的高度或类似的情况,我都会遇到同样的错误。

代码语言:javascript
复制
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 I已从具有方位=景观的PdfPage预定义_gfx,大小=字母xPosE 210E 111yPos<代码>E 212E 212类型为double类型的参数,与E 113xLimitE 214和E 115yLimitE 216相同。

我得到运行时错误,LayoutRectangle必须有0(0)的高度.

每定义一个矩形就意味着有一个高度,否则就称它为直线!我不明白!..

我直接尝试使用XGraphics.DrawString()方法,并得到了相同的错误。我似乎不能使用LayoutRectangle,但必须手动管理文本是否适合于所需的区域。

代码语言:javascript
复制
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!" “你好世界!”

由于不同的打印面积限制和字体大小以及不同的字体风格,我不能只把这些写成一个简单的句子,包括正确的空格数。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-08-31 08:35:09

引用错误信息可以帮助他人帮助您。

错误消息如下:

DrawString:使用XLineAlignment.BaseLine,布局矩形的高度必须为0。

文本将在一行对齐,因此高度必须为0。是的,这是一条线。如果指定矩形,则使用不同的对齐方式。

TextLayout示例演示了如何格式化文本。

Graphics示例还展示了如何布局文本(单行文本,没有自动换行;TextLayout示例中显示的技术使用XTextFormatter类自动处理换行)。

票数 9
EN

Stack Overflow用户

发布于 2009-08-31 16:35:07

在试图了解文本定位与PdfSharp的工作方式时,我注意到DrawString()方法写在我们指定的Y坐标之上。

如果我想写在(0,100)(x,y),这指向左下角,而我认为这是左上角坐标。因此,我应该指定的文本字符串Y坐标是100 + string.Height * .6。

代码语言:javascript
复制
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);

}

您可能会想知道,当我想要在Y坐标下编写字符串时,为什么我只添加了字符串大小的60%?这是因为字体的全部高度包括某种顶部的跳跃。因此,计算结果将不像预期的那样。另一方面,如果你需要的话,你不需要关心一个飞跃。在我的特殊情况下,我不需要跳跃,所以我必须把它从绳子的高度上取下来。

如果你觉得我的解释需要更准确的细节,请随意添加它们作为评论或随时通知我,以便我可以包括它们。

谢谢!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1341680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档