php压缩字体,得到字体子集,报错Failed to decode downloaded font

想要实现字体子集,是因为中文字体太大,所以想压缩下字体,把字体中需要用的字型保留,不要的字型删掉,然后得到新的小字体,就可以在网页中用font-face引用。

在github发现了一个php字体子集的项目
https://github.com/amswindell...

    include('schrift.php');
    $font=new Schrift('hywxinshu.ttf');
    $data=$font->subset('abc hello world 中国');
    file_put_contents('Public/fonts/newfont1133.ttf', $data);

前3行是按项目文档的写法,得到$data,
似乎到这一步还没保存,所以最后一行file_put_contents()是我自己保存为小字体,
确实保存成功了,windowns里面点预览发现是对的,确实只有'abc hello world 中国'这些字型,如下图:

然而在网页中用font-face引用,却报错Failed to decode downloaded font,OTS parsing error: OS/2: missing required table

请问 是不是我保存的不对?
前3行的$data应该是没问题的,怎么保存为新的小字体 才能正常使用呢?

阅读 2.4k
1 个回答

https://stackoverflow.com/questions/14529277/need-guidance-program-your-own-font-converter-sub-setter

 $fontfile = "example.ttf";
 $subset = "abcdefghijklmnopqrstuvwxyz";

 $font = Font::load($fontfile);

 if ($font instanceof Font_TrueType_Collection) {
  $font = $font->getFont(0);
 }
 $font->parse();

 $font->setSubset($subset);
 $font->reduce();
 $tmp = tempnam(sys_get_temp_dir(), "fnt");
 $font->open($tmp, Font_Binary_Stream::modeWrite);
 $font->encode(array("OS/2"));
 $font->close();

前一个帖子不采纳么?

明明有搜出来的 1.6K star 的项目不用

非要用 3 star 的项目,你是怎么想的?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题