Сохранение документа SVG – C#
Сохранить документ SVG
Большинство задач, которые вам необходимо выполнить, требуют сохранения документа. Загрузив существующий файл или создав документ SVG с нуля, вы можете сохранить изменения, используя один из методов SVGDocument.Save(). Существуют перегруженные методы, позволяющие сохранять SVG в файл, поток, Zip-архив или URL-адрес.
В этой статье мы рассмотрим сохранение документов SVG в том же формате. Вы узнаете, как сохранить файл SVG, используя методы Save() класса SVGDocument. Более того, Aspose.SVG для .NET предоставляет класс ResourceHandler, который позволяет сохранять документы SVG с ресурсами в потоки и управлять ими.
Сценарии конвертации и рендеринга SVG в другие форматы рассматриваются в разделе Как конвертировать файлы SVG.
Сохранить SVG в файл
Следующий фрагмент кода демонстрирует использование метода SVGDocument.Save() для сохранения документа SVG в файл:
1using System.IO;
2using Aspose.Svg;
3...
4
5 // Prepare a path for an SVG document saving
6 string documentPath = Path.Combine(OutputDir, "lineto_out.svg");
7
8 // Load the SVG document from a file
9 using (var document = new SVGDocument(Path.Combine(DataDir, "lineto.svg")))
10 {
11 // Work with the document
12
13 // Save SVG to the file
14 document.Save(documentPath);
15 }
Сохранить SVG по URL-адресу
Необходимо указать полный URL-путь для сохранения документа
lineto.svg и передать объект url
методу Save(), который сохраняет документ в файл, указанный URL-адресом. В следующем примере кода показано, как сохранить документ по URL-адресу:
1using System.IO;
2using Aspose.Svg;
3...
4
5 // Set a full path for an SVG document saving
6 var url = new Url(Path.Combine(OutputDir, "lineto_out.svg"), Directory.GetCurrentDirectory());
7
8 // Load the SVG document from a file
9 using (var document = new SVGDocument(Path.Combine(DataDir, "lineto.svg")))
10 {
11 // Work with the document
12
13 // Save SVG to Url
14 document.Save(url);
15 }
Сохранить SVG в хранилище локальной файловой системы
Документ SVG может содержать различные ресурсы, такие как CSS, внешние изображения и файлы. Aspose.SVG предоставляет способ сохранения SVG со всеми связанными файлами – класс ResourceHandler разработан для сохранения содержимого и ресурсов SVG в потоки. Этот класс отвечает за обработку ресурсов и предоставляет методы, позволяющие контролировать действия с каждым ресурсом.
Давайте рассмотрим пример сохранения SVG с ресурсами в указанном пользователем локальном файловом хранилище. Исходный документ
with-resources.svg и связанный с ним файл изображения находятся в одном каталоге. Конструктор
FileSystemResourceHandler(customOutDir
) принимает путь, указывающий, где будет сохранен документ с ресурсами, и создает объект FileSystemResourceHandler
. Метод
Save(resourceHandler
) принимает этот объект и сохраняет SVG в выходное хранилище.
1using System.IO;
2using Aspose.Svg.IO;
3...
4
5 // Prepare a path to a source SVG file
6 string inputPath = Path.Combine(DataDir, "with-resources.svg");
7
8 // Prepare a full path to an output directory
9 string customOutDir = Path.Combine(Directory.GetCurrentDirectory(), "./../../../../tests-out/save/");
10
11 // Load the SVG document from a file
12 using (var doc = new SVGDocument(inputPath))
13 {
14 // Save SVG with resources
15 doc.Save(new FileSystemResourceHandler(customOutDir));
16 }
Сохранить SVG в ZIP-архив
Вы можете реализовать
ResourceHandler, создав класс ZipResourceHandler. Он позволяет создавать структурированный и сжатый архив, содержащий документы SVG и связанные ресурсы, что делает его пригодным для таких сценариев, как архивирование и оптимизация хранения. Метод
HandleResource() в классе ZipResourceHandler
служит для настройки поведения обработки и хранения отдельных ресурсов в Zip-архиве.
В следующем примере класс ZipResourceHandler
используется для сохранения документа
with-resources.svg вместе со связанными с ним ресурсами в Zip-архив:
1using System.IO;
2using Aspose.Svg.IO;
3using System.IO.Compression;
4...
5
6 // Prepare a path to a source SVG file
7 string inputPath = Path.Combine(DataDir, "with-resources.svg");
8
9 var dir = Directory.GetCurrentDirectory();
10
11 // Prepare a full path to an output Zip storage
12 string customArchivePath = Path.Combine(dir, "./../../../../tests-out/save/archive.zip");
13
14 // Load an SVG document
15 using (var doc = new SVGDocument(inputPath))
16 {
17 // Initialize an instance of the ZipResourceHandler class
18 using (var resourceHandler = new ZipResourceHandler(customArchivePath))
19 {
20 // Save SVG with resources to a Zip archive
21 doc.Save(resourceHandler);
22 }
23 }
Класс ResourceHandler
предназначен для реализации пользователями. Класс ZipResourceHandler
расширяет базовый класс ResourceHandler
и предоставляет удобный способ управления всем процессом обработки и сохранения ресурсов, связанных с документом SVG, в Zip-архив в контексте библиотеки Aspose.SVG for .NET:
1 internal class ZipResourceHandler : ResourceHandler, IDisposable
2 {
3 private FileStream zipStream;
4 private ZipArchive archive;
5 private int streamsCounter;
6 private bool initialized;
7
8 public ZipResourceHandler(string name)
9 {
10 DisposeArchive();
11 zipStream = new FileStream(name, FileMode.Create);
12 archive = new ZipArchive(zipStream, ZipArchiveMode.Update);
13 initialized = false;
14 }
15
16 public override void HandleResource(Resource resource, ResourceHandlingContext context)
17 {
18 var zipUri = (streamsCounter++ == 0
19 ? Path.GetFileName(resource.OriginalUrl.Href)
20 : Path.Combine(Path.GetFileName(Path.GetDirectoryName(resource.OriginalUrl.Href)),
21 Path.GetFileName(resource.OriginalUrl.Href)));
22 var samplePrefix = String.Empty;
23 if (initialized)
24 samplePrefix = "my_";
25 else
26 initialized = true;
27
28 using (var newStream = archive.CreateEntry(samplePrefix + zipUri).Open())
29 {
30 resource.WithOutputUrl(new Url("file:///" + samplePrefix + zipUri)).Save(newStream, context);
31 }
32 }
33
34 private void DisposeArchive()
35 {
36 if (archive != null)
37 {
38 archive.Dispose();
39 archive = null;
40 }
41
42 if (zipStream != null)
43 {
44 zipStream.Dispose();
45 zipStream = null;
46 }
47
48 streamsCounter = 0;
49 }
50
51 public void Dispose()
52 {
53 DisposeArchive();
54 }
55 }
Сохранить SVG в потоки памяти
Реализация класса
ResourceHandler в классе MemoryResourceHandler позволяет сохранять SVG в потоках памяти. В следующем примере показано, как использовать класс MemoryResourceHandler
для хранения документа SVG в памяти, сбора и печати информации об обрабатываемых ресурсах.
- Инициализируйте документ SVG, используя указанный путь к файлу SVG.
- Создайте экземпляр класса
MemoryResourceHandler
. Этот класс предназначен для захвата и хранения ресурсов в потоках памяти во время процесса обработки ресурсов. - Вызовите метод
Save()
документа SVG и передайте ему экземплярMemoryResourceHandler
в качестве аргумента. Это связывает логику обработки ресурсовMemoryResourceHandler
с процессом сохранения документа SVG. - Используйте метод
PrintInfo()
классаMemoryResourceHandler
для печати информации об обрабатываемых ресурсах.
1using System.IO;
2using Aspose.Svg.IO;
3using System.Collections.Generic;
4...
5
6 // Prepare a path to a source SVG file
7 string inputPath = Path.Combine(DataDir, "with-resources.svg");
8
9 // Initialize an SVG document
10 using (var doc = new SVGDocument(inputPath))
11 {
12 // Create an instance of the MemoryResourceHandler class and save SVG to memory
13 var resourceHandler = new MemoryResourceHandler();
14 doc.Save(resourceHandler);
15 resourceHandler.PrintInfo();
16 }
После запуска примера будет напечатано сообщение о хранении в памяти:
uri:memory:///with-resources.svg, length:556
uri:memory:///photo.png, length:57438
ResourceHandler – это базовый класс, который поддерживает создание потоков вывода и управление ими. Класс MemoryResourceHandler
позволяет захватывать и хранить потоки ресурсов в памяти, обеспечивая динамический и гибкий способ обработки ресурсов без физического сохранения их в файловой системе. В следующем фрагменте кода показана реализация
ResourceHandler в классе MemoryResourceHandler:
1 internal class MemoryResourceHandler : ResourceHandler
2 {
3 public List<Tuple<Stream, Resource>> Streams;
4
5 public MemoryResourceHandler()
6 {
7 Streams = new List<Tuple<Stream, Resource>>();
8 }
9
10 public override void HandleResource(Resource resource, ResourceHandlingContext context)
11 {
12 var outputStream = new MemoryStream();
13 Streams.Add(Tuple.Create<Stream, Resource>(outputStream, resource));
14 resource
15 .WithOutputUrl(new Url(Path.GetFileName(resource.OriginalUrl.Pathname), "memory:///"))
16 .Save(outputStream, context);
17 }
18
19 public void PrintInfo()
20 {
21 foreach (var stream in Streams)
22 Console.WriteLine($"uri:{stream.Item2.OutputUrl}, length:{stream.Item1.Length}");
23 }
24 }
Вы можете загрузить полные примеры и файлы данных с GitHub. О загрузке с GitHub и запуске примеров вы узнаете из раздела Как запускать примеры.
Вы можете попробовать конвертировать документы SVG в другие форматы с помощью нашего Бесплатного онлайн-конвертера SVG.