【问题标题】:How to get the ascending or descending height of a font that uses 'Text figures'如何获取使用“文本图形”的字体的升序或降序高度
【发布时间】:2014-07-03 22:35:01
【问题描述】:

我在使用itextsharp 创建的 PDF 文档中遇到文本数字 (see Wikipedia) 的问题。

基线和数字最低点之间的距离(例如9)与字体的正常下降高度不同。

通过下面的代码,我可以计算字体下降的高度:

var fontSize = 60;
var fontPath = @"CorpusGothic-Condensed.otf";
var font = BaseFont.CreateFont(fontPath, BaseFont.CP1252, BaseFont.EMBEDDED);
var descentHeight = font.GetFontDescriptor(BaseFont.DESCENT, fontSize)

我现在的问题:
是否可以使用 Wikipedia 页面上显示的带有文本数字的字体获取数字的下降高度或上升高度?

【问题讨论】:

  • 我已经在 iText Software 上制作了一张支持票,他们写道:“OTF 字体可以有 TT 或 CFF 轮廓,并且应该有标准表格。我想知道那个特定的代工厂是否没有包括主表中的上升/下降,并在 OTF 表中有这些值。有这些 OTF 文件之一的机会吗?你能分享一个你正在使用的 OTF 文件的链接吗?

标签: c# itextsharp


【解决方案1】:

字体包含升序和降序的一般值。这是您在自己的代码示例中获得的值。

但是,每个字形也有自己的尺寸。字母 h 的字形比字母 g 的字形具有更高的升序和更低的降序。

就在四个小时前,我回答了How to calculate the height of an element? 的问题(复制了您的问题)。

这是我写的:

如果bfBaseFont 实例,那么您可以使用:

float ascent = bf.getAscentPoint("Some String", 12);
float descent = bf.getDescentPoint("Some String", 12);

当我们使用 12 的字体大小时,这将返回基线以上的高度和基线以下的高度。您可能知道,字体大小是平均高度的指示。这不是实际高度。这只是我们使用的一个数字。

总高度为:

float height = ascent - descent;

请注意,仅提供字符串(在您的情况下为“9”)是不够的。您还需要传递一个字体大小(在我的例子中是 12pt)来获取升序和降序的值。

备注:如果您使用的是iTextSharp,请在我提到的方法中将get替换为Get

【讨论】:

  • 感谢您的快速回答!但是,如果我调用函数 GetAscentPoint 和 GetDescentPoint,两者都返回 0.0f 的值。我尝试了从 12 到 600 的字体大小以及带和不带字母的文本(例如“9.67”或“12g”)。结果每次使用我的问题中的代码都是一样的(在 BaseFont.CreateFont(...) 之后调用你提到的函数)
  • 我以前见过这种情况,但仅限于损坏的字体(字体文件中的错误度量)。我应该获取 CorpusGothic-Condensed.otf 以了解该字体是否属于这种情况。你试过其他字体吗?
  • 我尝试了一些 ttf 字体,它返回的结果与 0.0f 不同,但我尝试过的所有少数 otf 字体都返回了 0.0f。这可能是开放式字体的普遍问题吗?有什么方法可以发给你这个字体吗?
  • 我没有编写 OTF 支持。如果您可以使用所有 OTF 字体重现它,则 iText 处理紧凑字体格式的方式可能存在问题。如果是这样,它将需要修复。仅供参考:我们计划在下个季度重写完整的字体功能。请参阅我在 iText 峰会的主题演讲中提出的路线图:slideshare.net/iTextPDF/itext-summit-2014-keynote-talk
  • 感谢您的链接。我刚刚用我的机器上的所有 140 个 otf-Fonts 测试了这个案例:没有一个字体我得到一个大于 0.0f 的上升点或下降点值
猜你喜欢
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 2019-12-14
  • 2021-03-20
  • 1970-01-01
  • 2017-06-10
相关资源
最近更新 更多