D3js:如何将svg文本转换为路径



是否有D3.js方法将文本元素转换为路径元素?

因此,当我掌握生成的svg时,我可以保持文本的形状。

在JavaScript(d3或任何其他工具)中无法访问有关系统或web字体中单个字母形状的矢量路径信息。这是SVG 2所要求的功能,但它的工作方式还没有明确的建议。

Lars Kotthoff链接的问题中描述的Raphael方法使用了一个已经转换为JavaScript的字体对象,使用了Cufon字体生成器实用程序。不幸的是,Cufon是为旧的IE-VML语言而设计的,而不是SVG,因此您需要添加额外的转换(或使用Raphael)来转换为SVG路径数据。

对于使用SVG,使用通用字体转换器工具将其转换为SVG字体,然后提取字形数据并将其转换(转换为正确的大小并翻转y轴)可能同样简单。或者,如果你在服务器上工作,你可以考虑使用一个低级的图形库,比如Cairo,它可以进行文本到路径的转换。不幸的是,浏览器中对SVG字体的支持非常差,以至于您无法使用它直接嵌入字体数据。(即使假设您有权分发字体,但由于其他原因没有使用网络字体)。

更新:评论中提到Inkscape提醒我,Inkscap还有一个用于转换/导出SVG文件的命令行界面。您可以在服务器工作流中使用它;文本到路径是导出选项之一。你必须想办法设置它,这样服务器上的Inkscape程序就可以访问完整的字体,然后用以下选项将d3例程创建的SVG通过Inkscap进行切换:

inkscape TEMP.FILENAME --export-plain-svg=FILENAME --export-text-to-path

DOM中唯一的文本到图像选项是HTML画布;您可以在画布上书写,然后获取图像数据。但这将是一个PNG图像,而不是矢量。

然而,我也敦促您考虑是否真的需要特定字体中字母的确切形状,以及是否值得失去将文本用作文本所带来的功能、可访问性和SEO优势。

有一个名为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);

尝试我的lib-svg文本到路径

  • 支持otf/ttf字体
  • 与谷歌字体集成
  • 支持tspan
  • 不同字体库
  • 支持CSS文本锚和主要基线属性
  • 支持nodejs和浏览器运行时

上面提到的所有文本到svg节点模块都使用opentype.js

我决定直接使用它并取得巨大成功:

https://github.com/opentypejs/opentype.js#pathtosvgdecimalplaces

最新更新