无论我是否使用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!”
由于不同的打印区域限制和字体大小以及不同的字体样式,我不能把它们写成一个简单的句子,包括正确的空格数。
答案 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坐标下面?这是因为字体的整个高度包括顶部的一些跳跃。因此,计算结果将不是预期的。另一方面,如果需要,您不必关心跳跃。在我的特殊情况下,我不需要跳跃,所以我必须把它从绳子的高度上取下来。
如果您觉得我的解释需要更准确的详细信息,请随时将其添加为评论或随时通知我,以便我可以将其包括在内。
谢谢!