получить размер текста SVG в Python - PullRequest
5 голосов
/ 17 июля 2011

Я генерирую SVG-изображение на python (чистый, пока нет внешних библиотек). Я хочу знать, каков будет размер текстового элемента, прежде чем разместить его правильно. Любая хорошая идея, как это сделать? Я проверил библиотеку pysvg , но не увидел ничего подобного getTextSize ()

Ответы [ 2 ]

1 голос
/ 26 февраля 2015

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

Это неуклюже, но это сработало

1 голос
/ 26 августа 2012

Это может быть довольно сложно.Для начала вам необходимо ознакомиться с главой по тексту спецификации SVG.Предполагая, что вы хотите получить ширину простых text элементов, а не textpath элементов, как минимум вам потребуется:

  • Анализировать свойства выбора шрифта , интервальные свойства и чтение атрибута xml:space, а также свойство writing-mode (также может быть сверху вниз вместо просто слева направо и справа налево).
  • На основании вышеизложенного откройте правильный шрифт, прочитайте данные глифа и извлеките ширину и высоту глифов в вашей текстовой строке.Поиск шрифта в одиночку может быть большой задачей, так как можно найти несколько мест, где могут скрываться файлы шрифтов.
  • (опционально) Просмотрите строку на предмет возможных лигатур (в зависимости от языка) изамените их на правильный глиф, если он существует в шрифте.
  • Добавьте ширину для всех символов и пробелов, причем последний зависит от свойств пробелов и (необязательно) возможных кернинг пар.

Возможным решением будет использование библиотеки pango .Вы можете найти привязки к нему в py-gtk .К сожалению, за исключением некоторых примеров , документация для привязок python довольно скудна.Но он позаботится о деталях загрузки шрифта и определения экстентов Layout.

Другой способ - изучить SVG-рендерер в вашем браузере.Но, например, поддержка текста SVG в Firefox ограничена .

Также поучительно изучить, как это делает TeX , особенно концепция (pdf) коробки (для букв) и клей (для пробелов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...