我在python中生成SVG图像(纯,没有外部库)。在我正确放置它之前,我想知道文本元素的大小。有什么好主意如何制作它?我检查了 pysvg 库,但我没有看到像 getTextSize()
答案 0 :(得分:1)
这可能非常复杂。首先,您必须熟悉SVG规范的chapter on text。假设您希望获得普通text
元素的宽度,而不是textpath
元素,则至少需要:
xml:space
attibute以及writing-mode
属性(也可以是上下而不是左上角)从右到右)。可能的解决方案是使用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)
它很笨重,但它起作用了