Создание, загрузка и чтение SVG-файлов в C#

Это руководство показывает, как создавать, загружать и читать SVG-файлы в C# с помощью Aspose.SVG for .NET. Вы узнаете, как инициализировать SVGDocument из пустого документа, строкового содержимого, потока, локального файла, URL-адреса, а также как асинхронно загружать SVG-документы с внешними ресурсами.

Класс SVGDocument является точкой входа для работы с SVG-содержимым в Aspose.SVG for .NET. Он представляет корень иерархии SVG DOM, содержит весь контент документа и соответствует спецификациям W3C SVG 2.0 и WHATWG DOM.

SVG-файлы можно создавать и загружать:

Следующие примеры C# демонстрируют наиболее распространенные конструкторы SVGDocument и сценарии загрузки.

Быстрый старт: создание SVG-документа в C#

Самый быстрый способ создать SVG-документ – передать SVG-разметку строкой в конструктор SVGDocument. Это удобно, когда SVG-содержимое динамически генерируется в вашем приложении:

1using Aspose.Svg;
2...
3
4    string svgContent = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100\" height=\"100\"><circle cx=\"50\" cy=\"50\" r=\"40\" /></svg>";
5
6    using (SVGDocument document = new SVGDocument(svgContent, "."))
7    {
8        document.Save("circle.svg");
9    }

Создание пустого SVG-документа

Aspose.SVG for .NET API предоставляет класс SVGDocument, который можно использовать для создания пустого документа с помощью конструктора по умолчанию. После создания объект документа можно позже заполнить SVG-элементами. В следующем фрагменте кода C# показано использование конструктора по умолчанию SVGDocument() для создания SVG-документа.

1using Aspose.Svg;
2...
3
4    // Initialize an empty SVG document
5    using (SVGDocument document = new SVGDocument())
6    {
7        // Work with the SVG document here...
8    }

Если вы хотите сохранить созданный пустой SVG-документ в файл, используйте следующий фрагмент кода C#:

1using Aspose.Svg;
2using System.IO;
 1// Create an empty SVG document using C#
 2
 3// Prepare an output path to save a document
 4string documentPath = Path.Combine(OutputDir, "empty.svg");
 5
 6// Initialize an empty SVG document
 7using (SVGDocument document = new SVGDocument())
 8{
 9    // Work with the SVG document here...
10
11    // Save the document to a file
12    document.Save(documentPath);
13}

Подробнее о сохранении SVG-файлов см. в разделе Сохранить SVG-документ. В статье Редактировать SVG-файл вы узнаете, как редактировать SVG с помощью библиотеки Aspose.SVG for .NET, и найдете подробные примеры добавления новых элементов в SVG-документы и применения SVG-фильтров к растровым изображениям.

Создание SVG из строки в памяти

Используйте конструктор SVGDocument(string, string), когда SVG-разметка уже находится в памяти, например после генерации приложением или получения из базы данных, API либо пользовательского ввода.

Второй аргумент конструктора – базовый URI. Aspose.SVG использует его для разрешения относительных путей внутри SVG, например связанных изображений, CSS-файлов или шрифтов. Если SVG-разметка не ссылается на внешние ресурсы, можно передать ".", как показано в примере быстрого старта выше. Если ссылки есть, передайте папку или URL, где находятся эти ресурсы:

 1using Aspose.Svg;
 2using System.IO;
 3...
 4
 5    // SVG markup contains a relative reference to an external image
 6    string documentContent = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"200\" height=\"120\"><image href=\"images/logo.png\" width=\"200\" height=\"120\" /></svg>";
 7
 8    // Relative paths in the SVG are resolved against this base URI
 9    string baseUri = Path.Combine(DataDir, "assets") + Path.DirectorySeparatorChar;
10
11	// Initialize an SVG document from a string content
12	using (SVGDocument document = new SVGDocument(documentContent, baseUri))
13	{
14	    // Work with the document here...
15	}

Загрузка SVG из потока

