全网首发:JDK/Java对于TTC字体文件的支持研究
Posted 柳鲲鹏
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全网首发:JDK/Java对于TTC字体文件的支持研究相关的知识,希望对你有一定的参考价值。
同事报怨,泰山OFFICE可用字体太少。吾当时就奇怪了:就那么几个字体,让吾给汝变出来?同事说,别的软件字体多啊。吾视之……吾错了。
于是了解了一下,原来字体文件(TrueType)有两种:一种是单一的字体(TTF),还有一种是多种字体(TTC)。Java允许从文件中产生字体:
Font.createFont(Font.TRUETYPE_FONT, new File("D:\\\\simsun.ttc"));
使用FontForge可知其中有两个字体,参数中无法指定。这怎么办?于是搜索了一番,得到这样的信息:
- Java支持TTC字体格式,但使用Font.createFont()只能获取TTC文件中定义的第一种字体。目前,无法指定字体索引。
- sun.font.SunFontManager.createFont2D(),调用时new TrueTypeFont()(大约是2486),fontIndex始终为零。即:font2D = new TrueTypeFont(fontFilePath, null, 0, true);
那么,是不是改了就对了呢?咱有泰山JDK8,想改还不容易?随口一句:有自己的基础软件,真的好方便啊。先改成1试试。
- 产生字体代码
testFonts[0] = new Font("宋体", 0, 16);
testFonts[1] = Font.createFont(Font.TRUETYPE_FONT, new File(FONT_DIR+"\\\\"+FONT_FILES[0]));
// 指定大小
testFonts[1] = testFonts[1].deriveFont(Font.PLAIN, 16);
- 绘制结果
从绘制效果来看,完全一样。这个结果是不是对的呢?目前无法确认。
- 字体名的变化
System.out.println(f.getFamily()+", "+f.getName()+", "+f.getFontName());
得到的结果都是:新宋体。这说明JDK确实是能处理TTC。
以上是关于全网首发:JDK/Java对于TTC字体文件的支持研究的主要内容,如果未能解决你的问题,请参考以下文章
全网首发:OpenJDK如何支持字体的kerning及BUG号