TTF字体文件内容获取
項目開中,在等級證書打印的模塊中,規(guī)定使用指定的字體,但是涉及到了廣大考生的姓名就出現(xiàn)了問題.因中國文化博大精深,考生的名字也是豐富多彩的,在打印證書的過程中,發(fā)現(xiàn)規(guī)定使用的字體根本不夠用,總有一些考生的姓名中包含有生僻字,結(jié)果就會出現(xiàn)PDF證書上面名字打印不出來.
總結(jié):在使用字體渲染某些字符時,有可能渲染出空白或者“口”字形,原因在于該字體文件中不包含該字符的字形。
出現(xiàn)這個問題后,首先想到的是在生成證書之前,對廣大考生的姓名進行掃描檢測,事先知道哪些考生姓名中的字在規(guī)定使用的字體中不存在,這時候就需要對字體文件(.ttf)內(nèi)容進行讀取了. 下面是我的思路:
PHP中沒有直接對ttf文件操作的方法,那么想辦法將ttf轉(zhuǎn)換下格式,我想到的是將ttf文件轉(zhuǎn)換為xml類型的文件;
解決方案:
安裝fonttools:
fontTools是一個使用Python編寫的用于處理字體的庫。該項目包括TTX工具,該工具可以將TrueType和OpenType字體與XML文本格式(也稱為TTX)相互轉(zhuǎn)換。它支持TrueType,OpenType,AFM,并在某種程度上支持Type 1和某些Mac特定格式。
安裝命令:
該軟件包在Python軟件包索引(PyPI)中列出,因此您可以使用pip進行安裝:
pip install fonttools安裝fonttools后,將ttf轉(zhuǎn)換為xml格式可以使用文本化的形式查看字體:
ttx test.ttf也可以指定某個表導(dǎo)出:
ttx -t GlyphOrder test.ttf此時ttf文件轉(zhuǎn)換為了ttx文件.
接著用PHP代碼(本人是在Laravel框架中寫的示例)獲取ttx文件內(nèi)容,取出對應(yīng)的字體:
$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);結(jié)果
最后我是把獲取結(jié)果整理為一個JSON格式的文件「當然也可以存到了數(shù)據(jù)表中」,隔一定的時間掃描最新增加的考生姓名,再以郵件通知的形式告訴管理員,哪些考生的姓名中存在規(guī)定使用字體文件中沒有的字形. 對于這些考生需要單獨進行處理
總結(jié)
以上是生活随笔為你收集整理的TTF字体文件内容获取的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何远程访问服务器的 Jupyter n
- 下一篇: Linux有关Shell中if用法笔记