我不能完全相信这个问题没有专门针对OpenType字体,但有没有人知道从这些字体中删除字形的方法?
我有一个非常大的文件大小(几乎10MB)的.OTF,我需要缩小它。原因有两个。
1)我正在尝试为网页嵌入做准备,因此文件越小,对客户来说就越容易。
2)Font Squirrel(用于轻松准备字体文件)有2MB上传限制 - 我知道有其他选择,但到目前为止还没有成功。为了节省浪费时间的人,我尝试失败的是http://fontface.codeandmore.com/和http://www.font2web.com/。 CodeAndMore.com似乎有效,但它吐出的字体与我给它的字体完全不同。
请注意我不是字体专家,所以请轻松回答。
答案 0 :(得分:18)
创建了一个回答此问题的帐户。我知道这是一个老问题。但是得到一个迟到的答案比没有答案更好。
我刚遇到类似的问题。显然,没有Googlable解决方案。因此,我编写了一个带fontforge library的Python2脚本,执行以下操作:
以下是代码:
#!/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
答案 3 :(得分:3)
一个10 MB的Opentype字体非常罕见,因为它非常重,所以我认为它是一种内部特定字体而不是商业字体。 要删除字形,您可以在FontForge(免费)或任何其他商业字体编辑器中编辑字体,然后重新生成.otf(也.ttf)
为了构建webfonts(我想你需要.ttf,.svg,.eot和.woff),你可以在本地使用几个免费工具:sfnt2woff,ttf2eot,Batik 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()
这里有三种方法可以指定你想要的子集
--text
:直接写
--text-file
:在文件中写入文本(重复也没关系,代码会自动为你删除)(我推荐这种方式。)
示例:
my.txt (utf-8)
0123456
abcdefg
ABCDEFG
中英文
--unicodes
:使用 unicode 范围
? 如果您需要转换为 woff2,则必须先安装 brotli,使用 pip install brotlicffi。
原因:
brotlicffi
,所以我推荐 pip install brotlicffi
而不是 brotli)以下是间接问题。不想看的可以直接跳过这一段。
这是我的经验,我想在浏览器上使用字体,但出现如下错误
<块引用>OTS 解析错误:网页字体超过 30MB
我的字体大小
所以,如果我将格式更改为 Woff 或 Woff2 可能会解决问题。
仍然可以再次使用 fontTools
<块引用>当你的文件很大时会花费太多时间。