Aspose.SVG for .NET 24.3.0 – Enregistrer un SVG dans un flux

Aspose.SVG for .NET 24.3.0

Dans la version 24.3.0, l’interface IOutputStorage et la classe LocalFileSystemStorage sont obsolètes mais continueront de fonctionner jusqu’à la sortie de la version 24.6.0. Si vous utilisez des versions antérieures d’Aspose.SVG for .NET, nous vous recommandons de mettre à niveau et de migrer vers la nouvelle version, car la version 24.6.0 supprimera ces classes obsolètes.

DeprecatedNew
IOutputStorage InterfaceResourceHandler Class
LocalFileSystemStorage ClassFileSystemResourceHandler Class

Le document SVG peut contenir différentes ressources comme du CSS, des images externes et des fichiers. Dans l’article, nous examinerons les cas d’enregistrement de documents SVG avec des ressources pour l’archive Zip, le flux mémoire et le stockage du système de fichiers local. Aspose.SVG for .NET continue de développer et d’améliorer les moyens d’enregistrer les SVG avec tous les fichiers liés. Ici, nous examinerons des exemples d’enregistrement de fichiers à l’aide de classes obsolètes et proposerons des solutions avancées pour implémenter de nouvelles classes.

Classe ResourceHandler vs Interface IOutputStorage

La classe ResourceHandler permet aux développeurs d’implémenter la méthode HandleResource(), dans laquelle vous pouvez créer vous-même un flux et le publier là où vous en avez besoin. La nouvelle méthode ajoute la possibilité de voir une Resource et de traiter plus d’informations à son sujet. Ainsi, en adoptant la classe ResourceHandler, les développeurs peuvent bénéficier d’une approche plus rationalisée et plus expressive de la gestion des ressources, ce qui se traduit par un code plus propre, plus maintenable et plus flexible lors de l’enregistrement de documents SVG.

Enregistrer SVG dans une archive Zip

Ici, nous examinerons un seul et même exemple de sauvegarde du fichier with-resources.svg dans une archive Zip en utilisant une interface IOutputStorage obsolète et une nouvelle classe ResourceHandler.

Utilisation d’IOutputStorage – 24.2.0 et versions antérieures


L’interface IOutputStorage était une interface de base qui prenait en charge la création et la gestion des flux de sortie. Vous pouvez implémenter l’interface IOutputStorage en créant la classe ZipStorage pour enregistrer le SVG avec les ressources dans une archive 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    }

L’extrait de code suivant montre la réalisation de IOutputStorage dans la classe ZipStorage pour démontrer l’enregistrement d’un document SVG avec des ressources dans une archive 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    }

Utilisation de la nouvelle classe ResourceHandler – Depuis la version 24.3.0


La classe ResourceHandler est destinée à l’implémentation par les clients. L’exemple C# suivant montre comment enregistrer un document SVG avec des ressources dans une archive Zip à l’aide de la classe 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    }

L’extrait de code suivant montre la réalisation de ResourceHandler dans la classe ZipResourceHandler pour démontrer l’enregistrement d’un document SVG avec des ressources dans une archive Zip. La méthode HandleResource() de la classe ZipResourceHandler est responsable de la gestion de chaque ressource pendant le processus de sauvegarde lors de la création d’une archive 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    }

Enregistrer SVG dans les flux de mémoire

Considérons l’exemple C# d’enregistrement d’un fichier SVG avec des ressources liées dans un flux mémoire en utilisant l’interface obsolète IOutputStorage et la nouvelle classe ResourceHandler. Le document source with-resources.svg et les fichiers image liés se trouvent dans le même répertoire.

Utilisation d’IOutputStorage – 24.2.0 et versions antérieures


L’implémentation de l’interface IOutputStorage a permis d’enregistrer SVG dans les flux mémoire :

 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    }

Après l’exécution de l’exemple, le message concernant le stockage en mémoire sera imprimé:

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

L’extrait de code suivant montre la réalisation de IOutputStorage dans la classe MemoryOutputStorage pour démontrer l’enregistrement d’un document SVG dans des flux de mémoire.

 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    }

Utilisation de la nouvelle classe ResourceHandler – Depuis la version 24.3.0


L’extrait de code suivant montre la réalisation de ResourceHandler dans la classe MemoryResourceHandler pour démontrer l’enregistrement d’un document SVG dans des flux de mémoire:

 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    }

Au lieu des méthodes CreateStream() et ReleaseStream() implémentées dans la classe MemoryOutputStorage de l’interface IOutputStorage, il existe désormais une méthode HandleResource() implémentée dans la classe MemoryResourceHandler de Classe ResourceHandler, dans laquelle vous pouvez créer vous-même un flux et le publier là où vous en avez besoin. La nouvelle méthode ajoute la possibilité de voir une Resource et de traiter plus d’informations à son sujet:

 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    }

Comme vous pouvez le voir, la nouvelle approche fonctionne directement avec les objets Resource, éliminant le besoin de classes supplémentaires telles que OutputStream. Cela simplifie le code et rend l’interaction avec les ressources plus explicite et compréhensible. Ainsi, la classe de base ResourceHandler offre une manière plus simplifiée et plus expressive de gérer les ressources lors de l’enregistrement de documents SVG dans des flux mémoire.

Après l’exécution de l’exemple, le message concernant le stockage en mémoire sera imprimé :

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

Classe FileSystemResourceHandler vs Classe LocalFileSystemStorage

Contrairement à la classe LocalFileSystemStorage, la nouvelle classe FileSystemResourceHandler permet non seulement de sauvegarder les documents et ressources SVG dans le dossier sélectionné mais aussi, grâce aux méthodes de la classe de base ResourceHandler, de contrôler l’écriture des fichiers SVG. des liens dans les fichiers parents vers les fichiers que vous enregistrez.

Enregistrer SVG sur un stockage de système de fichiers local

Ici, nous examinerons le même exemple d’enregistrement du fichier SVG with-resources.svg dans le stockage du système de fichiers local en utilisant la classe obsolète LocalFileSystemStorage et la nouvelle classe FileSystemResourceHandler.

Utilisation de la classe LocalFileSystemStorage – 24.2.0 et versions antérieures


Le document SVG source avec les fichiers image liés se trouvent dans le même répertoire. Le constructeur LocalFileSystemStorage(customOutDir) crée un objet qui est un stockage de système de fichiers. La méthode Save(IOutputStorage) prend cet objet et enregistre SVG dans le stockage de sortie.

 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    }

Utilisation de la classe FileSystemResourceHandler – Depuis la version 24.3.0


La classe FileSystemResourceHandler est une implémentation de la classe ResourceHandler dans Aspose.SVG for .NET. Explicitement conçue pour enregistrer des ressources sur le système de fichiers local, cette classe fournit une solution pratique et extensible pour gérer les ressources lors de l’enregistrement de documents SVG. L’extrait de code suivant illustre l’utilisation de la classe 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    }

Le constructeur FileSystemResourceHandler(customOutDir) prend un chemin indiquant où les ressources seront enregistrées et crée un objet FileSystemResourceHandler. La méthode Save(resourceHandler) prend cet objet et enregistre SVG dans le stockage de sortie.

Vous pouvez télécharger les exemples complets et les fichiers de données depuis GitHub. À propos du téléchargement depuis GitHub et de l’exécution d’exemples, vous le découvrirez dans la section Comment exécuter les exemples.

Vous pouvez essayer de convertir des documents SVG vers divers autres formats avec notre Convertisseur SVG en ligne gratuit.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.