使用 svgwrite for python 时如何确定文本宽度和高度?

uda*_*sha 7 python svg

我想提取文本对象(svgwrite.Drawing.Text)的像素大小,因为它在使用给定样式进行格式化后会出现在文件中。我的字体是固定宽度的(Courier New)。

我需要它的原因是我想将一个字符串打印到SVG文件,然后在结果文本上映射一些信息:例如我有一个字符串“ABCDEF”,外部智者告诉我应该标记“BCD”部分。然后我需要知道两个维度上的符号“A”和符号“BCD”覆盖了多少像素(单位?),然后绘制一个彩色矩形,或透明框架,或严格位于“BCD”部分下方的任何内容。

所以我有以下代码,我希望使用类似“ w = text1.width ”的东西来提取宽度,但它不能以这种方式工作。预先感谢您尝试回答我的问题。

import svgwrite
my_svg = svgwrite.Drawing(filename = "dasha.svg", size = ("800px", "600px"))
text_style = "font-size:%ipx; font-family:%s" % (12, "Courier New") 
text1 = my_svg.text("HELLO WORLD", insert=(0, 0), fill="black", style=text_style)
my_svg.add(text1)
my_svg.save()
Run Code Online (Sandbox Code Playgroud)

UPD1 [22.06.2014]:我目前使用的中间解决方案是在 Inkscape 中手动测量具有特定字体和大小的字母的高度和宽度。我尽力了,但我不确定这些值是否完美,现在我无法更改程序中的字体大小。

小智 -1

我不是 svg 专家,但据我了解,很难确定 svg 中的字符和文本宽度。这意味着 svgwrite 也无法做到这一点。我所做的是为字符选择固定宽度,并从前一个字符的开头开始分别创建固定宽度的每个字符。您还可以考虑使用 text_anchor='middle' 将字符串(即每个字符)居中。如果角色以点为中心,则可以创建一个也以该点为中心的框。

另请参见http://www.w3.org/TR/SVG/text.html ,其中指出“在许多情况下,从字符映射到字形的算法是依赖于系统的,导致文本的渲染可能会受到影响。在不同的用户环境中查看时(通常略有不同)。如果 SVG 内容的作者需要精确选择字体和字形,则建议提供必要的字体(可能进行子集化以仅包括给定文档所需的字形)作为嵌入 SVG 内容中的 SVG 字体,或者作为发布在与 SVG 内容相同的 Web 位置的 WebFonts([CSS2],第 15.1 节)。”