我在python中生成SVG映像(纯的,还没有外部库)。在正确放置文本元素之前,我想知道文本元素的大小。有什么好办法吗?我检查了pysvg库,但没有看到类似于getTextSize()的东西。
发布于 2012-08-25 23:31:00
这可能会很复杂。首先,您必须熟悉SVG规范的关于文本的章节。假设您希望获得普通text元素的宽度,而不是textpath元素的宽度,那么至少您必须:
xml:space attibute以及writing-mode属性(也可以是自上而下的,而不仅仅是从左到右和从右到左)。一个可能的解决方案是使用潘戈库。您可以在py-gtk中找到它的python绑定。不幸的是,除了一些示例之外,关于python绑定的文档非常缺乏。但是它会处理字体加载的细节和确定Layout的范围。
另一种方法是在浏览器中研究SVG渲染器。但是,例如,火狐中对SVG文本的支持是有限。
另外,研究TeX是如何做到这一点的,特别是用于字母和胶水的概念 (pdf)。
发布于 2015-02-26 11:54:31
我有同样的问题,但我有一个可变宽度字体。我通过获取我想要的文本元素(正确的字体和内容)来解决这个问题,并将其写入svg文件,并使用安装在我的PC上的Inkscape将绘图呈现为一个临时的png文件。然后,我返回png文件的大小(从标题中提取),删除临时svg和png文件,并使用结果将文本放置在我想要的位置以及周围的元素。
我发现,使用DPI 90绘制一幅图,似乎给出了我所需要的确切数字,或者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)它很笨重,但起作用了
https://stackoverflow.com/questions/6723669
复制相似问题