字体子集化实践探索

news2024/12/14 6:58:45

最近项目rust生成PDF组件printpdf需要内嵌完整字体导致生成的PDF很大,需要做压缩,但是rust的类库allsorts::subset::subset不支持windows,所以做了一些windows下字体子集化的尝试

方案一:node.js做子集化
fontmin 缺点是也需要集成node环境,很多网络下载的字体都不支持

方案二:python做子集化
fontTools库的subset工具,兼容性最好的子集化工具,参数也最丰富
缺点:需要软件集成mini python环境,在低端电脑执行速度特别慢
pip install fonttools
可以直接用命令行执行
pyftsubset 原始字体文件路径 --text=需要保留的字符 --output-file=输出子集字体文件路径
完整的参数使用查看源码

from fontTools.subset import subset
 
def create_font_subset(input_font, output_font, characters):
    subset_options = {'glyphs': characters}
    subset(input_font, output_font, subset_options)
 
input_font_path = 'path/to/input_font.ttf'
output_font_path = 'path/to/output_font.ttf'
characters_to_include = 'abcdefghijklmnopqrstuvwxyz'
 
create_font_subset(input_font_path, output_font_path, characters_to_include)

方案三:C#做子集化
Microsoft.Extensions.FontSubset 库

using System;
using System.IO;
using Microsoft.Extensions.FontSubset;

class Program
{
    static void Main(string[] args)
    {
        string fontPath = "path/to/font.ttf"; // 字体文件路径
        string[] characters = new string[] { "A", "B", "C" }; // 需要包含在子集中的字符列表
        string outputPath = "output.ttf"; // 输出文件路径

        using (FileStream outputStream = File.Create(outputPath))
        {
            FontSubset.BuildSubset(fontPath, characters, outputStream);
        }
    }
}

有一个fontsubset已经编译好可以直接用
fontsubset-console -c <字符集目录> -r <字符集文件匹配规则> -a -s <输入字体文件> <输出的字体文件>

方案四:java做子集化
拷贝了一个韩国人的项目,放到自己的仓库
启动一个java http服务,通过入参生成子集,第一次要400ms左右,后面执行越来越快几十ms
缺点:生成的字体仍然有1.3M;需要集成jre环境;放弃

import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.FontSubsetGenerator;

import java.io.IOException;

public class SubFontByItextPdf {
    public static boolean subFont(String sourceFontFile, String destFontFile, String text) {
        long startTime = System.currentTimeMillis();
        try {
            String path = FontSubsetGenerator.GEN(sourceFontFile, destFontFile, text);
            System.out.println("result: "+path);
        } catch (DocumentException e) {
            e.printStackTrace();
            System.out.println("error");
            return false;
        } catch (IOException e) {
            System.out.println("error");
            e.printStackTrace();
            return false;
        }
        System.out.println("cost" + (System.currentTimeMillis() - startTime) + "ms");
        System.out.println("done");
        return true;
    }
}

方案五:用harfbuzz的工具类hb-subset
调用命令行直接执行,下载地址
hb-subset.exe --output-file=dest.otf C:\source.otf 你好呀
执行速度很快,字体子集化结果也比较理想
参数使用查看源码,也可以hb-subset.exe --help-all查看所有参数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2259175.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java安全—SpringBootActuator监控泄露Swagger自动化

前言 今天依旧是SpringBoot框架&#xff0c;估计还要一篇文章才能把它写完&#xff0c;没办法&#xff0c;Java安全的内容太多了。 Actuator SpringBoot Actuator模块提供了生产级别的功能&#xff0c;比如健康检查&#xff0c;审计&#xff0c;指标收集&#xff0c;HTTP跟踪…

质数的和与积

质数的和与积 C语言代码C 代码Java代码Python代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 两个质数的和是S&#xff0c;它们的积最大是多少&#xff1f; 输入 一个不大于10000的正整数S&#xff0c;为两个质数的和。 输出 一个整…

如何用VScode恢复误删文件-linux

如果你用vscode远程在服务器上办公&#xff0c;有一天你用了&#xff1a; rm -rf *然后你发现你的文件不见了&#xff0c;不要着急。 这种方法只适用于不多的几个文件。 这个时候你要做的是&#xff0c;查看右侧的1&#xff1a; 从1里面查找你删除的文件&#xff0c;然后点…

Linux文件操作基础

1.引入 在Linux第一章提到过&#xff0c; 在Linux中&#xff0c;一切皆文件&#xff0c;而文件由文件内容和文件属性组成&#xff0c;在C语言中可以 使用相应的接口打开文件&#xff0c;例如 fopen 函数 文件最开始在磁盘中&#xff0c;但是因为磁盘的速度远低于CPU的执行速度…

如何在 MacOS 上安装 Flutter ?

Flutter 是 Google 开发的一个功能强大的框架&#xff0c;它允许开发人员从单个代码库构建高质量的、本机编译的移动、web 和桌面应用程序。如果你是初次接触 Flutter&#xff0c;并希望在你的 macOS 系统上安装它&#xff0c;本指南将引导你一步一步地完成这个过程。 Step 1:…

【2025最新计算机毕业设计】基于SpringBoot+Vue社区医院挂号健康服务平台【提供源码+答辩PPT+文档+项目部署】

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

