0
点赞
收藏
分享

微信扫一扫

全网首发:JDK/Java对于TTC字体文件的支持研究

迎月兮 2022-10-02 阅读 148


  同事报怨,泰山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);

  • 绘制结果

全网首发:JDK/Java对于TTC字体文件的支持研究_字体

从绘制效果来看,完全一样。这个结果是不是对的呢?目前无法确认。

  • 字体名的变化

System.out.println(f.getFamily()+", "+f.getName()+", "+f.getFontName());

得到的结果都是:新宋体。这说明JDK确实是能处理TTC。

 

举报

相关推荐

0 条评论