PDFsharp DrawString线高

时间:2015-09-15 02:56:25

标签: c# fonts pdfsharp

我正在使用PDFsharp(http://www.pdfsharp.net/)将字符串绘制为PDF文件。我希望文本放置在位置(0,0)但是当它呈现给PDF时,X位置为0,但文本的顶部向下偏移。我认为这是由于字体的行高,因为当我突出显示文本时,我可以看到突出显示超出了顶部和底部。如何让PDFsharp定位文本而不在顶部填充,这样文本的顶部就位于标签的边缘?Highlighted Text Showing Padding

这是我用于绘制文本的代码片段:

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);

2 个答案:

答案 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;
        }
    }