我尝试在 fontforge 存储库的 github 讨论中提出这个问题,但似乎没有人回答它。 我正在使用 fontforge 为 php 实用程序生成 SVG 字体,该实用程序从文本字符串生成 SVG 文件。
由于我还尝试制作一个基于 Web 的 GUI 来更轻松地生成这些文件,因此我还使用 fontforge 来生成 WOFF* 等效项。
虽然最终形式将使用生成脚本,但最初我使用的是 fontforge GUI,并注意到它创建/建议了统一的“输出”文件名。
例如对于 Arial.ttf,输出文件名为 ArialMT.woff 或 ArialMT.svg。 我还注意到 SVG 文件中将“fontid”属性设置为相同的值。
但是,查看标题(在 fontforge 的“元素”选项卡中以及在 php 中使用多个 ttf-meta 解析库)我似乎找不到该值来自的 1 对 1 字段。 所以我怀疑 fontforge 本身正在清理其他一些字段以得出这个值。
我希望找出提出此名称的方法所遵循的“规则”(或者如果该值隐藏在其他地方,则在哪里找到它),以便我可以在脚本中生成与以下内容一致的名称GUI 生成的名称。
有谁知道 fontforge 是如何提出文件名/字体 ID 的建议的?
查看 ttf 标头、fontforge“元素”选项卡,使用多个 php ttf 库工具转储元详细信息。
根据Heirstrietzel的建议,我找到了一个更好的解决方案,可以使用opentype.js在浏览器或node.js中直接转换字体。 它应该避免必须完全存储不同版本的字体或为它们命名。 从浏览器端来看,它的核心是使用浏览器版本的 opentype.js 的异步函数。
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/opentype.min.js"></script>
<script type="application/ecmascript">
function roundTwo(num) { return Math.round(num * 100) / 100; }
async function svgFont(fontname='ArialMT', text=null, fontSize=24) {
if(text === null) text = fontname;
let fonturl = './fonts/' + fontname + '.ttf';
let buffer = await (await fetch(fonturl)).arrayBuffer();
let font = opentype.parse(buffer);
let pathOT = font.getPath(text, 0, fontSize, fontSize);
let bb = pathOT.getBoundingBox();
let newSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
newSvg.setAttribute('viewBox', [ roundTwo(bb.x1-1), roundTwo(bb.y1-1), roundTwo(bb.x2-bb.x1+2), roundTwo(bb.y2-bb.y1+1) ].join());
let newPath = document.createElementNS('http://www.w3.org/2000/svg', 'path');
newPath.setAttribute('d', pathOT.toPathData());
newSvg.appendChild(newPath);
return newSvg.outerHTML;
}
</script>