我想要提取文本对象 (svgwrite.Drawing.Text)的像素大小,因为它将在格式化后以给定的样式出现在文件中。我的字体是固定宽度(快递新)。
我之所以需要它,是因为我想将一个字符串打印到SVG文件中,然后在结果文本上映射一些信息:例如,我有一个字符串"ABCDEF“,外部智者告诉我,应该标记"BCD”部分。那么我需要知道多少像素(单位?)在两个维度上都覆盖符号"A“和符号"BCD”,然后绘制一个彩色矩形或透明框架,或任何严格在"BCD“部分下的内容。
所以我有下面的代码,我希望使用类似于"w = text1.width“之类的东西来提取宽度,但是它不是这样工作的。谢谢你提前回答我的问题。
import svgwrite
my_svg = svgwrite.Drawing(filename = "dasha.svg", size = ("800px", "600px"))
text_style = "font-size:%ipx; font-family:%s" % (12, "Courier New")
text1 = my_svg.text("HELLO WORLD", insert=(0, 0), fill="black", style=text_style)
my_svg.add(text1)
my_svg.save()UPD1 22.06.2014:我目前使用的中间解决方案是在Inkscape中使用特定字体和大小来测量字母的高度和宽度。我尽了最大努力,但我不确定这些值是否完美,现在我无法在程序中更改字体大小。
发布于 2017-10-10 18:13:01
我想以特定字体确定svgwrite中文本的宽度。最后,我使用了来自http://blog.mathieu-leplatre.info/text-extents-with-python-cairo.html的以下解决方案
def textwidth(text, fontsize=14):
try:
import cairo
except Exception, e:
return len(str) * fontsize
surface = cairo.SVGSurface('undefined.svg', 1280, 200)
cr = cairo.Context(surface)
cr.select_font_face('Arial', cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_BOLD)
cr.set_font_size(fontsize)
xbearing, ybearing, width, height, xadvance, yadvance = cr.text_extents(text)
return width它将cairo作为依赖项引入,但它是我迄今为止发现的最干净、与平台无关的解决方案。
发布于 2015-02-26 11:47:09
我有同样的问题,但我有一个可变宽度字体。我通过获取我想要的文本元素(正确的字体和内容)来解决这个问题,并将其写入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)它很笨重,但起作用了
发布于 2018-01-22 18:08:45
最后我用了Tkinter:
try:
# for Python2
import Tkinter
except ImportError:
# for Python3
import tkinter as Tkinter
try:
import tkFont
except ImportError:
import tkinter.font as tkFont
def get_text_metrics(family, size, text):
# initialize Tk so that font metrics will work
tk_root = Tkinter.Tk()
font = None
font = tkFont.Font(family=family, size=size)
assert font is not None
(w, h) = (font.measure(text), font.metrics('linespace'))
return (w, h)https://stackoverflow.com/questions/24337531
复制相似问题