保存 SVG 文档 - C#
保存 SVG 文档
您需要执行的大多数任务都需要保存文档。加载现有文件或从头开始创建 SVG 文档后,您可以使用 SVGDocument.Save() 方法之一保存更改。有一些重载方法允许将 SVG 保存到文件、流、Zip 存档或 URL。
在本文中,我们将回顾保存为相同格式的 SVG 文档。您将了解如何使用 SVGDocument 类的 Save() 方法保存 SVG 文件。此外,Aspose.SVG for .NET 提供了 ResourceHandler 类,允许将带有资源的 SVG 文档保存到流中并进行管理。
将 SVG 转换和渲染为其他格式的场景可在 如何转换 SVG 文件 部分中查看。
将 SVG 保存到文件
以下代码片段演示了如何使用 SVGDocument.Save() 方法将 SVG 文档保存到文件中:
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 保存到 URL
需要为文档
lineto.svg 保存指定完整的 Url 路径,并将 url
对象传递给 Save() 方法,该方法将文档保存到 Url 指定的文件中。以下代码示例演示如何将文档保存到 Url:
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 }
将 SVG 保存到本地文件系统存储
SVG 文档可以包含不同的资源,例如 CSS、外部图像和文件。 Aspose.SVG 提供了一种将 SVG 与所有链接文件一起保存的方法 - ResourceHandler 类是为了将 SVG 内容和资源保存到流而开发的。此类负责处理资源并提供允许您控制对每个资源执行的操作的方法。
让我们考虑一个将 SVG 资源保存到用户指定的本地文件存储的示例。源
with-resources.svg 文档及其链接图像文件位于同一目录中。
FileSystemResourceHandler(customOutDir
) 构造函数采用指示保存资源文档的路径,并创建一个 FileSystemResourceHandler
对象。
Save(resourceHandler
) 方法获取此对象并将 SVG 保存到输出存储。
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 }
将 SVG 保存到 Zip 存档
您可以通过创建 ZipResourceHandler 类来实现
ResourceHandler。 ZipResourceHandler
类中的
HandleResource() 方法用于自定义如何处理单个资源并将其存储在 Zip 存档中的行为。它允许您创建包含 SVG 文档和相关资源的结构化压缩存档,使其适合存档和存储优化等场景。
在以下示例中,ZipResourceHandler
类用于将
with-resources.svg 文档及其链接资源保存到 Zip 存档:
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 }
ResourceHandler
类旨在供客户实现。 ZipResourceHandler
类扩展了 ResourceHandler
基类,并提供了一种便捷的方法来管理在 Aspose.SVG for .NET 库的上下文中处理和存储与 SVG 文档链接的资源到 Zip 存档的整个过程:
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 }
将 SVG 保存到内存流
MemoryResourceHandler 类中的
ResourceHandler 类实现允许将 SVG 保存到内存流。以下代码演示了如何使用MemoryResourceHandler
类在内存中存储 SVG 文档,收集和打印有关已处理资源的信息。
- 使用指定的 SVG 文件路径初始化 SVG 文档。
- 创建
MemoryResourceHandler
类的实例。此类旨在在资源处理过程中捕获和存储内存流中的资源。 - 调用 SVG 文档的
Save()
方法并将MemoryResourceHandler
实例作为参数传递给它。这会将MemoryResourceHandler
的资源处理逻辑与 SVG 文档保存过程相关联。 - 使用
MemoryResourceHandler
的PrintInfo()
方法打印有关已处理资源的信息。
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 }
示例运行后,将打印有关内存存储的消息:
uri:memory:///with-resources.svg, length:556
uri:memory:///photo.png, length:57438
ResourceHandler 是支持输出流的创建和管理的基类。 MemoryResourceHandler
类允许您捕获并将资源存储在内存流中,提供动态且灵活的方式来处理资源,而无需将资源物理保存到文件系统。以下代码片段展示了 MemoryResourceHandler 类中 ResourceHandler
的实现:
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 }
您可以从 GitHub 下载完整的示例和数据文件。关于从 GitHub 下载并运行示例,您可以从 如何运行示例 部分找到。
您可以尝试使用我们的 免费在线 SVG 转换器 将 SVG 文档转换为各种其他格式。