开源工具分享-字体搜索工具

发布时间:2026/7/11 1:13:04
开源工具分享-字体搜索工具 字体搜索工具 FontTool —— 全盘字体扫描、预览、批量安装与商用授权检测前言项目历程介绍在我去年未毕业的实习期间当时做的是其他设计软件的二开然后我们公司设计部的人有时候会因为接收文件的字体版本和自己电脑上的版本不匹配或者缺失导致无法查看文件因此我灵感迸发想着设计这么一款软件当时在工作的空余时间先制作了一款demo因为当时AI只知道deepseek和豆包这种免费聊天版本的大部分还是自己手写的实习结束一直躺在我的gitee仓库吃灰在我毕业入职这家公司前段时间刚结束一个项目我就没事在家想着用claude重构并完整一下功能因此有以下这款软件的诞生以下是项目介绍、技术栈以及git地址。首次开源请多多指教做设计、写文档、开发前端的时候电脑里装了几百个字体但真要用的时候永远找不到想要的那个。Windows 自带的字体查看器只能一个一个翻效率极低。更头疼的是很多免费字体其实不能商用一不小心就可能收到律师函。FontTool 就是为解决这些问题而生的——一个基于 Qt 6 的 Windows 字体管理工具支持全盘扫描、毫秒级搜索、实时预览、批量安装还能自动检测字体的商用授权风险。项目地址https://github.com/afengggg/FontTool一、功能概览功能说明全盘字体扫描自动扫描所有本地驱动器的.ttf.otf.ttc字体文件智能缓存首次扫描后构建缓存后续搜索毫秒级响应字体预览点击任意行即可实时渲染字体效果家族名搜索同时匹配文件名和字体家族名如搜索黑体可找到SIMHEI.TTF类型筛选按 TTF / OTF / TTC 分类浏览批量安装多选字体后一键安装只弹一次 UAC商用授权检测自动读取字体版权声明标注开源免费 / 仅限个人 / 需商业授权右键菜单打开文件位置、复制路径、安装此字体已安装标记绿色高亮已安装字体的行一目了然二、界面与交互主界面布局顶部工具栏搜索框、搜索按钮、刷新缓存、类型筛选下拉框、执行安装按钮、进度条左侧表格显示字体列表包含序号、文件名、路径、大小、修改日期、版本号、安装状态、授权风险、操作按钮右侧预览面板点击任意字体行实时渲染中英文预览效果搜索流程在输入框输入字体名称或家族名如黑体、“雅黑”、“consolas”回车或点搜索按钮首次使用自动全盘扫描并构建缓存有进度条显示扫描进度后续搜索直接从缓存读取100ms 内出结果不输入关键词直接回车可浏览全部缓存字体字体预览点击表格中任意字体行右侧面板实时加载渲染AaBbCc 0123456789 中文字体预览效果 The quick brown fox jumps 字体文件.ttf 字体家族: Microsoft YaHei使用QFontDatabase::addApplicationFont()临时加载字体不会污染系统字体目录关闭程序后自动卸载。批量安装点击行内「安装」按钮 → 字体加入安装队列可继续添加更多字体顶部出现「执行安装 (N)」按钮点击后弹出确认对话框列出所有待安装字体确定后弹出单次 UAC 授权窗口即可批量安装安装完成后自动刷新已安装状态批量安装的核心实现是生成临时 bat 脚本通过ShellExecuteW以runas权限执行将字体文件复制到C:\Windows\Fonts并注册表项最后脚本自删除ShellExecuteW(nullptr,Lrunas,Lcmd.exe,QString(/c \batPath\).toStdWString().c_str(),nullptr,SW_SHOWNORMAL);右键菜单在搜索结果行上右键可以打开文件所在位置— 在资源管理器中定位文件复制路径— 复制完整路径到剪贴板安装此字体— 加入安装队列已安装的字体显示灰色已安装三、商用授权检测核心亮点软件自动解析每个字体文件的 OpenTypename表读取版权声明nameID 0和许可描述nameID 12归类为四个等级等级颜色含义典型关键词开源免费绿色可自由商用SIL Open Font License, GPL, MIT, Apache, CC0仅限个人橙色免费但不可商用Free for personal use, Non-commercial需商业授权红色商业使用须购买授权All Rights Reserved, Commercial license required未知灰色无版权声明或无法解析—系统预装灰色随操作系统获得授权Microsoft Corporation, Apple Inc, Google Noto鼠标悬停在文件名上可以查看完整版权信息家族名: Microsoft YaHei 版权: (c) 2023 Microsoft Corporation. All Rights Reserved. 许可: You may use this font as permitted by the EULA...注意此检测仅根据字体内置版权信息提供参考不能替代法律建议。商业使用前请核实具体授权条款。四、技术实现技术栈语言C17框架Qt 6.5 (Core, Gui, Widgets, Concurrent)编译器MinGW-w64 或 MSVC平台Windows 7项目结构Everthing.pro — Qt 项目文件 main.cpp — 程序入口 mainwindow.h/cpp — 主窗口UI 布局搜索/安装/预览逻辑约 640 行 FontSearchWorker.h/cpp — 搜索线程缓存管理文件系统遍历 FontInfoReader.h/cpp — 字体文件解析版本号、家族名、版权信息 buttondelegate.h/cpp — 表格中的「安装」按钮代理 fontinstall.h/cpp — 字体安装辅助类 mainwindow.ui — Qt Designer 界面布局由代码接管字体文件解析通过 OpenType 表目录精确定位head、name表在结尾附上了微软对字体定义的网站链接解析文件头 → 读取表目录numTables→ 按 4 字节标签定位目标表支持Windows Unicode (UTF-16BE)、Mac Roman (ASCII)、通用 Unicode编码UTF-16BE → 主机字节序LE转换正确处理中文版权信息语言优先级zh-CN en-US 其他版本号读取 16.16 定点数格式如0x00010000→ 1.0通过 magic number0x5F0F3CF5验证 head 表完整性// OpenType 表目录精确定位staticconstunsignedchar*findTable(constchar*data,size_t fileSize,constchartag[4],uint32_ttableOffset,uint32_ttableLength){uint16_tnumTablesreadU16(reinterpret_castconstunsignedchar*(data)4);constunsignedchar*dirreinterpret_castconstunsignedchar*(data)12;for(inti0;inumTables;i){constunsignedchar*entrydiri*16;if(memcmp(entry,tag,4)0){tableOffsetreadU32(entry8);tableLengthreadU32(entry12);returnreinterpret_castconstunsignedchar*(data)tableOffset;}}returnnullptr;}搜索性能优化首次扫描QDirIterator遍历所有本地驱动器目录逐目录查找字体文件缓存机制扫描结果序列化到%LOCALAPPDATA%/Everthing/Everthing/fontcache.dat格式为 TSV路径 \t 版本 \t 家族名 \t 风险等级后续搜索从缓存文件加载到内存QString::contains()做内存过滤100ms 响应网络驱动器跳过通过GetDriveTypeW检测DRIVE_REMOTE避免卡在网络路径异步搜索QtConcurrent::run()QPromise报告进度不阻塞 UIUI 架构代理模型QSortFilterProxyModel子类FontFilterProxyModel处理类型筛选和排序自定义委托ButtonDelegate在表格列中绘制可点击的安装按钮安装队列合并多次点击为单次 UAC 批处理避免反复弹窗已安装状态通过SHGetKnownFolderPath(FOLDERID_Fonts)获取系统字体目录检查文件是否存在五、编译与运行依赖Qt 6.5 (Core, Gui, Widgets, Concurrent)MinGW-w64 或 MSVC 编译器Windows SDK构建步骤# 使用 qmakeqmake6 Everthing.pro-specwin32-gCONFIGdebugmingw32-make -j$(nproc)# 或通过 MSYS2 UCRT64exportPATH/c/msys64/ucrt64/bin:$PATHmkdirbuildcdbuild qmake6../../Everthing.pro mingw32-make -j$(nproc)部署编译后使用windeployqt自动收集所需 DLLwindeployqt Everthing.exe六、写在最后这个工具最初是为了解决自己电脑上字体太多、找不到、不敢乱用的问题。后来不断完善加入了缓存加速、批量安装、版权检测等功能。如果你也在被字体管理困扰欢迎 Star 和 PRGitHub: https://github.com/afengggg/FontToolLicenseMIT — 随意使用、修改、分发。参考OpenType Specification — name tableOpenType Specification — head table