Speichern Sie ein SVG-Dokument – C#
Speichern Sie ein SVG-Dokument
Die meisten Aufgaben, die Sie ausführen müssen, erfordern das Speichern eines Dokuments. Sobald Sie die vorhandene Datei geladen oder ein SVG-Dokument von Grund auf erstellt haben, können Sie Ihre Änderungen mit einer der Methoden SVGDocument.Save() speichern. Es gibt überladene Methoden, die das Speichern von SVG in einer Datei, einem Stream, einem Zip-Archiv oder einer URL ermöglichen.
In diesem Artikel untersuchen wir die Speicherung von SVG-Dokumenten im gleichen Format. Sie erfahren, wie Sie Ihre SVG-Datei mit Save()-Methoden der Klasse SVGDocument speichern. Darüber hinaus stellt Aspose.SVG für .NET die Klasse ResourceHandler bereit, mit der SVG-Dokumente mit Ressourcen in Streams gespeichert und verwaltet werden können.
Die Szenarien zum Konvertieren und Rendern von SVG in andere Formate werden im Abschnitt So konvertieren Sie SVG-Dateien beschrieben.
SVG in einer Datei speichern
Der folgende Codeausschnitt demonstriert die Verwendung der Methode SVGDocument.Save() zum Speichern eines SVG-Dokuments in einer Datei:
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 }
SVG unter einer URL speichern
Es ist notwendig, einen vollständigen URL-Pfad für das Speichern des Dokuments
lineto.svg anzugeben und das url
-Objekt an die Methode Save() zu übergeben, die das Dokument in einer durch URL angegebenen Datei speichert. Das folgende Codebeispiel zeigt, wie ein Dokument unter einer URL gespeichert wird:
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 }
Speichern Sie SVG in einem lokalen Dateisystemspeicher
Das SVG-Dokument kann verschiedene Ressourcen wie CSS, externe Bilder und Dateien enthalten. Aspose.SVG bietet eine Möglichkeit, SVG mit allen verknüpften Dateien zu speichern – die Klasse ResourceHandler wurde zum Speichern von SVG-Inhalten und -Ressourcen in Streams entwickelt. Diese Klasse ist für den Umgang mit Ressourcen verantwortlich und stellt Methoden bereit, mit denen Sie steuern können, was mit den einzelnen Ressourcen geschehen soll.
Betrachten wir ein Beispiel für das Speichern von SVG mit Ressourcen im vom Benutzer angegebenen lokalen Dateispeicher. Das Quelldokument
with-resources.svg und die verknüpfte Bilddatei befinden sich im selben Verzeichnis. Der Konstruktor
FileSystemResourceHandler(customOutDir
) verwendet einen Pfad, der angibt, wo das Dokument mit den Ressourcen gespeichert wird, und erstellt ein FileSystemResourceHandler
-Objekt. Die Methode
Save(resourceHandler
) nimmt dieses Objekt und speichert SVG im Ausgabespeicher.
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 }
Speichern Sie SVG in einem Zip-Archiv
Sie können den
ResourceHandler implementieren, indem Sie die Klasse ZipResourceHandler erstellen. Die Methode
HandleResource() in der Klasse ZipResourceHandler
dient dazu, das Verhalten anzupassen, wie einzelne Ressourcen verarbeitet und in einem Zip-Archiv gespeichert werden. Sie können damit ein strukturiertes und komprimiertes Archiv erstellen, das SVG-Dokumente und zugehörige Ressourcen enthält, wodurch es sich für Szenarien wie Archivierung und Speicheroptimierung eignet.
Im folgenden Beispiel wird die Klasse ZipResourceHandler
verwendet, um das Dokument
with-resources.svg zusammen mit seinen verknüpften Ressourcen in einem Zip-Archiv zu speichern:
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 }
Die Klasse ResourceHandler
ist für die Kundenimplementierung vorgesehen. Die Klasse ZipResourceHandler
erweitert die Basisklasse ResourceHandler
und bietet eine praktische Möglichkeit, den gesamten Prozess der Handhabung und Speicherung von mit einem SVG-Dokument verknüpften Ressourcen in einem Zip-Archiv im Kontext der Aspose.SVG für .NET-Bibliothek zu verwalten:
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 }
Speichern Sie SVG in Memory Streams
Die Klassenimplementierung
ResourceHandler in der Klasse MemoryResourceHandler ermöglicht das Speichern von SVG in Speicherstreams. Der folgende Code zeigt, wie Sie mit der Klasse MemoryResourceHandler
ein SVG-Dokument im Speicher speichern und Informationen über die verarbeiteten Ressourcen sammeln und drucken.
- Initialisieren Sie ein SVG-Dokument mit dem angegebenen SVG-Dateipfad.
- Erstellen Sie eine Instanz der Klasse
MemoryResourceHandler
. Diese Klasse dient zum Erfassen und Speichern von Ressourcen in Speicherströmen während des Ressourcenverarbeitungsprozesses. - Rufen Sie die Methode
Save()
des SVG-Dokuments auf und übergeben Sie ihr die InstanzMemoryResourceHandler
als Argument. Dadurch wird die Ressourcenverwaltungslogik desMemoryResourceHandler
mit dem SVG-Dokumentspeicherprozess verknüpft. - Verwenden Sie die Methode
PrintInfo()
desMemoryResourceHandler
, um Informationen über die verwalteten Ressourcen auszudrucken.
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 }
Nach dem Beispiellauf wird die Meldung zur Speicherbelegung ausgegeben:
uri:memory:///with-resources.svg, length:556
uri:memory:///photo.png, length:57438
Der
ResourceHandler ist eine Basisklasse, die die Erstellung und Verwaltung von Ausgabestreams unterstützt. Mit der Klasse MemoryResourceHandler
können Sie Ressourcen-In-Memory-Streams erfassen und speichern und so eine dynamische und flexible Möglichkeit bieten, mit Ressourcen umzugehen, ohne sie physisch im Dateisystem zu speichern. Der folgende Codeausschnitt zeigt die Realisierung von ResourceHandler
in der Klasse 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 }
Sie können die vollständigen Beispiele und Datendateien von GitHub herunterladen. Informationen zum Herunterladen von GitHub und zum Ausführen von Beispielen finden Sie im Abschnitt So führen Sie die Beispiele aus.
Sie können versuchen, SVG-Dokumente mit unserem Kostenlosen Online-SVG-Konverter in verschiedene andere Formate zu konvertieren.