Рисование SVG-текста в Python

Краткий ответ: Чтобы рисовать SVG-текст в Python, создайте элемент <text> с create_element_ns(), задайте атрибуты x, y, font-family, font-size, fill и text-anchor через set_attribute(), установите text_content, добавьте текст в корень SVG и сохраните документ.

1from aspose.svg import SVGDocument
2
3with SVGDocument() as document:
4    text = document.create_element_ns("http://www.w3.org/2000/svg", "text")
5    text.set_attribute("x", "20")
6    text.set_attribute("y", "40")
7    text.text_content = "Hello SVG"
8    document.root_element.append_child(text)
9    document.save("text.svg")

В этой статье вы узнаете, как:

SVG-текст остается настоящим текстом в SVG-разметке. Его можно выделять, искать, локализовать, стилизовать и позже редактировать. Если нужно преобразовать текст в векторные контуры для финальной графики или вывода, не зависящего от установленных шрифтов, используйте векторизацию текста. Для более широкой справки по SVG-разметке смотрите руководство SVG Text.

Основы SVG-текста

Атрибут или элементНазначение
x, yЗадают положение базовой линии текста
font-familyУказывает нужное семейство шрифтов
font-sizeЗадает размер текста в единицах SVG
fillЗадает цвет текста
text-anchorВыравнивает текст относительно координаты x
<tspan>Добавляет позиционированные фрагменты или простой многострочный текст

Как рисовать SVG-текст в Python

Используйте этот рабочий процесс, когда генерируемой SVG-графике нужны метки, подписи, бейджи или текст внутри диаграмм:

  1. Создайте или загрузите SVGDocument.
  2. Задайте для корневого SVG width, height и viewBox, если создаете новый документ.
  3. Создайте элемент <text> с create_element_ns().
  4. Задайте атрибуты позиции и стиля, такие как x, y, font-size, font-family, fill и text-anchor, с set_attribute().
  5. Задайте text_content или добавьте дочерние элементы <tspan>.
  6. Добавьте текстовый элемент в корень SVG с append_child() и сохраните документ через document.save().

Создать простую текстовую метку SVG

Следующий пример создает небольшую SVG-метку с фоновым прямоугольником и текстом по центру. Используйте text-anchor="middle", когда координата x должна обозначать горизонтальный центр текста.

 1import os
 2from aspose.svg import SVGDocument
 3
 4namespace_uri = "http://www.w3.org/2000/svg"
 5
 6output_folder = "output/"
 7output_path = os.path.join(output_folder, "svg-text-label.svg")
 8os.makedirs(output_folder, exist_ok=True)
 9
10with SVGDocument() as document:
11    svg = document.root_element
12    svg.set_attribute("width", "320")
13    svg.set_attribute("height", "120")
14    svg.set_attribute("viewBox", "0 0 320 120")
15
16    background = document.create_element_ns(namespace_uri, "rect")
17    background.set_attribute("x", "24")
18    background.set_attribute("y", "24")
19    background.set_attribute("width", "272")
20    background.set_attribute("height", "72")
21    background.set_attribute("rx", "12")
22    background.set_attribute("fill", "#f7f7fb")
23    background.set_attribute("stroke", "#546e7a")
24    background.set_attribute("stroke-width", "3")
25    svg.append_child(background)
26
27    label = document.create_element_ns(namespace_uri, "text")
28    label.set_attribute("x", "160")
29    label.set_attribute("y", "68")
30    label.set_attribute("text-anchor", "middle")
31    label.set_attribute("font-family", "Arial, sans-serif")
32    label.set_attribute("font-size", "26")
33    label.set_attribute("font-weight", "700")
34    label.set_attribute("fill", "#263238")
35    label.text_content = "SVG Text"
36    svg.append_child(label)
37
38    document.save(output_path)

Положение текста по вертикали контролируется базовой линией y, а не верхним краем букв. Если нужно точное визуальное центрирование по вертикали, подберите значение y или используйте метрики шрифта в собственной логике раскладки.

