「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应用(相关源码及文件已上传至文章开头仓库):

本期分享结束,咱们下回见~
「Python实用秘技16」快速提取字体子集的更多相关文章
- 「Python实用秘技08」一行代码解析地址信息
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第8期 ...
- 「Python实用秘技01」复杂zip文件的解压
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的新系列文章「Python实用秘技」的第1 ...
- 「Python实用秘技03」导出项目的极简环境依赖
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第3期 ...
- 「Python实用秘技04」为pdf文件批量添加文字水印
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第4期 ...
- 「Python实用秘技02」给Python函数定“闹钟”
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第2期 ...
- 「Python实用秘技05」在Python中妙用短路机制
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第5期 ...
- 「Python实用秘技06」逐行监听Python程序的内存消耗
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第6期 ...
- 「Python实用秘技07」pandas中鲜为人知的隐藏排序技巧
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第7期 ...
- 「Python实用秘技09」更好用的函数运算缓存
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第9期 ...
- 「Python实用秘技10」深度比较Python对象间差异
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第10 ...
随机推荐
- shell执行一个程序过程
1:shell调用执行程序或脚本 2:unix内核启动一个新的进程,在该进程中执行所指定的程序. 3:如果是编译型程序,内核成执行,如果无法执行指定的程序,返回"not executable ...
- Mac终端出现 brew command not found 解决
MacOS 上您需要安装 unrar 以支持 PaddlePaddle,可以使用命令brew install unrar 执行命令后发现 brew 不存在 jimmy@MacBook-Pro ~ % ...
- 刺激!ChatGPT给我虚构了一本书?
ChatGPT很强大,可以帮我们处理很多问题,但这些问题的答案的正确性您是否有考证过呢? 昨晚,DD就收到了一个有趣的反馈: 提问:有什么关于数据权限设计的资料推荐吗? ChatGPT居然介绍了一本根 ...
- 关于Python异步协程中for循环的使用
本文转载自简书:https://www.jianshu.com/p/c321eb22cffd 用户:简单书写_, Python使用异步模块Asyncio实现多线程并发,一般方式是: async def ...
- .NET Core 波场链离线签名、广播交易(发送 TRX和USDT)笔记
Get Started NuGet You can run the following command to install the Tron.Wallet.Net in your project. ...
- vue全家桶进阶之路21:Vue Loader 打包单位件组件
Vue Loader 是一个 webpack 插件,它允许在单个文件中定义 Vue 组件,并将其包装为 CommonJS 模块,以便在应用程序中使用.使用 Vue Loader 打包的组件被称为单文件 ...
- Netty实战(二)
一.环境准备 Netty需要的运行环境很简单,只有2个. JDK 1.8+ Apache Maven 3.3.9+ 二.Netty 客户端/服务器概览 如图,展示了一个我们将要编写的 Echo 客户端 ...
- GPT虚拟直播Demo系列(二)|无人直播间实现虚拟人回复粉丝
摘要 虚拟人和数字人是人工智能技术在现实生活中的具体应用,它们可以为人们的生活和工作带来便利和创新.在直播间场景里,虚拟人和数字人可用于直播主播.智能客服.营销推广等.接入GPT的虚拟人像是加了超强b ...
- Proteus运行故障分析(电源、程序等)
问题一.Program file is not specified 原因分析:未加载hex文件. 解决方法:双击芯片,点击Program files,找到hex文件添加进来. 问题二.No power ...
- CANoe _ DBC 的创建过程
在Canoe中创建DBC(Database Container)文件,用于描述和定义CAN总线上的节点.消息和信号,遵循以下步骤: 1.打开Canoe 启动Canoe软件. 2.创建新项目 在Cano ...