在做移动端的H5页面时经常遇到一些特殊字体,往往动辄就4-5M,大的有的20多M,这文件要是扔到web上肯定就直接歇菜了。所以这时候就得想下怎么对字体文件瘦身呢?无外乎是对字体文件中没有用到的字体进行剔除,一个字体文件中少说也有3500个字根,我们一个页面用到的也就100-200字最多了,所以有很多冗余的字根我们可以去掉。

前端全的webfont有一些解决方案,大家可自行查找,(字蛛)。大多数都是通过node来进行编译静态的html文件,然后分析文件中的包含文字然后生成对应的压缩剔除后的字体文件供前端页面导入,但这里有很大弊端就是不支持动态文件页面的字体剔除,如果是做一些简单的H5页面或者邀请函之类,上面的需求就完全够用了,但往往有一些动态文件的页面也是需要我们来进行用特殊字体渲染的,这就是本文所要解决的。

SfntTool 官网地址是:https://code.google.com/p/sfntly/ 可用于编辑、创建和使用字体文件的,主要针对OpenType, TrueType字体。

各个JDK版本下的SfntTool jar包 https://github.com/reedy/sfntly-builds/ ,可以直接使用编译好的jar包来进行操作

java -jar YOUR_LIB_PATH/sfnttool.jar -s '汉体书写' YOUR_FONT_PATH/字体.TTF 字体-light.TTF

也可以导入到项目中使用具体代码来进行动态操作:(推荐)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
*
* 字体提取工具类
*
* @author Melon
*
*/
public class FontGenerateManager {
/**
*
* 根据舒服的内容生成字体文件
*
* @param content
* @param sourceFontFile
* @param generateFontFile
* @return
*/
public static void generateFontByContent(String content,
String sourceFontFile, String generateFontFile) {
String[] args2 = new String[] { "-s", content, sourceFontFile,
generateFontFile };
try {
SfntTool.main(args2);
} catch (IOException e) {
e.printStackTrace();
}
}
}

做了一个简单的基于SfntTool在线字体瘦身小工具 http://sonnyfont.k-run.cn

–EOF–