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 for .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 Aspose.Svg;
2using System.IO; 1// Save SVG to file using C#
2
3// Prepare a path to save an SVG document
4string documentPath = Path.Combine(OutputDir, "circles_out.svg");
5
6// Load the SVG document from a file
7using (SVGDocument document = new SVGDocument(Path.Combine(DataDir, "circles.svg")))
8{
9 // Work with the document
10
11 // Save SVG to a file
12 document.Save(documentPath);
13}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 Aspose.Svg;
2using System.IO; 1// Save SVG to Url using C#
2
3// Set a full path for an SVG document saving
4Url url = new Url(Path.Combine(OutputUrl, "lineto_out.svg"), Directory.GetCurrentDirectory());
5
6// Load the SVG document from a file
7using (SVGDocument document = new SVGDocument(Path.Combine(DataDir, "lineto.svg")))
8{
9 // Work with the document
10
11 // Save the document to a Url
12 document.Save(url);
13}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; 1// Save an SVG document along with its external resources in C#
2
3// Prepare a path to a source SVG file
4string inputPath = Path.Combine(DataDir, "with-resources.svg");
5
6// Prepare a full path to an output directory
7string customOutDir = Path.Combine(Directory.GetCurrentDirectory(), "./../../../../tests-out/saving/");
8
9// Load an SVG document from a file
10using (SVGDocument doc = new SVGDocument(inputPath))
11{
12 // Save SVG with resources
13 doc.Save(new FileSystemResourceHandler(customOutDir));
14}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; 1// Save SVG to a Zip Archive using C#
2
3// Prepare a path to a source SVG file
4string inputPath = Path.Combine(DataDir, "with-resources.svg");
5
6string dir = Directory.GetCurrentDirectory();
7
8// Prepare a full path to an output Zip storage
9string customArchivePath = Path.Combine(dir, "./../../../../tests-out/saving/archive.zip");
10
11// Load an SVG document
12using (SVGDocument doc = new SVGDocument(inputPath))
13{
14 // Initialize an instance of the ZipResourceHandler class
15 using (ZipResourceHandler resourceHandler = new ZipResourceHandler(customArchivePath))
16 {
17 // Save SVG with resources to a Zip archive
18 doc.Save(resourceHandler);
19 }
20}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 for .NET-Bibliothek zu verwalten:
1// Custom resource handler to save SVG with resources into a ZIP archive
2
3internal class ZipResourceHandler : ResourceHandler, IDisposable
4{
5 private FileStream zipStream;
6 private ZipArchive archive;
7 private int streamsCounter;
8 private bool initialized;
9
10 public ZipResourceHandler(string name)
11 {
12 DisposeArchive();
13 zipStream = new FileStream(name, FileMode.Create);
14 archive = new ZipArchive(zipStream, ZipArchiveMode.Update);
15 initialized = false;
16 }
17
18 public override void HandleResource(Resource resource, ResourceHandlingContext context)
19 {
20 string zipUri = (streamsCounter++ == 0
21 ? Path.GetFileName(resource.OriginalUrl.Href)
22 : Path.Combine(Path.GetFileName(Path.GetDirectoryName(resource.OriginalUrl.Href)),
23 Path.GetFileName(resource.OriginalUrl.Href)));
24 string samplePrefix = String.Empty;
25 if (initialized)
26 samplePrefix = "my_";
27 else
28 initialized = true;
29
30 using (Stream newStream = archive.CreateEntry(samplePrefix + zipUri).Open())
31 {
32 resource.WithOutputUrl(new Url("file:///" + samplePrefix + zipUri)).Save(newStream, context);
33 }
34 }
35
36 private void DisposeArchive()
37 {
38 if (archive != null)
39 {
40 archive.Dispose();
41 archive = null;
42 }
43
44 if (zipStream != null)
45 {
46 zipStream.Dispose();
47 zipStream = null;
48 }
49
50 streamsCounter = 0;
51 }
52
53 public void Dispose()
54 {
55 DisposeArchive();
56 }
57}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 InstanzMemoryResourceHandlerals Argument. Dadurch wird die Ressourcenverwaltungslogik desMemoryResourceHandlermit 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; 1// Save an SVG document to memory with a resource handler in C#
2
3// Prepare a path to a source SVG file
4string inputPath = Path.Combine(DataDir, "with-resources.svg");
5
6// Initialize an SVG document
7using (SVGDocument doc = new SVGDocument(inputPath))
8{
9 // Create an instance of the MemoryResourceHandler class and save SVG to memory
10 MemoryResourceHandler resourceHandler = new MemoryResourceHandler();
11 doc.Save(resourceHandler);
12 resourceHandler.PrintInfo();
13}Nach dem Beispiellauf wird die Meldung zur Speicherbelegung ausgegeben:
uri:memory:///with-resources.svg, length:556uri: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// Handle and save SVG resources to memory streams in C#
2
3internal class MemoryResourceHandler : ResourceHandler
4{
5 public List<Tuple<Stream, Resource>> Streams;
6
7 public MemoryResourceHandler()
8 {
9 Streams = new List<Tuple<Stream, Resource>>();
10 }
11
12 public override void HandleResource(Resource resource, ResourceHandlingContext context)
13 {
14 MemoryStream outputStream = new MemoryStream();
15 Streams.Add(Tuple.Create<Stream, Resource>(outputStream, resource));
16 resource
17 .WithOutputUrl(new Url(Path.GetFileName(resource.OriginalUrl.Pathname), "memory:///"))
18 .Save(outputStream, context);
19 }
20
21 public void PrintInfo()
22 {
23 foreach (Tuple<Stream, Resource> stream in Streams)
24 Console.WriteLine($"uri:{stream.Item2.OutputUrl}, length:{stream.Item1.Length}");
25 }
26}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.