Aspose.SVG for .NET 24.3.0 – Speichern Sie SVG in einem Stream
Aspose.SVG for .NET 24.3.0
In Version 24.3.0 sind die Schnittstelle IOutputStorage und die Klasse LocalFileSystemStorage veraltet, funktionieren aber weiterhin, bis Version 24.6.0 veröffentlicht wird. Wenn Sie frühere Versionen von Aspose.SVG for .NET verwenden, empfehlen wir Ihnen ein Upgrade und eine Migration auf die neue Version, da Version 24.6.0 diese veralteten Klassen entfernt.
Deprecated | New |
---|---|
IOutputStorage Interface | ResourceHandler Class |
LocalFileSystemStorage Class | FileSystemResourceHandler Class |
Das SVG-Dokument kann verschiedene Ressourcen wie CSS, externe Bilder und Dateien enthalten. In dem Artikel betrachten wir die Fälle zum Speichern von SVG-Dokumenten mit Ressourcen im Zip-Archiv, im Speicherstream und im lokalen Dateisystemspeicher. Aspose.SVG for .NET entwickelt und verbessert die Möglichkeiten zum Speichern von SVGs mit allen verknüpften Dateien weiter. Hier sehen wir uns Beispiele für das Speichern von Dateien mithilfe veralteter Klassen an und bieten erweiterte Lösungen für die Implementierung neuer Klassen an.
ResourceHandler-Klasse vs IOutputStorage-Schnittstelle
Mit der Klasse
ResourceHandler können Entwickler die Methode HandleResource()
implementieren, mit der Sie selbst einen Stream erstellen und ihn überall dort freigeben können, wo Sie ihn benötigen. Die neue Methode bietet die Möglichkeit, eine Resource
anzuzeigen und weitere Informationen darüber zu verarbeiten. Durch die Einführung der ResourceHandler
-Klasse können Entwickler also von einem schlankeren und ausdrucksstärkeren Ansatz zur Ressourcenverwaltung profitieren, was zu saubererem, besser wartbarem und flexiblem Code beim Speichern von SVG-Dokumenten führt.
Speichern Sie SVG in einem Zip-Archiv
Hier untersuchen wir ein und dasselbe Beispiel für das Speichern der Datei
with-resources.svg in einem Zip-Archiv unter Verwendung einer veralteten IOutputStorage
-Schnittstelle und einer neuen ResourceHandler
-Klasse.
Verwenden von IOutputStorage – 24.2.0 und frühere Versionen
Die Schnittstelle IOutputStorage
war eine Basisschnittstelle, die die Erstellung und Verwaltung von Ausgabeströmen unterstützte. Sie können die IOutputStorage-Schnittstelle implementieren, indem Sie die Klasse ZipStorage erstellen, um SVG mit 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/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 }
Der folgende Codeausschnitt zeigt die Realisierung von IOutputStorage
in der Klasse ZipStorage, um das Speichern eines SVG-Dokuments mit Ressourcen in einem Zip-Archiv zu demonstrieren.
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 }
Verwendung der neuen ResourceHandler-Klasse – seit Version 24.3.0
Die Klasse
ResourceHandler ist für die Kundenimplementierung vorgesehen. Das folgende C#-Beispiel zeigt, wie man ein SVG-Dokument mit Ressourcen mithilfe der ZipResourceHandler-Klasse des ResourceHandler
in einem Zip-Archiv speichert:
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 }
Der folgende Codeausschnitt zeigt die Realisierung des ResourceHandler
in der Klasse ZipResourceHandler, um das Speichern eines SVG-Dokuments mit Ressourcen in einem Zip-Archiv zu demonstrieren. Die Methode
HandleResource() der Klasse ZipResourceHandler
ist für die Handhabung jeder Ressource während des Speichervorgangs beim Erstellen eines Zip-Archivs verantwortlich:
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
Betrachten wir das C#-Beispiel zum Speichern einer SVG-Datei mit verknüpften Ressourcen in einem Speicherstream mithilfe der veralteten Schnittstelle IOutputStorage
und der neuen Klasse
ResourceHandler. Das Quelldokument
with-resources.svg und die verknüpften Bilddateien befinden sich im selben Verzeichnis.
Verwenden von IOutputStorage – 24.2.0 und frühere Versionen
Die Schnittstellenimplementierung IOutputStorage
ermöglichte das Speichern von SVG in Speicherstreams:
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 }
Nach dem Beispiellauf wird die Meldung zur Speicherbelegung ausgegeben:
uri:memory:///with-resources.svg, length:556
uri:memory:///photo.png, length:57438
Der folgende Codeausschnitt zeigt die Realisierung von IOutputStorage
in der Klasse MemoryOutputStorage, um das Speichern eines SVG-Dokuments in Speicherstreams zu demonstrieren.
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 }
Verwendung der neuen ResourceHandler-Klasse – seit Version 24.3.0
Der folgende Codeausschnitt zeigt die Realisierung des ResourceHandler
in der Klasse MemoryResourceHandler, um das Speichern eines SVG-Dokuments in Speicherstreams zu demonstrieren:
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 }
Anstelle der Methoden CreateStream()
und ReleaseStream()
, die in der Klasse MemoryOutputStorage
der Schnittstelle IOutputStorage
implementiert sind, gibt es jetzt eine Methode
HandleResource(), die in der Klasse MemoryResourceHandler
der Schnittstelle ResourceHandler
-Klasse, in der Sie selbst einen Stream erstellen und ihn dort freigeben können, wo Sie ihn benötigen. Die neue Methode bietet die Möglichkeit, eine Resource
anzuzeigen und weitere Informationen darüber zu verarbeiten:
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 }
Wie Sie sehen, arbeitet der neue Ansatz direkt mit Resource
-Objekten, sodass keine zusätzlichen Klassen wie OutputStream
erforderlich sind. Dies vereinfacht den Code und macht die Interaktion mit Ressourcen expliziter und verständlicher. Daher bietet die Basisklasse ResourceHandler
eine einfachere und ausdrucksstärkere Möglichkeit, Ressourcen beim Speichern von SVG-Dokumenten in Speicherstreams zu verwalten.
Nach dem Beispiellauf wird die Meldung zur Speicherbelegung ausgegeben:
uri:memory:///with-resources.svg, length:556
uri:memory:///photo.png, length:57438
FileSystemResourceHandler-Klasse vs LocalFileSystemStorage-Klasse
Im Gegensatz zur LocalFileSystemStorage-Klasse können Sie mit der neuen Klasse FileSystemResourceHandler nicht nur SVG-Dokumente und -Ressourcen im ausgewählten Ordner speichern, sondern über die Methoden der Basisklasse ResourceHandler auch deren Schreiben steuern Links in übergeordneten Dateien zu den Dateien, die Sie speichern.
Speichern Sie SVG in einem lokalen Dateisystemspeicher
Hier untersuchen wir das gleiche Beispiel des Speicherns der SVG-Datei
with-resources.svg im lokalen Dateisystemspeicher unter Verwendung der veralteten Klasse LocalFileSystemStorage
und der neuen Klasse FileSystemResourceHandler
.
Verwenden der LocalFileSystemStorage-Klasse – 24.2.0 und frühere Versionen
Das Quell-SVG-Dokument mit den verknüpften Bilddateien befindet sich im selben Verzeichnis. Der Konstruktor LocalFileSystemStorage(customOutDir)
erstellt ein Objekt, das ein Dateisystemspeicher ist. Die Methode Save(IOutputStorage)
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/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 }
Verwendung der FileSystemResourceHandler-Klasse – seit Version 24.3.0
Die Klasse
FileSystemResourceHandler ist eine Implementierung der Klasse ResourceHandler
in Aspose.SVG for .NET. Diese Klasse wurde explizit zum Speichern von Ressourcen im lokalen Dateisystem entwickelt und bietet eine praktische und erweiterbare Lösung für die Ressourcenverwaltung beim Speichern von SVG-Dokumenten. Der folgende Codeausschnitt demonstriert die Verwendung der Klasse 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 }
Der Konstruktor
FileSystemResourceHandler(customOutDir) verwendet einen Pfad, der angibt, wo die Ressourcen gespeichert werden, und erstellt ein FileSystemResourceHandler-Objekt. Die Methode Save(resourceHandler)
nimmt dieses Objekt und speichert SVG im Ausgabespeicher.
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.