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

Epa*_*aga 9 java layout fonts font-size

使用某种字体,我使用Java的FontLayout来确定它的上升,下降和前导.(见Java的FontLayout教程这里)

在我的具体情况下,我使用的是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());
Run Code Online (Sandbox Code Playgroud)

Java给了我以下值:

    Ascent: 8.550781
    Descent: 2.1679688
    Leading: 0.0
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.但是,如果我使用这些值的总和作为各行文本的行间距,这与OpenOffice,Microsoft Word等中使用的行间距相差很大:它更小.当使用默认单行间距Word和OO似乎有大约13.7 pt 的行间距(而不是像我使用上面的Java字体指标计算的10.7 pt).

任何的想法

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

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

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

ban*_*ity 10

Zarkonnen不值得他的支持,因为他在正确的路线上.许多Java字体似乎在他们的领导时返回零,也许他们不应该.也许是由于这个错误:我不知道.将这个空格重新放入其中似乎取决于你.

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

替代文字

但领先并不固定.您可以在大多数Word处理和印刷软件中设置领先地位.Word称之为行间距.最初的问题可能是询问Microsoft Word如何计算其单行间距.微软对OpenType字体建议似乎表明不同平台上的软件以不同方式计算它.(也许这就是为什么Java现在返回零?)

一点点谷歌搜索似乎表明,对于单线间距或固定点间距,前导的经验法则是上升+下降的120% ; 说所有线之间领先2分.在没有任何严格或快速的规则我可以​​找到的情况下,我会说它归结为你所呈现的文本的易读性,你应该选择你认为最好的文本.