Java中的字体度量不正确/缺失?

Posted

技术标签:

【中文标题】Java中的字体度量不正确/缺失?【英文标题】:Incorrect / missing font metrics in Java? 【发布时间】:2010-10-29 20:04:18 【问题描述】:

使用某种字体,我使用 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.7pt(而不是像我使用上面的 Java 字体度量计算的 10.7pt)。

任何想法

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

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

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

【问题讨论】:

【参考方案1】:

Zarkonnen 不值得他投反对票,因为他站在正确的路线上。许多 Java 字体似乎在它们不应该的情况下返回零作为它们的前导。也许归结为this bug:我不知道。将这个空格放回去似乎取决于您。

印刷行高通常定义为上升 + 下降 + 领先。上升和下降是从字符所在的基线向上和向下测量的,前导是一条线的下降和下面一行的上升之间的空间。

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

快速搜索一下似乎表明领先的经验法则是120% of ascent+descent for single-line spacing,或固定点间距;说在所有行之间领先 2 分。在没有我能找到任何硬性或快速规则的情况下,我会说它归结为您所呈现的文本的易读性,您应该使用您认为最好的内容。

【讨论】:

【参考方案2】:

Word 和 OO 是否包括行间空白,而 Java 不包括?

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

【讨论】:

以上是关于Java中的字体度量不正确/缺失?的主要内容,如果未能解决你的问题,请参考以下文章

WPS for Linux 字体配置(字体缺失解决办法)

WPS for Linux,系统缺失字体

(转)WPS for Linux(ubuntu)字体配置(字体缺失解决办法)

WPS for Linux(ubuntu)字体配置(字体缺失解决办法)

Debian9.5 WPS for Linux字体配置(字体缺失解决办法)

标签“head > style[amp-boilerplate]”中的强制文本 (CDATA) 缺失或不正确