Чтобы загрузить SVG из потока, используйте один из конструкторов SVGDocument(), принимающих объект Stream. Этот подход полезен для чтения SVG из загруженных пользователем файлов, встроенных ресурсов, буферов памяти и других источников, которые не являются обычными файлами:

 1using Aspose.Svg;
 2using System.IO;
 3...
 4
 5    //Prepare a path to a file required for a FileStream object creating
 6    string documentPath = Path.Combine(DataDir, "bezier-curves.svg");
 7
 8	// Create a FileStream object
 9	using (FileStream stream = new FileStream(documentPath, FileMode.Open, FileAccess.Read))
10	{
11	    // Initialize an SVG document from the stream
12		using (SVGDocument document = new SVGDocument(stream, "."))
13	    {
14	        // Work with the document
15	    }
16	}

Создание пользовательских SVG-документов с помощью SVG Builder API

SVG Builder API предлагает мощный и гибкий способ программно создавать SVG-документы. Используя класс SVGSVGElementBuilder, разработчики могут создавать сложную SVG-графику с детальными возможностями настройки. Подробнее см. в статье Расширенное создание и изменение SVG с помощью Aspose.SVG Builder API.

Ниже приведен пример создания пользовательского SVG-документа с различными графическими элементами:

1using System.IO;
2using Aspose.Svg;
3using Aspose.Svg.Builder;
4using System.Drawing;
 1// Create SVG using Builder API
 2
 3// Initialize an SVG document
 4using (SVGDocument document = new SVGDocument())
 5{
 6    // Create an <svg> element with specified width, height and viewBox, and add into it other required elements
 7    SVGSVGElement svg = new SVGSVGElementBuilder()
 8        .Width(100).Height(100)
 9        .ViewBox(-21, -21, 42, 42)
10        .AddDefs(def => def
11            .AddRadialGradient(id: "b", cx: .2, cy: .2, r: .5, fx: .2, fy: .2, extend: ev => ev
12                .AddStop(offset: 0, stopColor: Color.FromArgb(0xff, 0xff, 0xFF), stopOpacity: .7)
13                .AddStop(offset: 1, stopColor: Color.FromArgb(0xff, 0xff, 0xFF), stopOpacity: 0)
14            )
15            .AddRadialGradient(id: "a", cx: .5, cy: .5, r: .5, extend: ev => ev
16                .AddStop(offset: 0, stopColor: Color.FromArgb(0xff, 0xff, 0x00))
17                .AddStop(offset: .75, stopColor: Color.FromArgb(0xff, 0xff, 0x00))
18                .AddStop(offset: .95, stopColor: Color.FromArgb(0xee, 0xee, 0x00))
19                .AddStop(offset: 1, stopColor: Color.FromArgb(0xe8, 0xe8, 0x00))
20            )
21        )
22        .AddCircle(r: 20, fill: "url(#a)", stroke: Color.FromArgb(0, 0, 0), extend: c => c.StrokeWidth(.15))
23        .AddCircle(r: 20, fill: "b")
24        .AddG(g => g.Id("c")
25            .AddEllipse(cx: -6, cy: -7, rx: 2.5, ry: 4)
26            .AddPath(fill: Paint.None, stroke: Color.FromArgb(0, 0, 0), d: "M10.6 2.7a4 4 0 0 0 4 3", extend: e => e.StrokeWidth(.5).StrokeLineCap(StrokeLineCap.Round))
27        )
28        .AddUse(href: "#c", extend: e => e.Transform(t => t.Scale(-1, 1)))
29        .AddPath(d: "M-12 5a13.5 13.5 0 0 0 24 0 13 13 0 0 1-24 0", fill: Paint.None, stroke: Color.FromArgb(0, 0, 0), extend: e => e.StrokeWidth(.75))
30        .Build(document.FirstChild as SVGSVGElement);
31
32    // Save the SVG document
33    document.Save(Path.Combine(OutputDir, "face.svg"));
34}

Этот фрагмент кода создает SVG-документ со сложным дизайном и демонстрирует гибкость и возможности SVG Builder API для программной генерации пользовательской SVG-графики. В приведенном выше коде C# мы создаем SVG-документ с такими элементами, как круги, эллипсы, пути и градиенты. Сгенерированное SVG-изображение представляет улыбающееся лицо:

Смайлик – улыбающееся лицо – рендеринг файла face.svg

Загрузка SVG из локального файла

