全网首发: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号

全网首发:JDK绘制文字:五字体上下文产生流程

世界第一!泰山JDK8完美支持TTC字体文件的效果图

关于JDK支持TTC字体文件的问题及解决办法,已上报JAVA

JAVA从TTC文件中获得全部字体名的办法

TTF OTF TTC 这三种格式的字体哪种好?跪求解释