Иллюстрация показывает результат: скругленный прямоугольник служит простым фоном метки, а text-anchor="middle" выравнивает подпись SVG Text относительно центральной x-координаты.

Центрированная SVG-метка SVG Text внутри скругленного прямоугольника, созданная с Aspose.SVG for Python

Создать многострочный SVG-текст с помощью <tspan>

Используйте <tspan>, когда одному текстовому блоку нужны несколько строк или независимо позиционированные фрагменты. Следующий пример создает один элемент <text> и добавляет в него два дочерних <tspan> с разными позициями y.

 1import os
 2from aspose.svg import SVGDocument
 3
 4namespace_uri = "http://www.w3.org/2000/svg"
 5
 6output_folder = "output/"
 7output_path = os.path.join(output_folder, "svg-multiline-text.svg")
 8os.makedirs(output_folder, exist_ok=True)
 9
10with SVGDocument() as document:
11    svg = document.root_element
12    svg.set_attribute("width", "400")
13    svg.set_attribute("height", "120")
14    svg.set_attribute("viewBox", "0 0 400 120")
15
16    text = document.create_element_ns(namespace_uri, "text")
17    text.set_attribute("x", "200")
18    text.set_attribute("y", "48")
19    text.set_attribute("font-family", "Arial, sans-serif")
20    text.set_attribute("font-size", "22")
21    text.set_attribute("text-anchor", "middle")
22    text.set_attribute("fill", "#263238")
23
24    first_line = document.create_element_ns(namespace_uri, "tspan")
25    first_line.set_attribute("x", "200")
26    first_line.set_attribute("y", "48")
27    first_line.text_content = "Generated SVG Text"
28    text.append_child(first_line)
29
30    second_line = document.create_element_ns(namespace_uri, "tspan")
31    second_line.set_attribute("x", "200")
32    second_line.set_attribute("y", "84")
33    second_line.set_attribute("fill", "#2e86de")
34    second_line.text_content = "with Aspose.SVG for Python via .NET"
35    text.append_child(second_line)
36
37    svg.append_child(text)
38    document.save(output_path)

Обе строки принадлежат одному элементу <text>, но у каждого <tspan> есть собственная позиция и возможность переопределять атрибуты стиля, например fill.

Иллюстрация показывает двухстрочный SVG-текст. Первый <tspan> рисует темный заголовок, а второй <tspan> использует отдельную позицию y и синее значение fill для подзаголовка.

Двухстрочный SVG-текст, созданный с элементами tspan и разными значениями атрибута fill в Python

Распространенные ошибки и исправления

ПроблемаИсправление
Текст не виденЗадайте fill, проверьте x и y, убедитесь, что текст находится внутри viewBox
Текст выглядит слишком высоко или низкоПомните, что y задает базовую линию текста, а не верхний край
Выравнивание по центру не работаетЗадайте text-anchor="middle" и используйте нужный центр как значение x
Многострочный текст накладываетсяДайте каждому <tspan> отдельное значение y или осторожно используйте интервал dy
Текст отображается иначе на другом компьютереИспользуйте распространенные шрифты или преобразуйте финальную графику в векторные пути, если важна независимость от шрифтов

FAQ

Как добавить текст в SVG в Python?

Создайте элемент <text> с create_element_ns(), задайте атрибуты x, y, font-family, font-size и fill, установите text_content, добавьте элемент в корень SVG и сохраните SVG.

Как центрировать SVG-текст?

Задайте text-anchor="middle" и установите x в нужную горизонтальную центральную точку. Подберите y для положения базовой линии.

Можно ли создать многострочный SVG-текст?

Да. Используйте один элемент <text> с несколькими дочерними <tspan>. Задайте каждому <tspan> свои значения x и y или используйте контролируемый интервал dy.

Лучше рисовать SVG-текст или векторизовать текст?

Рисуйте обычный SVG-текст, когда текст должен оставаться редактируемым, доступным для поиска или локализации. Векторизуйте текст только для финальной графики, которая должна сохранять точные контуры глифов без зависимости от установленных шрифтов.

Связанные статьи