Сохранение документа 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 Aspose.Svg;
2using System.IO;
 1// Save SVG to file using C#
 2
 3// Prepare a path to save an SVG document
 4string documentPath = Path.Combine(OutputDir, "circles_out.svg");
 5
 6//  Load the SVG document from a file
 7using (SVGDocument document = new SVGDocument(Path.Combine(DataDir, "circles.svg")))
 8{
 9    // Work with the document
10
11    // Save SVG to a file
12    document.Save(documentPath);
13}

Сохранить SVG по URL-адресу

Необходимо указать полный URL-путь для сохранения документа lineto.svg и передать объект url методу Save(), который сохраняет документ в файл, указанный URL-адресом. В следующем примере кода показано, как сохранить документ по URL-адресу:

1using Aspose.Svg;
2using System.IO;
 1// Save SVG to Url using C#
 2
 3// Set a full path for an SVG document saving
 4Url url = new Url(Path.Combine(OutputUrl, "lineto_out.svg"), Directory.GetCurrentDirectory());
 5
 6//  Load the SVG document from a file
 7using (SVGDocument document = new SVGDocument(Path.Combine(DataDir, "lineto.svg")))
 8{
 9    // Work with the document
10
11    // Save the document to a Url
12    document.Save(url);
13}

Сохранить 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;
 1// Save an SVG document along with its external resources in C#
 2
 3// Prepare a path to a source SVG file  
 4string inputPath = Path.Combine(DataDir, "with-resources.svg");
 5
 6// Prepare a full path to an output directory 
 7string customOutDir = Path.Combine(Directory.GetCurrentDirectory(), "./../../../../tests-out/saving/");
 8
 9// Load an SVG document from a file
10using (SVGDocument doc = new SVGDocument(inputPath))
11{
12    // Save SVG with resources
13    doc.Save(new FileSystemResourceHandler(customOutDir));
14}

Сохранить SVG в ZIP-архив

Вы можете реализовать ResourceHandler, создав класс ZipResourceHandler. Он позволяет создавать структурированный и сжатый архив, содержащий документы SVG и связанные ресурсы, что делает его пригодным для таких сценариев, как архивирование и оптимизация хранения. Метод HandleResource() в классе ZipResourceHandler служит для настройки поведения обработки и хранения отдельных ресурсов в Zip-архиве.

В следующем примере класс ZipResourceHandler используется для сохранения документа with-resources.svg вместе со связанными с ним ресурсами в Zip-архив:

1using System.IO;
2using Aspose.Svg.IO;
3using System.IO.Compression;
 1// Save SVG to a Zip Archive using C#
 2
 3// Prepare a path to a source SVG file 
 4string inputPath = Path.Combine(DataDir, "with-resources.svg");
 5
 6string dir = Directory.GetCurrentDirectory();
 7
 8// Prepare a full path to an output Zip storage
 9string customArchivePath = Path.Combine(dir, "./../../../../tests-out/saving/archive.zip");
10
11// Load an SVG document 
12using (SVGDocument doc = new SVGDocument(inputPath))
13{
14    // Initialize an instance of the ZipResourceHandler class
15    using (ZipResourceHandler resourceHandler = new ZipResourceHandler(customArchivePath))
16    {
17        // Save SVG with resources to a Zip archive
18        doc.Save(resourceHandler);
19    }
20}

Класс ResourceHandler предназначен для реализации пользователями. Класс ZipResourceHandler расширяет базовый класс ResourceHandler и предоставляет удобный способ управления всем процессом обработки и сохранения ресурсов, связанных с документом SVG, в Zip-архив в контексте библиотеки Aspose.SVG for .NET:

 1// Custom resource handler to save SVG with resources into a ZIP archive
 2
 3internal class ZipResourceHandler : ResourceHandler, IDisposable
 4{
 5    private FileStream zipStream;
 6    private ZipArchive archive;
 7    private int streamsCounter;
 8    private bool initialized;
 9
10    public ZipResourceHandler(string name)
11    {
12        DisposeArchive();
13        zipStream = new FileStream(name, FileMode.Create);
14        archive = new ZipArchive(zipStream, ZipArchiveMode.Update);
15        initialized = false;
16    }
17
18    public override void HandleResource(Resource resource, ResourceHandlingContext context)
19    {
20        string zipUri = (streamsCounter++ == 0
21            ? Path.GetFileName(resource.OriginalUrl.Href)
22            : Path.Combine(Path.GetFileName(Path.GetDirectoryName(resource.OriginalUrl.Href)),
23                Path.GetFileName(resource.OriginalUrl.Href)));
24        string samplePrefix = String.Empty;
25        if (initialized)
26            samplePrefix = "my_";
27        else
28            initialized = true;
29
30        using (Stream newStream = archive.CreateEntry(samplePrefix + zipUri).Open())
31        {
32            resource.WithOutputUrl(new Url("file:///" + samplePrefix + zipUri)).Save(newStream, context);
33        }
34    }
35
36    private void DisposeArchive()
37    {
38        if (archive != null)
39        {
40            archive.Dispose();
41            archive = null;
42        }
43
44        if (zipStream != null)
45        {
46            zipStream.Dispose();
47            zipStream = null;
48        }
49
50        streamsCounter = 0;
51    }
52
53    public void Dispose()
54    {
55        DisposeArchive();
56    }
57}

Сохранить 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;
 1// Save an SVG document to memory with a resource handler in C#
 2
 3// Prepare a path to a source SVG file
 4string inputPath = Path.Combine(DataDir, "with-resources.svg");
 5
 6// Initialize an SVG document
 7using (SVGDocument doc = new SVGDocument(inputPath))
 8{
 9    // Create an instance of the MemoryResourceHandler class and save SVG to memory
10    MemoryResourceHandler resourceHandler = new MemoryResourceHandler();
11    doc.Save(resourceHandler);
12    resourceHandler.PrintInfo();
13}

После запуска примера будет напечатано сообщение о хранении в памяти:

uri:memory:///with-resources.svg, length:556
uri:memory:///photo.png, length:57438

ResourceHandler – это базовый класс, который поддерживает создание потоков вывода и управление ими. Класс MemoryResourceHandler позволяет захватывать и хранить потоки ресурсов в памяти, обеспечивая динамический и гибкий способ обработки ресурсов без физического сохранения их в файловой системе. В следующем фрагменте кода показана реализация ResourceHandler в классе MemoryResourceHandler:

 1// Handle and save SVG resources to memory streams in C#
 2
 3internal class MemoryResourceHandler : ResourceHandler
 4{
 5    public List<Tuple<Stream, Resource>> Streams;
 6
 7    public MemoryResourceHandler()
 8    {
 9        Streams = new List<Tuple<Stream, Resource>>();
10    }
11
12    public override void HandleResource(Resource resource, ResourceHandlingContext context)
13    {
14        MemoryStream outputStream = new MemoryStream();
15        Streams.Add(Tuple.Create<Stream, Resource>(outputStream, resource));
16        resource
17            .WithOutputUrl(new Url(Path.GetFileName(resource.OriginalUrl.Pathname), "memory:///"))
18            .Save(outputStream, context);
19    }
20
21    public void PrintInfo()
22    {
23        foreach (Tuple<Stream, Resource> stream in Streams)
24            Console.WriteLine($"uri:{stream.Item2.OutputUrl}, length:{stream.Item1.Length}");
25    }
26}

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

Вы можете попробовать конвертировать документы SVG в другие форматы с помощью нашего Бесплатного онлайн-конвертера SVG.

Close
Loading

Analyzing your prompt, please hold on...

An error occurred while retrieving the results. Please refresh the page and try again.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.