利用sfntly的sfnttool.jar提取中文字体

雨忆博客中提到了sfntly(具体介绍可以看:https://code.google.com/p/sfntly/),利用其中sfnttool.jar就可以提取只包含指定字符的字体,如果想在页面中通过@font-face嵌入中文字体的话是一个不错的选择。

sfnttool.jar的选项如下:

java -jar sfnttool.jar -h
Subset [-?|-h|-help] [-b] [-s string] fontfile outfile
Prototype font subsetter
        -?,-help        print this help information
        -s,-string       String to subset
        -b,-bench        Benchmark (run 10000 iterations)
        -h,-hints        Strip hints
        -w,-woff         Output WOFF format
        -e,-eot  Output EOT format
        -x,-mtx  Enable Microtype Express compression for EOT format

拿“新蒂黑板报体 Senty Chalk”做个测试:

java -jar sfnttool.jar  -s '张' SentyChalk.ttf zhang_SentyChalk.ttf

用FontCreator打开生成的字体,可以发现字体只有一个“张”对应的图形。

在用ant编译sfntly目前最新版本代码(r237)的时候遇到代码报错,一直编译不过去,最后将利用Eclipse强大的错误修改功能就将错误改好了编译通过,如果大家不想修改代码,可以checkout r228版本的代码就可以顺利build了。rivision在tortoisesvn设置如下图中红框所示:

r237的build错误:

Buildfile: E:php	oolsfntlyjavauild.xml

compile:
    [mkdir] Created dir: E:php	oolsfntlyjavauildclasses
    [javac] Compiling 201 source files to E:php	oolsfntlyjavauildclasses
    [javac] E:php	oolsfntlyjavasrccomgoogle	ypographyfontsfntly	able
opentypecomponentVisibleBuilder.java:8: 错误: Builder可以在SubTable中访问prote
cted
    [javac]   class VisibleBuilder<T extends SubTable> extends SubTable.Builder<
T> {
    [javac]                                                            ^
    [javac] E:php	oolsfntlyjavasrccomgoogle	ypographyfontsfntlysample
sfviewRuleDump.java:26: 错误: 无法将类 Rule中的方法 charGlyphClosure应用到给定
类型;
    [javac]     GlyphGroup ruleClosure = Rule.charGlyphClosure(txt, font);
    [javac]                                  ^
    [javac]   需要: Font,String
    [javac]   找到: String,Font
    [javac]   原因: 无法通过方法调用转换将实际参数String转换为Font
    [javac] E:php	oolsfntlyjavasrccomgoogle	ypographyfontsfntly	able
opentypecomponentVisibleBuilder.java:20: 错误: 方法不会覆盖或实现超类型的方法
    [javac]     @Override
    [javac]     ^
    [javac] E:php	oolsfntlyjavasrccomgoogle	ypographyfontsfntly	able
opentypecomponentVisibleBuilder.java:23: 错误: 方法不会覆盖或实现超类型的方法
    [javac]     @Override
    [javac]     ^
    [javac] E:php	oolsfntlyjavasrccomgoogle	ypographyfontsfntly	able
opentypecomponentVisibleBuilder.java:26: 错误: 方法不会覆盖或实现超类型的方法
    [javac]     @Override
    [javac]     ^
    [javac] E:php	oolsfntlyjavasrccomgoogle	ypographyfontsfntly	able
opentypecomponentVisibleBuilder.java:29: 错误: 方法不会覆盖或实现超类型的方法
    [javac]     @Override
    [javac]     ^
    [javac] 6 个错误

BUILD FAILED
E:php	oolsfntlyjavacommon.xml:21: Compile failed; see the compiler error ou
tput for details.

  

build相关(熟悉ant的情飘过)

环境:

1 jdk,1.6/1.7版本都可以,怎么安装和配置环境变量请自行搜索

2 ant,java的build工具,在这里下载http://ant.apache.org/bindownload.cgi,下载后解压,然后将antin目录路径加入到环境变量的path中,这样每次在cmd中直接使用ant而不用写全路径,方便使用

build:

在cmd中切换到sfntly代码的java目录,然后输入ant就开始build了。build完成后,sfnttool.jar在项目目录的javadist oolssfnttool文件夹下 。

参考:“中文字体其实也可以用在网页上的” http://hxgdzyuyi.github.io/blog/chinese-subset.html

原文地址:https://www.cnblogs.com/xingee/p/3520555.html