Enregistrer un document SVG – C#

Enregistrer un document SVG

La plupart des tâches que vous devez effectuer nécessitent l’enregistrement d’un document. Une fois que vous avez chargé le fichier existant ou créé un document SVG à partir de zéro, vous pouvez enregistrer vos modifications à l’aide de l’une des méthodes SVGDocument.Save(). Il existe des méthodes surchargées qui permettent d’enregistrer du SVG dans un fichier, un flux, une archive Zip ou une URL.

Dans cet article, nous passons en revue les documents SVG enregistrés au même format. Vous découvrez comment enregistrer votre fichier SVG à l’aide des méthodes Save() de la classe SVGDocument. De plus, Aspose.SVG pour .NET fournit la classe ResourceHandler qui permet de sauvegarder des documents SVG avec des ressources pour les diffuser et de les gérer.

Les scénarios de conversion et de rendu du SVG vers d’autres formats sont visualisés dans la section Comment convertir des fichiers SVG.

Enregistrer SVG dans un fichier

L’extrait de code suivant illustre l’utilisation de la méthode SVGDocument.Save() pour enregistrer un document SVG dans un fichier:

 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    }

Enregistrer SVG dans une URL

Il est nécessaire de spécifier un chemin Url complet pour l’enregistrement du document lineto.svg et de transmettre l’objet url à la méthode Save() qui enregistre le document dans un fichier spécifié par Url. L’exemple de code suivant montre comment enregistrer un document dans une 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    }

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

Le document SVG peut contenir différentes ressources comme du CSS, des images et des fichiers externes. Aspose.SVG fournit un moyen de sauvegarder SVG avec tous les fichiers liés – la classe ResourceHandler est développée pour sauvegarder le contenu et les ressources SVG dans des flux. Cette classe est responsable de la gestion des ressources et fournit des méthodes qui vous permettent de contrôler ce qui est fait avec chaque ressource.

Prenons un exemple d’enregistrement de SVG avec des ressources pour le stockage de fichiers local spécifié par l’utilisateur. Le document source with-resources.svg et son fichier image lié se trouvent dans le même répertoire. Le constructeur FileSystemResourceHandler(customOutDir) prend un chemin indiquant où le document avec les ressources sera enregistré et crée un objet FileSystemResourceHandler. La méthode Save(resourceHandler) 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/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    }

Enregistrer SVG dans une archive Zip

Vous pouvez implémenter le ResourceHandler en créant la classe ZipResourceHandler. La méthode HandleResource() de la classe ZipResourceHandler sert à personnaliser le comportement de la façon dont les ressources individuelles sont traitées et stockées dans une archive Zip. Il vous permet de créer une archive structurée et compressée contenant des documents SVG et les ressources associées, ce qui la rend adaptée à des scénarios tels que l’archivage et l’optimisation du stockage.

Dans l’exemple suivant, la classe ZipResourceHandler est utilisée pour enregistrer le document with-resources.svg ainsi que ses ressources liées 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/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 classe ResourceHandler est destinée à l’implémentation client. La classe ZipResourceHandler étend la classe de base ResourceHandler et fournit un moyen pratique de gérer l’ensemble du processus de gestion et de stockage des ressources liées à un document SVG dans une archive Zip dans le contexte de la bibliothèque Aspose.SVG pour .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    }

Enregistrer SVG dans les flux de mémoire

L’implémentation de la classe ResourceHandler dans la classe MemoryResourceHandler permet d’enregistrer le SVG dans des flux de mémoire. Le code suivant montre comment utiliser la classe MemoryResourceHandler pour stocker un document SVG en mémoire, collectant et imprimant des informations sur les ressources gérées.

  1. Initialisez un document SVG en utilisant le chemin de fichier SVG spécifié.
  2. Créez une instance de la classe MemoryResourceHandler. Cette classe est conçue pour capturer et stocker des ressources dans des flux de mémoire pendant le processus de gestion des ressources.
  3. Appelez la méthode Save() du document SVG et transmettez-lui l’instance MemoryResourceHandler comme argument. Cela associe la logique de gestion des ressources de MemoryResourceHandler au processus de sauvegarde des documents SVG.
  4. Utilisez la méthode PrintInfo() de MemoryResourceHandler pour imprimer des informations sur les ressources gérées.
 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    }

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

Le ResourceHandler est une classe de base qui prend en charge la création et la gestion des flux de sortie. La classe MemoryResourceHandler vous permet de capturer et de stocker des flux de ressources en mémoire, offrant ainsi un moyen dynamique et flexible de gérer les ressources sans les enregistrer physiquement dans le système de fichiers. L’extrait de code suivant montre la réalisation de ResourceHandler dans la classe 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    }

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.