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.
- Inicialice un documento SVG utilizando la ruta del archivo SVG especificada.
- 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. - Llame al método
Save()
del documento SVG y pásele la instanciaMemoryResourceHandler
como argumento. Esto asocia la lógica de manejo de recursos deMemoryResourceHandler
con el proceso de guardado de documentos SVG. - Utilice el método
PrintInfo()
deMemoryResourceHandler
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.