有没有一种D3.js的方法可以将文本元素转换为路径元素?
这样,当我获取生成的SVG时,我可以保留我的文本形状。
有没有一种D3.js的方法可以将文本元素转换为路径元素?
这样,当我获取生成的SVG时,我可以保留我的文本形状。
在JavaScript(d3或任何其他工具)中,无法访问系统或Web字体中单个字母形状的矢量路径信息。这是SVG 2的一个请求功能,但目前没有确定如何实现它的提案。
Raphael方法在Lars Kotthoff链接的问题中描述使用已转换为JavaScript的字体对象,使用Cufon字体生成器实用程序。不幸的是,Cufon是为旧版IE VML语言而设计的,而不是SVG,因此您需要添加额外的转换(或使用Raphael)来将其转换为SVG路径数据。
如果要使用SVG,可以使用通用字体转换工具将其转换为SVG字体,然后提取字形数据并进行转换(到正确的大小和翻转y轴)。或者,如果您正在服务器上工作,可以考虑使用低级别的图形库,如Cairo,它可以进行文本到路径转换。不幸的是,浏览器中对SVG字体的支持非常差,无法直接使用它来嵌入字体数据。(即使您有分发字体的权利,但由于其他原因而不使用Web字体)。
更新:评论中提到Inkscape让我想起了Inkscape也有一个命令行界面来转换/导出SVG文件。您可能可以在服务器工作流程中使用它;文本到路径是其中一种导出选项。您必须找到一种方法来设置它,以便您服务器上的Inkscape程序可以访问完整的字体,然后通过您的d3例程创建的SVG通过Inkscape进行穿梭,并使用以下选项:
inkscape TEMP.FILENAME --export-plain-svg=FILENAME --export-text-to-path
有一个名为text-to-svg的节点模块声称可以做到这一点:
将文本转换为SVG路径,无需原生依赖。
const TextToSVG = require('text-to-svg');
const textToSVG = TextToSVG.loadSync();
const attributes = {fill: 'red', stroke: 'black'};
const options = {x: 0, y: 0, fontSize: 72, anchor: 'top', attributes: attributes};
const svg = textToSVG.getSVG('hello', options);
console.log(svg);
试试我的库 - svg-text-to-path
let session = new Session('');
await session.replaceAll();
console.log(session.getSvgString());
目前不支持<textPath>
。 - PaulZihttps://github.com/opentypejs/opentype.js#pathtosvgdecimalplaces