通过删除字形缩小.OTF字体

时间:2013-01-28 08:13:12

标签: fonts font-face glyph

我不能完全相信这个问题没有专门针对OpenType字体,但有没有人知道从这些字体中删除字形的方法?

我有一个非常大的文件大小(几乎10MB)的.OTF,我需要缩小它。原因有两个。

1)我正在尝试为网页嵌入做准备,因此文件越小,对客户来说就越容易。

2)Font Squirrel(用于轻松准备字体文件)有2MB上传限制 - 我知道有其他选择,但到目前为止还没有成功。为了节省浪费时间的人,我尝试失败的是http://fontface.codeandmore.com/http://www.font2web.com/。 CodeAndMore.com似乎有效,但它吐出的字体与我给它的字体完全不同。

请注意我不是字体专家,所以请轻松回答。

8 个答案:

答案 0 :(得分:18)

创建了一个回答此问题的帐户。我知道这是一个老问题。但是得到一个迟到的答案比没有答案更好。

我刚遇到类似的问题。显然,没有Googlable解决方案。因此,我编写了一个带fontforge library的Python2脚本,执行以下操作:

  • 接受源字体
  • 接受包含要使用的所有字符的文件。它可以是翻译文件,字符串资产文件,HTML文件等。
  • 输出包含文件中未显示的字符的字体

以下是代码:

#!/usr/bin/python2
import sys
import fontforge

if len(sys.argv) == 4:
    font = fontforge.open(sys.argv[1])

    f = open(sys.argv[2], "r")

    for i in f.read().decode("UTF-8"):
        font.selection[ord(i)] = True
    f.close()

    font.selection.invert()

    for i in font.selection.byGlyphs:
        font.removeGlyph(i)

    font.generate(sys.argv[3])
else:
    print "WARNING: Check the license of the source font\nbefore distributing the output font generated by this script.\nI'm not responsible for any legal issue caused by\ninappropriate use of this script!\n"
    print "Usage: {} [source font] [file with glyphs NOT to be removed] [output]".format(sys.argv[0])
    print "Example: {} /path/to/ukai.ttc chineseTranslation.txt ukaiStripped.ttf".format(sys.argv[0])

请注意,在某些字体上使用此脚本可能不合法。确保签出源字体的许可证。对于因使用此脚本生成的任何字体而导致的任何法律问题,我概不负责。

答案 1 :(得分:10)

FontTools有一个名为pyftsubset的程序

https://github.com/behdad/fonttools

使用类似这样的东西:

pyftsubset MyFont.otf --output-file=MyFontStripped.otf --unicodes-file=file-of-codes.txt

file-of-codes.txt包含代码列表,如:

U+09c78
U+09ce5
U+09ce7
U+09ce9
U+09ceb
U+09cec
U+09cf0
U+09cf3
U+09cf4
U+09cf6
...

答案 2 :(得分:4)

发表最新评论: 您可以一次性使用shift和命令键在左侧菜单(语言)中一次选择多个组。请注意,图像保持基本拉丁语(A-Z a-z)。 选择集后,单击字形窗口并选择全部(cmd-A)。如果这种情况有很多,那将需要一些时间。然后cmd-Delete并删除所有。 您只需要使用“类别”重复操作即可。然后导出.otf

Categories selection Languages selection

答案 3 :(得分:3)

一个10 MB的Opentype字体非常罕见,因为它非常重,所以我认为它是一种内部特定字体而不是商业字体。 要删除字形,您可以在FontForge(免费)或任何其他商业字体编辑器中编辑字体,然后重新生成.otf(也.ttf)

为了构建webfonts(我想你需要.ttf,.svg,.eot和.woff),你可以在本地使用几个免费工具:sfnt2woffttf2eotBatik SVG使用ttfautohint,您可以在进行转换之前改进字体在屏幕中的显示方式。

答案 4 :(得分:1)

