如何在SVG中自动缩小文本?

时间:2011-03-28 17:18:03

标签: svg xsl-fo inkscape

我有一个我用Inkscape创建的SVG元素。然后,我将该SVG作为XSL-FO样式表的一部分放入,该样式表用于转换XML数据,然后通过IBEX渲染器创建pdf(通常随后打印)。例如,我在svg / stylesheet中的元素看起来像这样(由于Inkscape导出而产生额外的噪音):

<text x="114" x="278.36218" id="id1" xml:space="preserve" style="big-long-style-string-from-inkscape">
    <tspan x="114" y="278.36218" id="id2" style="style-string">
        <xsl:value-of select="Alias1"/>
    </tspan>
</text>

我的问题在于我不知道这个文本区域有多大。对于这个特殊的一个,我在SVG的文本右侧有一个图像。但是,如果此字符串是允许的最大W数,则它太长并且会覆盖图像。我想要的(在一个完美的世界中)是一种方法来告诉它我希望文本块有多少像素宽,然后让它自动使文本更小,直到它适合该区域。如果我不能这样做,截断文本也会有效。作为最后的沟渠,我将使用固定宽度的字体并在XML生成中自己进行字符串截断,尽管这会产生一些不太可用且不太漂亮的东西。

我已经探索了SVG文档,并查看了flowRegions以及路径,但似乎都不是我想要的(也许它们是)。如果有帮助,这就是Inkscape生成的样式字符串:

"font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

你有任意行长度的文本(以字符表示),你想缩放它以适应固定数量的空间吗?我可以想到将文本重新缩放到固定大小的唯一方法是将其放在svg元素中,然后将SVG缩放到该大小:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <title>Resizing Text</title>
  <defs>
    <svg id="text-1" viewBox="0 0 350 20">
      <text id="text-2" x="0" y="0" fill="#000" alignment-baseline="before-edge">It's the end of the world as we know it, and I feel fine!</text>
    </svg>
  </defs>
  <rect x="500" y="100" width="200" height="40" fill="#eee" />
  <use  x="510" y="110" width="180" height="20" xlink:href="#text-1" />
</svg>

但是,如上所示,封装viewBox元素上的svg需要设置为文本的宽度,您可能不知道。

如果您在具有可用脚本的用户代理(例如Web浏览器)中引用此SVG,那么您可以轻松编写脚本以捕获text or tspan element的宽度并设置{ {1}}相应的。