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.

DeprecatedNew
IOutputStorage InterfaceResourceHandler Class
LocalFileSystemStorage ClassFileSystemResourceHandler 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.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.