在Python中获取SVG文本大小

5

我正在使用Python(纯净版,尚未使用外部库)生成SVG图像。在正确放置文本元素之前,我想知道文本元素的大小。有什么好的方法可以做到这一点吗?我查看了pysvg库,但是没有找到类似于getTextSize()的函数。

2个回答

1
这可能会相当复杂。首先,您需要熟悉SVG规范的文本章节。假设您想要获取纯文本text元素的宽度,而不是textpath元素,至少您需要:
解析字体选择属性间距属性和读取xml:space属性以及writing-mode属性(也可以是从上到下而不仅仅是从左到右和从右到左)。 基于以上内容,打开正确的字体,并读取文本字符串中字形数据并提取字形的宽度和高度。找到字体本身可能就是一项艰巨的任务,因为字体文件可能隐藏在多个位置。 (可选)查找可能存在的连字号(根据语言),如果字体中存在,则用正确的字形替换它们。 将所有字符和空格的宽度相加,后者取决于间距属性和(可选)可能存在的字距调整对。
一种可能的解决方案是使用 pango 库。您可以在 py-gtk 中找到它的 Python 绑定。不幸的是,除了一些 示例 之外,Python 绑定的文档非常缺乏。但它会处理字体加载的细节并确定 Layout 的范围。
另一种方法是研究浏览器中的 SVG 渲染器。但例如 Firefox 中对 SVG 文本的支持是 有限的
还有一个有益的方法是研究 TeX 如何实现,特别是 boxes(用于字母)和 glue(用于间距)的 概念(pdf)。

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数字,可以在链接中找到。请注意,我的代码已经针对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)

它很笨重,但它工作了


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接