Java中的字体指标不正确/缺失?

时间:2009-05-29 09:22:21

标签: java layout fonts font-size

使用某种字体,我使用Java的FontLayout来确定它的上升,下降和前导。 (参见Java的FontLayout教程here

在我的具体情况下,我使用的是Arial Unicode MS,字体大小为8.使用以下代码:

    Font font = new Font("Arial Unicode MS", 0, 8);
    TextLayout layout = new TextLayout("Pp", font,
                               new FontRenderContext(null, true, true));
    System.out.println( "Ascent: "+layout.getAscent());
    System.out.println( "Descent: "+layout.getDescent());
    System.out.println( "Leading: "+layout.getLeading());

Java给了我以下值:

    Ascent: 8.550781
    Descent: 2.1679688
    Leading: 0.0

到目前为止一切顺利。但是,如果我使用这些值的总和作为各行文本的行间距,这与OpenOffice,Microsoft Word等中使用的行间距相差很大:它更小。当使用默认的单行间距Word和OO似乎的行间距大于 13.7 pt(而非 10.7 pt,就像我使用上面的Java字体指标计算的那样)。

任何想法

  1. 为什么会这样?
  2. 我是否可以以某种方式访问​​Word和OpenOffice似乎正在访问的字体信息导致这种不同的行间距?

  3. 到目前为止我尝试过的事情:

    • 将所有字形添加到带有font.getNumGlyphs()的字形矢量等 - 仍然获得相同的字体指标值
    • 使用如here所述的多行 - 我获得的每一行都具有与上述相同的字体指标。
    • 使用FontMetrics
    • 之类的getLeading()'方法

2 个答案:

答案 0 :(得分:10)

Zarkonnen并不值得他的赞成,因为他在正确的路线上。许多Java字体似乎在他们的领导时返回零,也许他们不应该。也许它低至this bug:我不知道。将这个空格重新放入其中似乎取决于你。

印刷线高度通常定义为上升+下降+前导。上升和下降是从角色所在的基线向上和向下测量的,而前导是一条线的下降和下面一条线的上升之间的空间。

alt text

但领先并不固定。您可以在大多数Word处理和印刷软件中设置领先地位。 Word称之为行间距。最初的问题可能是询问Microsoft Word如何计算其单行间距。微软的recommendations for OpenType fonts似乎暗示不同平台上的软件以不同的方式计算它。 (也许这就是Java现在返回零的原因?)

谷歌搜索的一小部分似乎表明,领先的经验法则是120% of ascent+descent for single-line spacing,或固定点间距;说所有线之间领先2分。在没有任何硬性或快速规则的情况下,我会发现,我会说这可归结为您所呈现的文本的易读性,您应该选择您认为最佳的文本。

答案 1 :(得分:3)

Word和OO是否包括行之间的空格,而Java不是?

所以在Word / OO中,你的数字是Ascent + Descent + Whitespace,而在Java中你只有Ascent + Descent?