Сохранение документа 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 в памяти, сбора и печати информации об обрабатываемых ресурсах.

  1. Инициализируйте документ SVG, используя указанный путь к файлу SVG.
  2. Создайте экземпляр класса MemoryResourceHandler. Этот класс предназначен для захвата и хранения ресурсов в потоках памяти во время процесса обработки ресурсов.
  3. Вызовите метод Save() документа SVG и передайте ему экземпляр MemoryResourceHandler в качестве аргумента. Это связывает логику обработки ресурсов MemoryResourceHandler с процессом сохранения документа SVG.
  4. Используйте метод 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.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.