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.
- Initialisez un document SVG en utilisant le chemin de fichier SVG spécifié.
- 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. - Appelez la méthode
Save()
du document SVG et transmettez-lui l’instanceMemoryResourceHandler
comme argument. Cela associe la logique de gestion des ressources deMemoryResourceHandler
au processus de sauvegarde des documents SVG. - Utilisez la méthode
PrintInfo()
deMemoryResourceHandler
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.