PdfSharp:文本高度/定位问题

时间:2009-08-27 15:04:05

标签: pdf layout pdfsharp drawstring

无论我是否使用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 我已经使用 Orientation = Landscape,Size = Letter PdfPage 预定义 _gfx 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%。*

以下是我尝试做的一个例子:

  

“Hello World!” “你好   世界!“

这就是我得到的:

                      "Hello World!" 
     

“Hello World!”

由于不同的打印区域限制和字体大小以及不同的字体样式,我不能把它们写成一个简单的句子,包括正确的空格数。

2 个答案:

答案 0 :(得分:8)

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

错误消息显示为:

  

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

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

TextLayout示例显示了如何设置文本格式。

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

答案 1 :(得分: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坐标下面?这是因为字体的整个高度包括顶部的一些跳跃。因此,计算结果将不是预期的。另一方面,如果需要,您不必关心跳跃。在我的特殊情况下,我不需要跳跃,所以我必须把它从绳子的高度上取下来。

如果您觉得我的解释需要更准确的详细信息,请随时将其添加为评论或随时通知我,以便我可以将其包括在内。

谢谢!