首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python中获取svg文本大小

在python中获取svg文本大小
EN

Stack Overflow用户
提问于 2011-07-17 11:58:19
回答 2查看 2K关注 0票数 5

我在python中生成SVG映像(纯的,还没有外部库)。在正确放置文本元素之前,我想知道文本元素的大小。有什么好办法吗?我检查了pysvg库,但没有看到类似于getTextSize()的东西。

EN

回答 2

Stack Overflow用户

发布于 2012-08-25 23:31:00

这可能会很复杂。首先,您必须熟悉SVG规范的关于文本的章节。假设您希望获得普通text元素的宽度,而不是textpath元素的宽度,那么至少您必须:

  • 解析字体选择属性间距特性并读取xml:space attibute以及writing-mode属性(也可以是自上而下的,而不仅仅是从左到右和从右到左)。
  • 基于以上所述,打开正确的字体,读取字形数据,并提取文本字符串中的象形文字的宽度和高度。单独找到字体可能是一项艰巨的任务,可以看到字体文件可以隐藏的多个地方。
  • (可选)查看字符串中是否存在可能的结扎 (取决于语言),如果字体中存在正确的字形,则用正确的字形替换它们。
  • 为所有字符和空格添加宽度,后者取决于间距属性和(可选)可能的角化对。

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

另一种方法是在浏览器中研究SVG渲染器。但是,例如,火狐中对SVG文本的支持是有限

另外,研究TeX是如何做到这一点的,特别是用于字母和胶水的概念 (pdf)。

票数 1
EN

Stack Overflow用户

发布于 2015-02-26 11:54:31

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

我发现,使用DPI 90绘制一幅图,似乎给出了我所需要的确切数字,或者svgwrite作为一个整体使用的本地数字。-D是要使用的标志,因此只呈现可绘制元素,即文本。

代码语言:javascript
复制
os.cmd(/cygdrive/c/Program\ Files\ \(x86\)/Inkscape/inkscape.exe -f work_temp.svg -e work_temp.png -d 90 -D)

我使用这些函数提取在这个链接中找到的png数字,注意,对于python3 (仍在python2中工作),我的函数略有更正。

代码语言:javascript
复制
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)

它很笨重,但起作用了

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6723669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档