Guardar un documento SVG – C#

Guardar un documento SVG

La mayoría de las tareas que debe realizar requieren guardar un documento. Una vez que cargue el archivo existente o cree un documento SVG desde cero, puede guardar los cambios utilizando uno de los métodos SVGDocument.Save(). Existen métodos sobrecargados que permiten guardar SVG en un archivo, secuencia, archivo Zip o URL.

En este artículo, revisamos cómo guardar los documentos SVG en el mismo formato. Descubrirá cómo guardar su archivo SVG utilizando los métodos Save() de la clase SVGDocument. Además, Aspose.SVG for .NET proporciona la clase ResourceHandler que permite guardar documentos SVG con recursos para transmitirlos y administrarlos.

Los escenarios de conversión y renderización de SVG a otros formatos se ven en la sección Cómo convertir archivos SVG.

Guardar SVG en un archivo

El siguiente fragmento de código demuestra el uso del método SVGDocument.Save() para guardar un documento SVG en un archivo:

 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    }

Guardar SVG en una URL

Es necesario especificar una ruta URL completa para guardar el documento lineto.svg y pasar el objeto url al método Save() que guarda el documento en un archivo especificado por la URL. El siguiente ejemplo de código muestra cómo guardar un documento en una 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    }

Guarde SVG en un almacenamiento del sistema de archivos local

El documento SVG puede contener diferentes recursos como CSS, imágenes y archivos externos. Aspose.SVG proporciona una forma de guardar SVG con todos los archivos vinculados: la clase ResourceHandler está desarrollada para guardar contenido y recursos SVG en transmisiones. Esta clase es responsable de manejar los recursos y proporciona métodos que le permiten controlar lo que se hace con cada recurso.

Consideremos un ejemplo de cómo guardar SVG con recursos en el almacenamiento de archivos local especificado por el usuario. El documento fuente with-resources.svg y su archivo de imagen vinculado están en el mismo directorio. El constructor FileSystemResourceHandler(customOutDir) toma una ruta que indica dónde se guardará el documento con recursos y crea un objeto FileSystemResourceHandler. El método Save(resourceHandler) toma este objeto y guarda SVG en el almacenamiento de salida.

 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    }

Guarde SVG en un archivo Zip

Puede implementar ResourceHandler creando la clase ZipResourceHandler. Le permite crear un archivo estructurado y comprimido que contiene documentos SVG y recursos asociados, lo que lo hace adecuado para escenarios como el archivado y la optimización del almacenamiento. El método HandleResource() en la clase ZipResourceHandler sirve para personalizar el comportamiento de cómo se procesan y almacenan los recursos individuales en un archivo Zip.

En el siguiente ejemplo, la clase ZipResourceHandler se utiliza para guardar el documento with-resources.svg junto con sus recursos vinculados en un archivo 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    }

La clase ResourceHandler está destinada a la implementación del cliente. La clase ZipResourceHandler extiende la clase base ResourceHandler y proporciona una manera conveniente de administrar todo el proceso de manejo y almacenamiento de recursos vinculados con un documento SVG en un archivo Zip dentro del contexto de la biblioteca 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    }

Guardar SVG en secuencias de memoria

La implementación de la clase ResourceHandler en la clase MemoryResourceHandler permite guardar SVG en flujos de memoria. El siguiente código muestra cómo utilizar la clase MemoryResourceHandler para almacenar un documento SVG en la memoria, recopilando e imprimiendo información sobre los recursos manejados.

  1. Inicialice un documento SVG utilizando la ruta del archivo SVG especificada.
  2. Cree una instancia de la clase MemoryResourceHandler. Esta clase está diseñada para capturar y almacenar recursos dentro de flujos de memoria durante el proceso de manejo de recursos.
  3. Llame al método Save() del documento SVG y pásele la instancia MemoryResourceHandler como argumento. Esto asocia la lógica de manejo de recursos de MemoryResourceHandler con el proceso de guardado de documentos SVG.
  4. Utilice el método PrintInfo() de MemoryResourceHandler para imprimir información sobre los recursos manejados.
 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    }

Después de ejecutar el ejemplo, se imprimirá el mensaje sobre el almacenamiento de memoria:

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

ResourceHandler es una clase base que admite la creación y gestión de flujos de salida. La clase MemoryResourceHandler le permite capturar y almacenar flujos de recursos en memoria, proporcionando una forma dinámica y flexible de manejar recursos sin guardarlos físicamente en el sistema de archivos. El siguiente fragmento de código muestra la realización de ResourceHandler en la clase 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    }

Puede descargar los ejemplos completos y los archivos de datos desde GitHub. Encontrará información sobre la descarga desde GitHub y la ejecución de ejemplos en la sección Cómo ejecutar los ejemplos.

Puede intentar convertir documentos SVG a otros formatos con nuestro Convertidor SVG en línea gratuito.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.