【问题标题】:PDFsharp DrawString line heightPDFsharp DrawString 行高
【发布时间】:2015-09-15 02:56:24
【问题描述】:

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

这是我用于绘制文本的代码的 sn-p:

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

【问题讨论】:

    标签: c# fonts pdfsharp


    【解决方案1】:

    填充是字体的一部分。有些字符有变音符号 - 有些甚至有两个,一个堆叠在另一个之上。

    您可以画“u”、“A”、“Ä”或“Ǻ”——它们都将共享相同的基线。

    不知道能不能从字体中查询升序的高度,让“T”的顶栏在0行。
    在最坏的情况下,您可以测量生成的 PDF 文件中的“填充”并将其用作偏移量以在负位置绘制字符串。
    但是,如果文本不同,您可能会丢失重要的变音符号。

    【讨论】:

    • 我见过其他使用文本实际边缘的程序。只是想知道他们是如何做到这一点的。即Adobe Illustrator、Autocad等。是不是因为先把文字转成曲线?这在 PDFSharp 中可行吗?
    • PDFsharp 可以将文本转换为路径(有关示例,请参阅pdfsharp.net/wiki/Graphics-sample.ashx#Convert_text_to_path_15)。我不知道您是否可以访问路径的所有点,我从未尝试过。这些字体只是由贝塞尔曲线或样条连接的点。
    【解决方案2】:

    这就是我最终要做的。将字符串转换为 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;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-16
      • 2017-01-09
      • 2011-05-04
      • 2011-02-28
      • 1970-01-01
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多