输出流 – 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 类的主要部分:

  1. Streams 属性。在文档渲染期间会创建一个 MemoryStream 对象列表。这些对象将存储写入输出流的数据。
  2. GetStream() 方法的实现。GetStream() 方法创建新的 MemoryStream 对象,将其添加到 Streams 列表中,并将其作为输出流返回。
  3. ReleaseStream() 方法的实现。ReleaseStream() 方法释放一个装满数据的流对象。在本实现中,该方法是空的。不过,你仍可以自定义该方法来执行一些操作,如将数据流刷新到硬盘或释放与数据流相关的任何资源。
  4. Dispose() 方法的实现。调用该方法是为了释放由 MemoryStreamProvider 类持有的任何资源。该实现使用一个 foreach 循环来处理 Streams 列表中的所有 MemoryStream 对象。

将 C# MemoryStream 转为文件

以下 C# 代码演示了如何使用 MemoryStreamProvider 类和 Aspose.HTML for .NET 库将多页 HTML 文档转换为 JPG 并将图像保存到文件中。让我们来看看执行以下步骤的示例:

  1. 创建一个新的 MemoryStreamProvider 类实例。它将用作转换过程的输出流。
  2. 使用 HTMLDocument 类初始化 HTML 文档。
  3. 使用 ImageSaveOptions() 构造函数配置图像保存选项,如 “图像格式” - JPEG(在本例中)。
  4. 调用 ConvertHTML(document, options, provider) 方法,使用保存选项和 MemoryStreamProvider 将 HTMLDocument 对象转换为图像。
  5. 使用 foreach 循环遍历 streamProvider 对象的 Streams 属性中的每个 MemoryStream 对象。每个 MemoryStream 代表转换后 HTML 文档的一个页面。
  6. 调用内存流上的 memory.Seek() 方法,将位置设置为起始位置。这样可以确保将数据流的全部内容复制到输出文件中。
  7. 在循环内使用 File.Create() 方法为当前页面创建输出文件。
  8. 使用 memory.CopyTo() 方法将内存流的内容复制到代表输出文件的 FileStream 对象。
  9. 处理完每一页后,页面计数器都会递增,以跟踪输出文件名的页码。
 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 转换为 PDFHTML 转换为 JPGSVG 转换为 PDFMHTML 转换为 PDFMD 转换为 HTML,只需选择文件,选择要转换的格式,就大功告成了。它速度快,而且完全免费!

文本 “免费在线转换器”

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.