今天就参加这个是因为我试图在CTRL + A之后保存字体并设置宽度(不要这样做,顺便说一句)。因为我已经在FontForge中打开了字体,所以我采用了更为简单的Python脚本编写方法。

这假定您已打开所需的字体并将其激活。它还假定您只想保留前128个字符(ASCII范围)。它选择所有内容,然后使用“较少”标志从0-127取消选择范围。看看FontForge Python scripting guide,了解更多有关操纵选择的不同方式的信息。

文件>执行脚本

font = fontforge.activeFont()
font.selection.all()
font.selection.select(("ranges","less"),0,127)
font.clear()

答案 5 :(得分:1)

正如其他人所指出的,您可以使用 fonttools 从字体中删除不需要的字形。

使用 pip 安装非常简单:

pip install fonttools

然后您可以使用 pyftsubset 函数将字体限制为字符子集。例如,如果您只想保留 basic latin 个字符(标点、数字、字母):

pyftsubset myFont.otf --output-file=mySmallerFont.otf --unicodes=U+0020-007E

也可以同时转换字体:

pyftsubset myFont.otf --output-file=mySmallerFont.woff --flavor=woff --unicodes=U+0020-007E

请注意,如果您需要转换为 woff2,则必须先安装 brotli,使用 pip install brotli

完整的文档可用 here

答案 6 :(得分:0)

fonttools已被Google采用:official docs。 我一直在使用它来减少https://github.com/googlei18n/fonttools中用于嵌入式系统的字形的数量。可以请客!

答案 7 :(得分:0)

@remeus's answer 启发了我,但我不想直接使用 pyftsubset.exefontTools.subset;我想使用该脚本,因为我可以轻松地向其中添加一些内容。

代码

import fontTools.subset
from pathlib import Path
import os

SOURCE_FILE = Path('YOUR.ttf') # ttf, otf, ...
OUT_FORMAT = 'woff' # otf, woff, woff2, ...
TEXT_FILE = Path('YOUR.txt')

def main():
    output_file = Path('temp') / Path(SOURCE_FILE.stem + '.' + OUT_FORMAT)
    output_file.parent.mkdir(parents=True, exist_ok=True)
    args = [SOURCE_FILE,
            f"--output-file={output_file}",
            # f"--text=中英文 abcdefg",
            f"--text-file={TEXT_FILE}",  # 中英文 abcdefg
            # "--unicodes=U+0020-007E",
            f"--flavor={OUT_FORMAT}",
            # ? https://github.com/fonttools/fonttools/blob/1df4f1e/Lib/fontTools/subset/__init__.py#L332-L337
            "--verbose=true", # https://github.com/fonttools/fonttools/blob/1df4f1e/Lib/fontTools/subset/__init__.py#L3015
            # "--xml=true",
            "--timing=true",
            ]
    fontTools.subset.main([str(_) for _ in args])
    os.startfile(output_file.parent)


if __name__ == "__main__":
    main()

解释

这里有三种方法可以指定你想要的子集

  1. --text:直接写

  2. --text-file:在文件中写入文本(重复也没关系,代码会自动为你删除)(我推荐这种方式。)

    示例:

    my.txt (utf-8)

    0123456
    abcdefg
    ABCDEFG
    中英文
    
  3. --unicodes:使用 unicode 范围

<块引用>

? 如果您需要转换为 woff2,则必须先安装 brotli,使用 pip install brotlicffi

原因:

其他问题

以下是间接问题。不想看的可以直接跳过这一段。

这是我的经验,我想在浏览器上使用字体,但出现如下错误

<块引用>

OTS 解析错误:网页字体超过 30MB

我的字体大小

  • 大小:40MB
  • 格式:ttf

所以,如果我将格式更改为 Woff 或 Woff2 可能会解决问题。

仍然可以再次使用 fontTools

<块引用>

TTFont(Path()).save(Path())

当你的文件很大时会花费太多时间。

fonttools