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.

  1. Initialisieren Sie ein SVG-Dokument mit dem angegebenen SVG-Dateipfad.
  2. Erstellen Sie eine Instanz der Klasse MemoryResourceHandler. Diese Klasse dient zum Erfassen und Speichern von Ressourcen in Speicherströmen während des Ressourcenverarbeitungsprozesses.
  3. Rufen Sie die Methode Save() des SVG-Dokuments auf und übergeben Sie ihr die Instanz MemoryResourceHandler als Argument. Dadurch wird die Ressourcenverwaltungslogik des MemoryResourceHandler mit dem SVG-Dokumentspeicherprozess verknüpft.
  4. Verwenden Sie die Methode PrintInfo() des MemoryResourceHandler, 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.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.