TTF字体文件内容获取

项目开中,在等级证书打印的模块中,规定使用指定的字体,但是涉及到了广大考生的姓名就出现了问题.因中国文化博大精深,考生的名字也是丰富多彩的,在打印证书的过程中,发现规定使用的字体根本不够用,总有一些考生的姓名中包含有生僻字,结果就会出现PDF证书上面名字打印不出来.
总结:在使用字体渲染某些字符时,有可能渲染出空白或者“口”字形,原因在于该字体文件中不包含该字符的字形。

出现这个问题后,首先想到的是在生成证书之前,对广大考生的姓名进行扫描检测,事先知道哪些考生姓名中的字在规定使用的字体中不存在,这时候就需要对字体文件(.ttf)内容进行读取了. 下面是我的思路:

PHP中没有直接对ttf文件操作的方法,那么想办法将ttf转换下格式,我想到的是将ttf文件转换为xml类型的文件;

解决方案:

安装fonttools:

fontTools是一个使用Python编写的用于处理字体的库。该项目包括TTX工具,该工具可以将TrueTypeOpenType字体与XML文本格式(也称为TTX)相互转换。它支持TrueTypeOpenTypeAFM,并在某种程度上支持Type 1和某些Mac特定格式。

安装命令:

该软件包在Python软件包索引(PyPI)中列出,因此您可以使用pip进行安装:

pip install fonttools

安装fonttools后,将ttf转换为xml格式可以使用文本化的形式查看字体:

ttx test.ttf

也可以指定某个表导出:

ttx -t GlyphOrder test.ttf

TTF字体文件内容获取_第1张图片

此时ttf文件转换为了ttx文件.
TTF字体文件内容获取_第2张图片
TTF字体文件内容获取_第3张图片

接着用PHP代码(本人是在Laravel框架中写的示例)获取ttx文件内容,取出对应的字体:

        $file = "/Users/zhouqinghe/Desktop/test.ttx";
		$xml_data = simplexml_load_file($file, "SimpleXMLElement", LIBXML_NOCDATA);
        $json = json_encode($xml_data);
        $array = json_decode($json, TRUE);

        $glyph = $array["GlyphOrder"]['GlyphID'];

        $array_font = [];
        foreach ($glyph as $value) {
     
            $uni_name = $value["@attributes"]["name"];
            if (Str::startsWith($uni_name, 'uni') && !Str::endsWith($uni_name, '.vert')) {
     
                $unicode = "\u" . substr($uni_name, 3);
                $font_cn = json_decode(sprintf('"%s"', $unicode));
                if (empty($font_cn)) {
     
                    continue;
                }
                $font_data = [
                    'unicode' => $unicode,
                    'font' => $font_cn
                ];

                $array_font[] = $font_data;
            }
        }
        
        dd($array_font);

结果

TTF字体文件内容获取_第4张图片
TTF字体文件内容获取_第5张图片

最后我是把获取结果存到了数据表中,隔一定的时间扫描最新增加的考生姓名,再以邮件通知的形式告诉管理员,哪些考生的姓名中存在规定使用字体文件中没有的字形. 对于这些考生需要单独进行处理

你可能感兴趣的:(记录点滴,ttf)