「Python實用祕技16」快速提取字體子集

本文完整示例代碼及文件已上傳至我的Github倉庫https://github.com/CNFeffery/PythonPracticalSkills

  這是我的系列文章「Python實用祕技」的第16期,本系列立足於筆者日常工作中使用Python積累的心得體會,每一期爲大家帶來一個幾分鐘內就可學會的簡單小技巧。

  作爲系列第16期,我們即將學習的是:快速提取字體子集。

  在我們日常進行數據可視化、web應用開發等場景中,經常會用到一些特殊的非系統自帶字體,尤其是中文字體,由於包含的字符數量衆多,因此體積一般都比較大,這在進行數據可視化讀取字體文件,或是網頁應用中通過網絡加載字體文件時,就會帶來更多的耗時。

  而我們完全可以針對字體文件運用“按需引入”的思想,從原始的體積較大的全量字體文件中,根據我們實際使用到的文字範圍,進行子集的提取,從而大幅度提升效率。

  我們可以利用Python中的fonttools庫來快捷實現此項需求,它由谷歌開源,自帶了若干實用的字體處理相關命令行工具,使用pip install fonttools安裝完成後,我們只需要按照下列格式執行命令行工具pyftsubset即可:

pyftsubset 原始字體文件路徑 --text=需要保留的字符 --output-file=輸出子集字體文件路徑

  而當我們需要進行保留的字符衆多時,則可以通過書寫Python腳本的方式,批量拼接命令行進行模擬執行:

import os
import re

# 讀入目標文本內容
with open('./將進酒.txt', encoding='utf-8') as t:
    source_content = t.read()
    
# 模擬執行pyftsubset命令生成字體子集
os.system(
    'pyftsubset 鍾齊志莽行書.ttf --text={} --output-file=鍾齊志莽行書mini.ttf'.format(
        # 去除空白字符後去重
        ''.join(set(re.sub('\s', '', source_content)))
    )
)

  通過上面的示例代碼,我們從本地原體積爲4698kb的字體文件中,提取出大小僅有76kb的目標子集字體文件:

  在此基礎上,我們就可以在項目中大幅度優化外部字體的使用效率😉,譬如下面的示例dash應用(相關源碼及文件已上傳至文章開頭倉庫):


  本期分享結束,咱們下回見~👋

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章