Output Streams – C# MemoryStream

Output Streams – C#

В операциях преобразования мы обычно сохраняем результат рендеринга в файл. Однако в некоторых случаях вам может потребоваться сохранить результат в памяти или отправить его в удаленное хранилище. Вы можете легко сделать это, реализовав специализированный интерфейс ICreateStreamProvider и используя его в качестве входного параметра для преобразователя. Этот интерфейс представляет собой обратный вызов, который используется, когда требуется новый поток вывода.

Примечание. Его можно вызывать несколько раз, когда требуется несколько выходных потоков. Сценарий, когда этот случай возможен, – это рендеринг HTML в набор файлов изображений.

Класс MemoryStreamProvider

Библиотека C# Aspose.HTML позволяет реализовать класс MemoryStreamProvider как пользовательскую реализацию интерфейса ICreateStreamProvider. Класс MemoryStreamProvider предоставляет объекты C# MemoryStream в качестве выходных потоков для записи данных, которые могут храниться в памяти в виде потока.

Использование C# MemoryStream помогает избежать задержек, обычно связанных с чтением или записью файлов на диск. Кроме того, поскольку содержимое MemoryStream остается в памяти, физическое пространство на диске не используется. Приведенный ниже код C# является примером приложения, которое использует ICreateStreamProvider для сохранения результата рендеринга в памяти и сброса его в файл позже:

 1using Aspose.Html.IO;
 2using System.Collections.Generic;
 3using System.IO;
 4...
 5    class MemoryStreamProvider : Aspose.Html.IO.ICreateStreamProvider
 6    {
 7        // List of MemoryStream objects created during the document rendering
 8        public List<MemoryStream> Streams { get; } = new List<MemoryStream>();
 9
10        public Stream GetStream(string name, string extension)
11        {
12            // This method is called when only one output stream is required, for instance for XPS, PDF or TIFF formats
13            MemoryStream result = new MemoryStream();
14            Streams.Add(result);
15            return result;
16        }
17
18        public Stream GetStream(string name, string extension, int page)
19        {
20            // 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.)
21            MemoryStream result = new MemoryStream();
22            Streams.Add(result);
23            return result;
24        }
25
26        public void ReleaseStream(Stream stream)
27        {
28            //  Here you can release the stream filled with data and, for instance, flush it to the hard-drive
29        }
30
31        public void Dispose()
32        {
33            // Releasing resources
34            foreach (var stream in Streams)
35                stream.Dispose();
36        }
37    }

Давайте рассмотрим основные части класса MemoryStreamProvider:

  1. Свойство Streams. Список объектов MemoryStream создается во время рендеринга документа. Эти объекты будут хранить данные, которые записываются в выходные потоки.
  2. Реализация методов GetStream(). Методы GetStream() создают новые объекты MemoryStream, добавляют их в список Streams и возвращают их как выходные потоки.
  3. Реализация метода ReleaseStream(). Метод ReleaseStream() освобождает объект Stream, заполненный данными. В этой реализации метод пустой. Тем не менее, вы можете настроить его для выполнения таких операций, как сброс потока на жесткий диск или освобождение любых ресурсов, связанных с потоком.
  4. Реализация метода Dispose(). Этот метод вызывается для освобождения любых ресурсов, удерживаемых классом MemoryStreamProvider. Эта реализация удаляет все объекты MemoryStream в списке Streams, используя цикл foreach.

C# MemoryStream to File

В следующем коде C# показано, как использовать класс MemoryStreamProvider и библиотеку Aspose.HTML для преобразования HTML в JPG и сохранения изображения в файл. Давайте рассмотрим пример, где выполняются следующие шаги:

  1. Создайте новый экземпляр класса MemoryStreamProvider. Он будет использоваться в качестве выходного потока для процесса преобразования.
  2. Инициализируйте HTML-документ с помощью класса HTMLDocument.
  3. Используйте конструктор ImageSaveOptions(), чтобы настроить параметры сохранения изображения, такие как ImageFormat – JPEG (в данном случае).
  4. Вызовите метод ConvertHTML(document, options, provider), чтобы преобразовать объект HTMLDocument в изображение с использованием параметров сохранения и MemoryStreamProvider.
  5. Используйте цикл foreach для перебора каждого объекта MemoryStream в свойстве Streams объекта streamProvider. Каждый MemoryStream представляет собой страницу преобразованного HTML-документа.
  6. Вызовите метод memory.Seek() в потоке памяти, чтобы установить позицию в начало. Это делается для того, чтобы на следующем шаге все содержимое потока было скопировано в файловый поток.
  7. Используйте метод File.Create() внутри цикла, чтобы создать выходной файл для текущей страницы.
  8. Используйте метод memory.CopyTo(), чтобы скопировать содержимое потока памяти в объект FileStream, представляющий выходной файл.
  9. После обработки каждой страницы счетчик страниц увеличивается, чтобы отслеживать номер страницы для имен выходных файлов.
 1using Aspose.Html;
 2using System.IO;
 3using Aspose.Html.Converters;
 4using Aspose.Html.Rendering.Image;
 5using Aspose.Html.Saving;
 6...
 7    // Create an instance of MemoryStreamProvider
 8    using (var streamProvider = new MemoryStreamProvider())
 9    {
10        // Prepare HTML code
11        var code = @"<style>
12                    div { page-break-after: always; }
13                    </style>
14                    <div style='border: 1px solid red; width: 300px'>First Page</div>
15                    <div style='border: 1px solid red; width: 300px'>Second Page</div>
16                    <div style='border: 1px solid red; width: 300px'>Third Page</div>
17                  ";
18        // Initialize an HTML document from the HTML code
19        using var document = new HTMLDocument(code, ".");
20        {
21            // Convert HTML to Image by using the MemoryStreamProvider
22            Converter.ConvertHTML(document, new ImageSaveOptions(ImageFormat.Jpeg), streamProvider);
23
24            // Get access to the memory stream that contains the result data
25            var page = 1;
26            foreach (var memory in streamProvider.Streams)
27            {
28                memory.Seek(0, SeekOrigin.Begin);
29
30                // Flush the result data to the output file
31                using (FileStream fs = File.Create(Path.Combine(OutputDir, "output_" + page + ".jpg")))
32                {
33                    memory.CopyTo(fs);
34                }
35                page++;
36            }
37        }
38    }

Aspose.HTML предлагает бесплатные онлайн Конвертеры для преобразования файлов HTML, XHTML, MHTML, EPUB, XML и Markdown в различные популярные форматы. Вы можете легко конвертировать HTML в PDF, HTML в JPG, SVG в PDF, MHTML в PDF или MD to HTML. Просто выберите файл, выберите формат для преобразования, и готово! Это быстро и совершенно бесплатно!

Text “Баннер – Бесплатные онлайн-конвертеры”

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.