输出流 – C# 内存流
输出流 – C#
在转换操作中,我们通常会将渲染结果保存到文件中。不过,在某些情况下,您可能需要将结果存储在内存中或发送到远程存储器。通过实现专门的 ICreateStreamProvider 接口并将其作为转换器的输入参数,您就可以轻松地做到这一点。该接口代表一个回调,在需要新的输出流时使用。
注: 需要多个输出流时,可能会调用几次。可能出现这种情况的场景是向图像文件集渲染 HTML。
MemoryStreamProvider 类
Aspose.HTML C# 库允许将 MemoryStreamProvider 类作为 ICreateStreamProvider 接口的自定义实现来实现MemoryStreamProvider 类提供 C# MemoryStream 对象作为写入数据的输出流,这些数据可作为流存储在内存中。
使用 C# MemoryStream 有助于避免在磁盘上读取或写入文件时常见的延迟。此外,由于 MemoryStream 的内容保留在内存中,因此不会占用磁盘上的物理空间。
1// How to capture output in memory using a custom stream provider
2
3class MemoryStreamProvider : ICreateStreamProvider
4{
5 // List of MemoryStream objects created during the document rendering
6 public List<MemoryStream> Streams { get; } = new List<MemoryStream>();
7
8 public Stream GetStream(string name, string extension)
9 {
10 // This method is called when only one output stream is required, for instance for XPS, PDF or TIFF formats
11 MemoryStream result = new MemoryStream();
12 Streams.Add(result);
13 return result;
14 }
15
16 public Stream GetStream(string name, string extension, int page)
17 {
18 // This method is called when the creation of multiple output streams are required. For instance, during the rendering HTML to list of image files (JPG, PNG, etc.)
19 MemoryStream result = new MemoryStream();
20 Streams.Add(result);
21 return result;
22 }
23
24 public void ReleaseStream(Stream stream)
25 {
26 // Here you can release the stream filled with data and, for instance, flush it to the hard-drive
27 }
28
29 public void Dispose()
30 {
31 // Releasing resources
32 foreach (MemoryStream stream in Streams)
33 stream.Dispose();
34 }
35}
让我们来看看 MemoryStreamProvider
类的主要部分:
- Streams 属性。在文档渲染期间会创建一个 MemoryStream 对象列表。这些对象将存储写入输出流的数据。
- GetStream() 方法的实现。GetStream() 方法创建新的 MemoryStream 对象,将其添加到 Streams 列表中,并将其作为输出流返回。
- ReleaseStream() 方法的实现。ReleaseStream() 方法释放一个装满数据的流对象。在本实现中,该方法是空的。不过,你仍可以自定义该方法来执行一些操作,如将数据流刷新到硬盘或释放与数据流相关的任何资源。
- Dispose() 方法的实现。调用该方法是为了释放由 MemoryStreamProvider 类持有的任何资源。该实现使用一个 foreach 循环来处理 Streams 列表中的所有 MemoryStream 对象。
将 C# MemoryStream 转为文件
以下 C# 代码演示了如何使用 MemoryStreamProvider 类和 Aspose.HTML for .NET 库将多页 HTML 文档转换为 JPG 并将图像保存到文件中。让我们来看看执行以下步骤的示例:
- 创建一个新的
MemoryStreamProvider
类实例。它将用作转换过程的输出流。 - 使用 HTMLDocument 类初始化 HTML 文档。
- 使用 ImageSaveOptions() 构造函数配置图像保存选项,如 “图像格式” - JPEG(在本例中)。
- 调用 ConvertHTML(document, options, provider) 方法,使用保存选项和 MemoryStreamProvider 将 HTMLDocument 对象转换为图像。
- 使用
foreach
循环遍历streamProvider
对象的Streams
属性中的每个MemoryStream
对象。每个 MemoryStream 代表转换后 HTML 文档的一个页面。 - 调用内存流上的
memory.Seek()
方法,将位置设置为起始位置。这样可以确保将数据流的全部内容复制到输出文件中。 - 在循环内使用
File.Create()
方法为当前页面创建输出文件。 - 使用
memory.CopyTo()
方法将内存流的内容复制到代表输出文件的 FileStream 对象。 - 处理完每一页后,页面计数器都会递增,以跟踪输出文件名的页码。
1// Convert HTML to JPEG in C# using output memory streams for writing data
2
3// Create an instance of MemoryStreamProvider
4using (MemoryStreamProvider streamProvider = new MemoryStreamProvider())
5{
6 // Prepare HTML code
7 string code = @"<style>
8 div { page-break-after: always; }
9 </style>
10 <div style='border: 1px solid red; width: 300px'>First Page</div>
11 <div style='border: 1px solid red; width: 300px'>Second Page</div>
12 <div style='border: 1px solid red; width: 300px'>Third Page</div>
13 ";
14 // Initialize an HTML document from the HTML code
15 using HTMLDocument document = new HTMLDocument(code, ".");
16 {
17 // Convert HTML to Image by using the MemoryStreamProvider
18 Converter.ConvertHTML(document, new ImageSaveOptions(ImageFormat.Jpeg), streamProvider);
19
20 // Get access to the memory stream that contains the result data
21 int page = 1;
22 foreach (MemoryStream memory in streamProvider.Streams)
23 {
24 memory.Seek(0, SeekOrigin.Begin);
25
26 // Flush the result data to the output file
27 using (FileStream fs = File.Create(Path.Combine(OutputDir, "page_" + page + ".jpg")))
28 {
29 memory.CopyTo(fs);
30 }
31 page++;
32 }
33 }
34}
Aspose.HTML 提供免费的在线 转换器,用于将 HTML、XHTML、MHTML、EPUB、XML 和 Markdown 文件转换为各种流行格式。您可以轻松地将 HTML 转换为 PDF、 HTML 转换为 JPG、 SVG 转换为 PDF、 MHTML 转换为 PDF 或 MD 转换为 HTML,只需选择文件,选择要转换的格式,就大功告成了。它速度快,而且完全免费!