Aspose.SVG for .NET 24.3.0 – guarde un SVG en una secuencia
Aspose.SVG for .NET 24.3.0
En la versión 24.3.0, la interfaz IOutputStorage y la clase LocalFileSystemStorage han quedado obsoletas, pero seguirán funcionando hasta que se lance la versión 24.6.0. Si utiliza versiones anteriores de Aspose.SVG for .NET, le recomendamos que actualice y migre a la nueva versión, ya que la versión 24.6.0 eliminará estas clases obsoletas.
Deprecated | New |
---|---|
IOutputStorage Interface | ResourceHandler Class |
LocalFileSystemStorage Class | FileSystemResourceHandler Class |
El documento SVG puede contener diferentes recursos como CSS, imágenes externas y archivos. En el artículo, consideraremos los casos para guardar documentos SVG con recursos en un archivo Zip, flujo de memoria y almacenamiento en el sistema de archivos local. Aspose.SVG for .NET continúa desarrollando y mejorando las formas de guardar SVG con todos los archivos vinculados. Aquí veremos ejemplos de cómo guardar archivos usando clases obsoletas y ofreceremos soluciones avanzadas para implementar nuevas clases.
Clase ResourceHandler frente a interfaz IOutputStorage
La clase
ResourceHandler permite a los desarrolladores implementar el método HandleResource()
, en el que puedes crear una secuencia tú mismo y publicarla donde la necesites. El nuevo método agrega la capacidad de ver un “Recurso” y procesar más información sobre él. Por lo tanto, al adoptar la clase ResourceHandler
, los desarrolladores pueden beneficiarse de un enfoque más ágil y expresivo para administrar recursos, lo que resulta en un código más limpio, más fácil de mantener y flexible al guardar documentos SVG.
Guarde SVG en un archivo Zip
Aquí, examinaremos el mismo ejemplo de cómo guardar el archivo
with-resources.svg en un archivo Zip usando una interfaz IOutputStorage
obsoleta y una nueva clase ResourceHandler
.
Uso de IOutputStorage – 24.2.0 y versiones anteriores
La interfaz IOutputStorage
era una interfaz básica que admitía la creación y gestión de flujos de salida. Puede implementar la interfaz IOutputStorage creando la clase ZipStorage para guardar SVG con recursos 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/old/archive.zip");
13
14 // Load the SVG document
15 using (var doc = new SVGDocument(inputPath))
16 {
17 // Initialize an instance of the ZipStorage class
18 using (var zipSrorage = new ZipStorage(customArchivePath))
19 {
20 // Save SVG with resources to a Zip archive
21 doc.Save(zipSrorage);
22 }
23 }
El siguiente fragmento de código muestra la realización de IOutputStorage
en la clase ZipStorage para demostrar cómo guardar un documento SVG con recursos en un archivo Zip.
1 internal class ZipStorage : IOutputStorage, IDisposable
2 {
3 private FileStream zipStream;
4 private ZipArchive archive;
5 private int streamsCounter;
6 private bool initialized;
7
8 public ZipStorage(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 OutputStream CreateStream(OutputStreamContext context)
17 {
18 var zipUri = (streamsCounter++ == 0 ? Path.GetFileName(context.Uri) :
19 Path.Combine(Path.GetFileName(Path.GetDirectoryName(context.Uri)), Path.GetFileName(context.Uri)));
20 var samplePrefix = String.Empty;
21 if (initialized)
22 samplePrefix = "my_";
23 else
24 initialized = true;
25
26 var newStream = archive.CreateEntry(samplePrefix + zipUri).Open();
27 var outputStream = new OutputStream(newStream, "file:///" + samplePrefix + zipUri);
28 return outputStream;
29 }
30
31 public void ReleaseStream(OutputStream stream)
32 {
33 stream.Flush();
34 stream.Close();
35 }
36
37 private void DisposeArchive()
38 {
39 if (archive != null)
40 {
41 archive.Dispose();
42 archive = null;
43 }
44 if (zipStream != null)
45 {
46 zipStream.Dispose();
47 zipStream = null;
48 }
49 streamsCounter = 0;
50 }
51
52 public void Dispose()
53 {
54 DisposeArchive();
55 }
56 }
Usando la nueva clase ResourceHandler – Desde la versión 24.3.0
La clase
ResourceHandler está destinada a la implementación de los clientes. El siguiente ejemplo de C# muestra cómo guardar un documento SVG con recursos en un archivo Zip usando la clase ZipResourceHandler de ResourceHandler
:
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/new/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 }
El siguiente fragmento de código muestra la realización de ResourceHandler
en la clase ZipResourceHandler para demostrar cómo guardar un documento SVG con recursos en un archivo Zip. El método
HandleResource() de la clase ZipResourceHandler
es responsable de manejar cada recurso durante el proceso de guardado al crear un archivo Zip:
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
Consideremos el ejemplo de C# de guardar un archivo SVG con recursos vinculados a una secuencia de memoria usando la interfaz obsoleta IOutputStorage
y la nueva clase
ResourceHandler. El documento fuente
with-resources.svg y los archivos de imagen vinculados están en el mismo directorio.
Uso de IOutputStorage: 24.2.0 y versiones anteriores
La implementación de la interfaz IOutputStorage
permitió guardar SVG en flujos de memoria:
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 // Initialaze an SVG document
10 using (var doc = new SVGDocument(inputPath))
11 {
12 // Create an instance of the MemoryOutputStorage class and save SVG to memory
13 var memoryStorage = new MemoryOutputStorage();
14 doc.Save(memoryStorage);
15 memoryStorage.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
El siguiente fragmento de código muestra la realización de IOutputStorage
en la clase MemoryOutputStorage para demostrar cómo guardar un documento SVG en flujos de memoria.
1 internal class MemoryOutputStorage : IOutputStorage
2 {
3 public List<Tuple<OutputStream, string>> Streams;
4
5 public MemoryOutputStorage()
6 {
7 Streams = new List<Tuple<OutputStream, string>>();
8 }
9
10 public OutputStream CreateStream(OutputStreamContext context)
11 {
12 var normalizedPath = new Url(context.Uri).Pathname;
13 var uri = new Url(Path.GetFileName(normalizedPath), "memory:///").Href;
14 var outputStream = new OutputStream(new MemoryStream(), uri);
15 Streams.Add(Tuple.Create(outputStream, uri));
16 return outputStream;
17 }
18
19 public void ReleaseStream(OutputStream stream)
20 {
21 stream.Flush();
22 }
23
24 public void PrintInfo()
25 {
26 foreach (var stream in Streams)
27 Console.WriteLine($"uri:{stream.Item2}, length:{stream.Item1.Length}");
28 }
29 }
Usando la nueva clase ResourceHandler – Desde la versión 24.3.0
El siguiente fragmento de código muestra la realización de ResourceHandler
en la clase MemoryResourceHandler para demostrar cómo guardar un documento SVG en secuencias de memoria:
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 }
En lugar de los métodos CreateStream()
y ReleaseStream()
implementados en la clase MemoryOutputStorage de la interfaz IOutputStorage
, ahora hay un método
HandleResource() implementado en la clase MemoryResourceHandler
de Clase ResourceHandler
, en la que puedes crear una secuencia tú mismo y publicarla donde la necesites. El nuevo método agrega la capacidad de ver un “Recurso” y procesar más información sobre él:
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 }
Como puede ver, el nuevo enfoque opera directamente con objetos Resource
, eliminando la necesidad de clases adicionales como OutputStream
. Esto simplifica el código y hace que la interacción con los recursos sea más explícita y comprensible. Por lo tanto, la clase base ResourceHandler
ofrece una forma más simplificada y expresiva de manejar recursos al guardar documentos SVG en flujos de memoria.
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
Clase FileSystemResourceHandler frente a clase LocalFileSystemStorage
A diferencia de la clase LocalFileSystemStorage
, la nueva clase
FileSystemResourceHandler le permite no sólo guardar documentos y recursos SVG en la carpeta seleccionada sino también, a través de los métodos de la clase base
ResourceHandler, controlar la escritura de enlaces en archivos principales a los archivos que está guardando.
Guarde SVG en un almacenamiento del sistema de archivos local
Aquí, examinaremos el mismo ejemplo de cómo guardar el archivo SVG
with-resources.svg en el almacenamiento del sistema de archivos local utilizando la clase obsoleta LocalFileSystemStorage
y la nueva clase FileSystemResourceHandler
.
Uso de la clase LocalFileSystemStorage: 24.2.0 y versiones anteriores
El documento SVG de origen con los archivos de imagen vinculados se encuentran en el mismo directorio. El constructor LocalFileSystemStorage(customOutDir)
crea un objeto que es un almacenamiento del sistema de archivos. El método Save(IOutputStorage)
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/old/");
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 LocalFileSystemStorage(customOutDir));
16 }
Uso de la clase FileSystemResourceHandler – desde la versión 24.3.0
La clase
FileSystemResourceHandler es una implementación de la clase ResourceHandler
en Aspose.SVG for .NET. Diseñada explícitamente para ahorrar recursos en el sistema de archivos local, esta clase proporciona una solución conveniente y extensible para administrar recursos al guardar documentos SVG. El siguiente fragmento de código demuestra el uso de la clase FileSystemResourceHandler
:
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/new/");
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 }
El constructor
FileSystemResourceHandler(customOutDir
) toma una ruta que indica dónde se guardarán los recursos y crea un objeto FileSystemResourceHandler. El método Save(resourceHandler)
toma este objeto y guarda SVG en el almacenamiento de salida.
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.