Docker安装MySQL5.5版本数据库(图文教程)

本章教程,介绍如何使用Docker安装MySQL低版本5.5版本的数据库。 一、拉取镜像 docker pull mysql:5.5二、启动容器 docker run -d --name mysql5.5 --restart=always

可视化建模与UML《部署图实验报告》

一、实验目的&#xff1a; 1、熟悉部署图的基本功能和使用方法。 2、掌握使用建模工具软件绘制部署图的方法 二、实验环境&#xff1a; window11 EA15 三、实验内容&#xff1a; 根据以下的描述&#xff0c;绘制部署图。 网上选课系统在服务器端使用了两台主机&#xff0c;一…

Python的3D可视化库【vedo】2-3 (plotter模块) 增删物体、控制相机

文章目录 4 Plotter类的方法4.3 渲染器内的物体操作4.3.1 添加物体4.3.2 移除物体4.3.3 渲染器的内容列表 4.4 相机控制4.4.1 访问相机对象4.4.2 重置相机状态4.4.3 移动相机位置4.4.4 改变相机焦点4.4.5 改变相机朝向的平面4.4.5 旋转相机4.4.6 对齐相机的上朝向4.4.7 缩放 pl…

07篇(附)--仿射变换矩阵

此篇献给某些 头铁 的小只因们&#xff0c;认真钻研下面的数学式吧 原理示例 首先我们以最简单的一个点的旋转为例子&#xff0c;且以最简单的情况举例&#xff0c;令旋转中心为坐标系中心O&#xff08;0&#xff0c;0&#xff09;&#xff0c;假设有一点P0(x0,y0)&#xff0…

Unity屏幕截图、区域截图、读取图片、WebGL长截屏并下载到本地jpg

Unity屏幕截图、区域截图、读取图片、WebGL长截屏并下载到本地jpg 一、全屏截图并保存到StreamingAssets路径下 Texture2D screenShot;//保存截取的纹理public Image image; //显示截屏的Imagepublic void Jietu(){StartCoroutine(ScrrenCapture(new Rect(0, 0, Screen.width…

【2025最新计算机毕业设计】基于SprintBoot+Vue乡村振兴民宿管理系统【提供源码+答辩PPT+文档+项目部署】

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

在Docker中运行MySQL的思考:挑战与解决方案

引言 在云计算和容器化技术日益普及的今天&#xff0c;Docker作为一种轻量级的容器化平台&#xff0c;已经成为开发和部署应用的首选工具之一。其提供的便携性、可扩展性和环境一致性对于无状态微服务来说无疑是巨大的福音。然而&#xff0c;并非所有应用都适合在Docker容器中…

【Linux网络】网络基础:传输层TCP协议(二)

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;Linux “ 登神长阶 ” &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ 传输层UDP/TCP协议 确认应答机制超时重传机制连接管理机制理解 TIME_WAIT 状态 滑动窗口流量…

virtualbox 搭建ubuntu

环境&#xff1a;VirtualBox-6.1.32 1、下载安装virtualbox 略 2、新建ubuntu 3、配置ubuntu 选择虚拟盘 4、安装ubuntu 5、安装ssh sudo apt install openssh-server openssh-client 查看ip 6、安装samba sudo apt install samba 查看ssh启动状态 sudo systemctl stat…

智能人体安全防护:3D 视觉技术原理、系统架构与代码实现剖析

随着工业化程度的提高&#xff0c;生产安全已成为企业关注的重点。尤其是在一些存在禁区的工业厂区和车间&#xff0c;人员误入或违规进入将带来严重的安全隐患。为了解决这一问题&#xff0c;迈尔微视推出了智能人体安全检测解决方案&#xff0c;为企业提供全方位的人员安全监…

Javaweb web后端maven介绍作用安装

自动导入到这个项目 src是源代码 main主程序&#xff0c;核心代码 java是Java源代码 resources是项目配置文件 test测试相关的 maven概述 介绍 依赖在本地仓库查找&#xff0c;如果本地仓库有&#xff0c;用本地仓库的依赖&#xff0c;本地没有&#xff0c;连接中央仓库&…

独家原创 | CEEMDAN-CNN-GRU-GlobalAttention + XGBoost组合预测

往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较 全是干货 | 数据集、学习资料、建模资源分享&#xff01; EMD变体分解效果最好算法——CEEMDAN&#xff08;五&#xff09;-CSDN博客 拒绝信息泄露&#xff01;VMD滚动分…

网络基础概念

协议 协议在我的理解看来其实就是为了让全部计算机做通信而设计出来的一种约定 计算机之间的传输媒介是光信号和电信号. 通过 "频率" 和 "强弱" 来表示 0 和 1 这样的信息. 要想传递各种不同的信息, 就需要约定好双方的数据格式 而制定协议这件事情并不是…

向量数据库Faiss C++

目录 1. Faiss简介2. FAISS 的主要特点2.1 高效性2.2 支持多种索引类型2.3 灵活性2.4 GPU 加速2.5 易于集成 3. 应用场景4. 安装4.1 安装依赖4.2 编译源码4.2.1 下载Faiss源码4.2.2 编译 5. Demo5.1 代码5.2 编译5.3 运行 1. Faiss简介 FAISS&#xff08;Facebook AI Similari…