Чтобы загрузить SVG из файла bezier-curves.svg, используйте конструктор по умолчанию класса SVGDocument и передайте ему путь к файлу в качестве входного параметра.

 1using Aspose.Svg;
 2using System.IO;
 3...
 4
 5    // Prepare a path to a file loading
 6    string documentPath = Path.Combine(DataDir, "bezier-curves.svg");
 7
 8	// Load an SVG document from the file
 9	using (SVGDocument document = new SVGDocument(documentPath))
10	{
11	    // Work with the document
12	}

Загрузка SVG из Интернета

SVG также можно загружать напрямую из URL. Следующие примеры показывают, как создать SVGDocument из веб-адреса, указывающего на SVG-файл:

1using Aspose.Svg;
2...
3
4    // Load SVG from the Web at its URL
5    Url documentUrl = new Url("https://docs.aspose.com/svg/files/owl.svg");
6    using (SVGDocument document = new SVGDocument(documentUrl))
7    {
8        // Work with the SVG document here...
9    }
1using Aspose.Svg;
2...
3
4    // Load SVG from the Web at its URL
5    using (SVGDocument document = new SVGDocument(new Url("https://docs.aspose.com/svg/files/basic-shapes.svg")))
6    {
7        // Work with the SVG document here...
8    }

Если вы зададите неверный URL, к которому невозможно обратиться, библиотека выбросит DOMException со специализированным кодом NetworkError, чтобы сообщить, что выбранный ресурс не найден.

Асинхронная загрузка SVG с внешними ресурсами

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

Метод Navigate(Url) класса SVGDocument загружает документ из указанного URL в текущий экземпляр.

1using Aspose.Svg;
2using System.Threading;
 1// Load SVG asynchronously using C#
 2
 3Url documentUrl = new Url("https://docs.aspose.com/svg/files/owl.svg");
 4ManualResetEvent documentEvent = new ManualResetEvent(false);
 5
 6SVGDocument document = new SVGDocument();
 7
 8// Subscribe to the event 'OnReadyStateChange' that will be fired once the document is completely loaded
 9document.OnReadyStateChange += (sender, ev) =>
10{
11    if (document.ReadyState == "complete")
12    {
13        // Sets the state of the event to signaled to unblock the main thread
14        documentEvent.Set();
15    }
16};
17
18// Load an SVG document Async
19document.Navigate(documentUrl);
20
21// Blocks the current thread while the document is loading
22documentEvent.WaitOne();
23
24// Work with the document

Полные примеры и файлы данных можно скачать с GitHub. О загрузке примеров с GitHub и их запуске см. в разделе Как запускать примеры.

FAQ

1. Почему изображения, шрифты или CSS-файлы не загружаются, когда я создаю SVG из строки или потока?
Когда SVG создается из строки или потока, относительные пути к ресурсам разрешаются относительно базового URI, переданного в конструктор SVGDocument. Если связанные изображения, шрифты или CSS-файлы не загружаются, проверьте, что базовый URI указывает на папку или URL, где находятся эти ресурсы.

2. Что произойдет, если SVG-файл содержит некорректную разметку?
Aspose.SVG обрабатывает SVG как XML-содержимое. Если разметка некорректна или необходимые ресурсы не удается разрешить, загрузка документа или последующая обработка могут завершиться ошибкой. Проверяйте сгенерированную SVG-разметку и обрабатывайте исключения загрузки в промышленном коде.

3. Можно ли изменить SVGDocument после загрузки?
Да. После загрузки SVG-файла можно перемещаться по его DOM и изменять его, добавлять или удалять элементы, обновлять атрибуты, применять стили и сохранять результат. Подробные примеры редактирования см. в статье Редактировать SVG-файл.

4. Подходит ли SVGDocument для серверных приложений?
Да. Aspose.SVG for .NET можно использовать в backend-сервисах, ASP.NET-приложениях, пакетных обработчиках и сценариях автоматизации документов без зависимости от автоматизации браузера.

5. В чем разница между SVG Builder API и манипуляцией DOM?
SVG Builder API удобно использовать для пошагового создания новых SVG-структур в C#. Манипуляция DOM лучше подходит, когда вы работаете с уже загруженным SVG-документом и нужно изменить существующие элементы, атрибуты или стили.

Следующие шаги