У меня была точно такая же проблема, но у меня был шрифт переменной ширины. Я решил это, взяв нужный текстовый элемент (правильный шрифт и содержимое), записал его в файл svg и использовал Inkscape, установленный на моем ПК, для визуализации чертежа во временный файл png. Затем я зачитал размеры файла png (извлеченного из заголовка), удалил файлы temp 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)
Это неуклюже, но это сработало