我正在使用PDFsharp(http://www.pdfsharp.net/)将字符串绘制为PDF文件。我希望文本放置在位置(0,0)但是当它呈现给PDF时,X位置为0,但文本的顶部向下偏移。我认为这是由于字体的行高,因为当我突出显示文本时,我可以看到突出显示超出了顶部和底部。如何让PDFsharp定位文本而不在顶部填充,这样文本的顶部就位于标签的边缘?
这是我用于绘制文本的代码片段:
XFont font = new XFont(text.Font,
XUnit.FromMillimeter(text.Height), XFontStyle.Regular);
gfx.DrawString(text.Content, font, textLayer,
new XPoint(XUnit.FromMillimeter(0), XUnit.FromMillimeter(0)),
XStringFormats.TopLeft);
答案 0 :(得分:0)
填充是字体的一部分。有些角色有变音符号 - 有些甚至有两个,一个堆叠在另一个上面。
您可以绘制“u”,“A”,“Ä”或“Ǻ” - 它们都将共享相同的基线。
我不知道你是否可以从字体中查询上升器的高度,使“T”的顶栏位于0线。
在最坏的情况下,您可以在生成的PDF文件中测量“填充”,并将其用作偏移量以将字符串绘制在负位置。
但是,如果文本不同,您可能会失去重要的变音符号。
答案 1 :(得分:0)
这就是我最终要做的事情。将字符串转换为XGraphicsPath。然后使用GdiPath获取文本每一侧的最小/最大点数。在我得到这些之后,我能够找出最高字母的顶部位置,并减去原始位置(带填充)应该在哪里的差异。然后我可以用该值绘制实际文本偏移量。
XGraphicsPath path = new XGraphicsPath();
XFont font = new XFont(text.Font, XUnit.FromMillimeter(text.Height), XFontStyle.Regular);
//path.AddString with my string details
PointF[] points = path.Internals.GdiPath.PathPoints;
foreach (PointF point in points)
{
//Get leftmost point x value
if (minX == null || point.X < minX)
{
minX = point.X;
}
//Get top most point y value
if (minY == null || point.Y < minY)
{
minY = point.Y;
}
//Get top most point y value
if (maxX == null || point.X > maxX)
{
maxX = point.X;
}
//Get bottom most point y value
if (maxY == null || point.Y > maxY)
{
maxY = point.Y;
}
}