如何获得(web)字体中单个字符的大小?

时间:2011-05-26 12:12:42

标签: python fonts svg font-size

我编写了一个python脚本以生成SVG文件。此SVG文件使用Web字体(通过CSS从google webfonts导入)来很好地呈现我的文本。一切都很好,除了我需要知道一个句子的大小(以像素为单位),然后再将它放入我的SVG文件中。

几天前我开始学习python时,我不知道这种东西是否可行。 Google帮助我找到了ImageFont python模块(来自Python Imaging Library),但似乎ImageFont需要从本地路径加载字体文件才能计算字符大小。

是否有可能在Web字体上计算字符大小?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您可以使用javascript和SVG DOM在客户端实现它。

第一步:创建一个文本元素并使用getComputedTextLength()方法计算其长度(http://www.w3.org/TR/SVG11/text.html#InterfaceSVGTextContentElement

<text id="foo" xml:space="preserve">foo </text>

然后使用getTotalLength()方法计算路径长度(http://www.w3.org/TR/SVG11/paths.html#InterfaceSVGPathElement

您可以计算在文本被截断之前放置文本的次数。

答案 1 :(得分:0)

您每次都会使用相同的字体吗?如果是这样:获取字体的本地副本,在本地运行测试,并缓存它们(SQLite数据库?存储在Python模块中的宽度数组?这部分取决于您)。但是,请注意,由于kerning,句子的宽度可能与其字符宽度的总和不同。如果你想要准确,你需要计算句子本身的宽度。

这是否真的需要在服务器上完成?例如,如果您的客户端是Web浏览器,您可以使用jQuery的.width()方法来向浏览器询问元素的实际大小,或do some manipulation in your own JavaScript

更好的方法可能是设计一个更具“流动性”布局的SVG,并期望元素可以增长或缩小到任意大小,并使用像elementtext = elementtext[:100]这样的普通哑码将其长度限制为某些预定的阈值。基本上,确保它适用于最多一定数量的文本,然后确保您不会使用超过那么多文本。你没有使用独立宣言作为文字标签,对吗?