【问题标题】:Manipulating/translating <text> in SVG (adding a bounding box)在 SVG 中操作/翻译 <text>(添加边界框)
【发布时间】:2026-02-13 16:10:01
【问题描述】:

问题:我们需要复制在 RaphaelJS 中创建的 SVG 文本,在 SVG 中具有可变的 font-face、font-size、position、scale、rotation。

但是... Raphael 对文本使用边界框,其高度与字符串的实际高度无关。边界框的高度基于 font-size 和 font-family,但与实际字符串无关。所以一串“Y”和“,”(具有相同的font-face和font-size)具有相同的高度。

当我们在 SVG 中重新创建文本(通过在 PHP 中生成它)时,我们可以得到正确的字体大小和正确的字体系列。然而,SVG 的高度并不独立于实际的字符串。所以“,”的高度会比“Y”低得多。这种高度差异会破坏旋转和定位。

问题:我们如何创建带有“边界框”的 svg,它可以复制 RaphaelJS 的 getBBox(本质上只是调整适合其中任何字符的框的大小),以便我们可以模拟旋转和定位来自 RaphaelJS? 注意:如果有帮助,我们可以为 SVG 转换 text->path。我们还可以访问字体文件。

编辑:问题已通过使用 matrix() 命令并直接转换转换得到解决,而不是应用定位、缩放、然后旋转。

【问题讨论】:

  • 精心设计的问题,+1。我只是不明白 PHP 示例中的边界框来自哪里(在 JS 示例中,您使用了 RaphaelJS 函数,那么在右边的示例中,当前使用什么来生成“错误”的边界框?)。
  • +1 也来自我,我也很想知道如何读取 PHP 边界框 (cc @CamiloMartin)。目前我正在使用inkscape,就像我使用explained here一样,但如果有更好的方法,我会很高兴。

标签: php javascript svg raphael


【解决方案1】:

如果您希望在 words:sentences 和您在服务器上生成的 SVG 中操作字符位置,那么您应该能够使用 SVG TSPAN 并定位字符位置。如果您可以将字母更改为路径,那么我认为该算法是可能的。没有什么可以阻止您为字母数字字体集创建一组相对位置。我希望上面的一些有用...

【讨论】: