在python中获取svg文本大小

时间:2011-07-17 11:58:20

标签: python svg

我在python中生成SVG图像(纯,没有外部库)。在我正确放置它之前,我想知道文本元素的大小。有什么好主意如何制作它?我检查了 pysvg 库,但我没有看到像 getTextSize()

2 个答案:

答案 0 :(得分:1)

这可能非常复杂。首先,您必须熟悉SVG规范的chapter on text。假设您希望获得普通text元素的宽度,而不是textpath元素,则至少需要:

  • 解析font selection propertiesspacing properties并阅读xml:space attibute以及writing-mode属性(也可以是上下而不是左上角)从右到右)。
  • 根据以上所述,打开正确的字体,读取字形数据并提取文本字符串中字形的宽度和高度。单独查找字体可能是一项重大任务,查看字体文件可隐藏的多个位置。
  • (可选)查看字符串中可能的ligatures(取决于语言),并将其替换为字体中存在的正确字形。
  • 添加所有字符和空格的宽度,后者取决于间距属性和(可选)可能的kerning对。

可能的解决方案是使用pango库。您可以在py-gtk中找到它的python绑定。不幸的是,除了一些examples之外,python绑定的文档非常缺乏。但它会处理字体加载的细节并确定Layout的范围。

另一种方法是在浏览器中研究SVG渲染器。但是例如Firefox中对SVG文本的支持是limited

同样具有启发性的是研究TeX如何做到这一点,尤其是盒子的<{3}}(pdf)(用于字母)和 glue (间距)。

答案 1 :(得分:1)

我有同样的问题,但我有一个可变宽度的字体。我通过获取我想要的文本元素(正确的字体和内容),将其写入svg文件,并使用安装在我的PC上的Inkscape来将绘图转换为临时png文件来解决它。然后我回读了png文件的大小(从标题中提取),删除了临时svg和png文件,并使用结果将文本放在我想要的位置和周围的元素。

我发现渲染到绘图,使用90的DPI似乎给了我所需的确切数字,或者整个svgwrite中使用的原生数字。 -D是要使用的标志,以便只渲染可绘制元素,即文本。

os.cmd(/cygdrive/c/Program\ Files\ \(x86\)/Inkscape/inkscape.exe -f work_temp.svg -e work_temp.png -d 90 -D)

我使用这些函数来提取png数字,在link找到,注意我的python3略有修正(仍然在python2中工作)

def is_png(data):
    return (data[:8] == b'\x89PNG\r\n\x1a\n'and (data[12:16] == b'IHDR'))

def get_image_info(data):
    if is_png(data):
        w, h = struct.unpack('>LL', data[16:24])
        width = int(w)
        height = int(h)
    else:
        raise Exception('not a png image')
    return width, height

if __name__ == '__main__':
    with open('foo.png', 'rb') as f:
        data = f.read()

    print is_png(data)
    print get_image_info(data)

它很笨重,但它起作用了