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(ubuntu)字体配置(字体缺失解决办法)
WPS for Linux(ubuntu)字体配置(字体缺失解决办法)