#opentype #pdf #subsetting #pdf-file

subsetter

减少OpenType字体的尺寸和覆盖范围

2个版本

0.1.1 2023年3月19日
0.1.0 2022年10月14日

#550 in 压缩

Download history 1712/week @ 2024-03-14 808/week @ 2024-03-21 835/week @ 2024-03-28 784/week @ 2024-04-04 899/week @ 2024-04-11 654/week @ 2024-04-18 963/week @ 2024-04-25 866/week @ 2024-05-02 825/week @ 2024-05-09 1359/week @ 2024-05-16 1037/week @ 2024-05-23 893/week @ 2024-05-30 944/week @ 2024-06-06 1045/week @ 2024-06-13 1133/week @ 2024-06-20 726/week @ 2024-06-27

每月3,952次下载
7个crate(3个直接使用)中使用

MIT/Apache

61KB
1.5K SLoC

subsetter

Crates.io Documentation

通过TrueType或CFF轮廓减少OpenType字体的尺寸和覆盖范围。

[dependencies]
subsetter = "0.1"

示例

在下面的示例中,我们移除了除了ID为68、69、70的符号之外的所有符号。这些符号对应于字母'a'、'b'和'c'。

use subsetter::{subset, Profile};

// Read the raw font data.
let data = std::fs::read("fonts/NotoSans-Regular.ttf")?;

// Keep only three glyphs and the OpenType tables
// required for embedding the font in a PDF file.
let glyphs = &[68, 69, 70];
let profile = Profile::pdf(glyphs);
let sub = subset(&data, 0, profile)?;

// Write the resulting file.
std::fs::write("target/Noto-Small.ttf", sub)?;

值得注意的是,这个subsetter实际上并没有删除符号,只是删除了它们的轮廓。这意味着你不必担心符号ID的改变。然而,这也意味着生成的字体并不总是尽可能小。为了多少弥补这一点,这个crate有时至少将无法完全删除的未使用数据清零。这有助于在字体被压缩时,例如在PDF文件中嵌入时。

在上面的示例中,原始字体为375 KB(188 KB压缩后),而生成的字体为36 KB(5 KB压缩后)。

局限性

目前,该库仅对静态轮廓字体进行子集化。此外,它旨在用于文本已映射到符号的用例。可能的未来工作包括

  • 传递变异数据的选项,这将使subsetter创建一个变量字体的静态实例。
  • 位图、颜色和SVG表的子集化。
  • 一个配置文件,它使用字符集而不是符号集,并子集化布局表。

安全和依赖性

该crate禁止不安全代码,并且没有依赖项。

许可证

该crate根据MIT和Apache 2.0许可证双许可。

无运行时依赖项