代码之家  ›  专栏  ›  技术社区  ›  Epaga Alex Reynolds

Java中不正确的字体度量?

  •  9
  • Epaga Alex Reynolds  · 技术社区  · 16 年前

    使用某个字体,我使用Java的FoTeFrand来确定它的上升、下降和引导。(参见Java的FoTeFrand教程) 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的行距似乎为 十三点七 而不是 十点七 PT像我使用Java的字体度量计算以上)。

    任何想法

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

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

    • 将所有glyph添加到glyph向量 font.getNumGlyphs() 等等-仍然得到相同的字体度量值
    • 按说明使用多行 here -我得到的每一行的字体度量与上面概述的相同。
    • 使用 FontMetrics '方法,例如 getLeading()
    2 回复  |  直到 16 年前
        1
  •  10
  •   Community CDub    8 年前

    扎尔科宁不值得他投反对票,因为他在正确的路线上。许多Java字体似乎为他们的领导返回零,也许他们不应该。 this bug :我不知道。把这个空白放回去似乎是你的责任。

    排版线高度通常定义为上升+下降+领先。上升和下降是从角色所坐的基线开始向上和向下测量的,而前导是一条直线下降和下方直线上升之间的空间。

    alt text

    但领导不是固定的。您可以在大多数文字处理和排版软件中设置前导。Word称之为行距。最初的问题可能是问微软Word如何计算其单行间距。微软 recommendations for OpenType fonts 似乎表明不同平台上的软件计算方式不同。(也许这就是为什么Java现在返回零?)

    一个快速的谷歌搜索似乎表明一个经验法则,领导是 120% of ascent+descent for single-line spacing 或者一个固定的点间距;比如所有行之间的2个点。如果我找不到任何硬性或快速的规则,我会说它归结为你所呈现的文本的易读性,你应该按照你认为最好的方式去做。

        2
  •  3
  •   Zarkonnen    16 年前

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

    所以在Word/OO中,你的数字是上升+下降+空白,而在Java中你只有提升+下降?