Analyzing your prompt, please hold on...
An error occurred while retrieving the results. Please refresh the page and try again.
Это руководство показывает, как создавать, загружать и читать 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-документ – передать 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 }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-фильтров к растровым изображениям.
Используйте конструктор
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 из потока, используйте один из конструкторов 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 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-изображение представляет улыбающееся лицо:
Чтобы загрузить 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 также можно загружать напрямую из 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-документ ссылается на внешние ресурсы, такие как изображения, шрифты, 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 и их запуске см. в разделе Как запускать примеры.
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-документом и нужно изменить существующие элементы, атрибуты или стили.
Analyzing your prompt, please hold on...
An error occurred while retrieving the results. Please refresh the page and try again.