Output Streams – C# MemoryStream – Aspose.HTML for .NET
Output Streams – C#
В операциях преобразования мы обычно сохраняем результат рендеринга в файл. Однако в некоторых случаях вам может потребоваться сохранить результат в памяти или отправить его в удаленное хранилище. Вы можете легко сделать это, реализовав специализированный интерфейс ICreateStreamProvider и используя его в качестве входного параметра для преобразователя. Этот интерфейс представляет собой обратный вызов, который используется, когда требуется новый поток вывода.
Примечание. Его можно вызывать несколько раз, когда требуется несколько выходных потоков. Сценарий, когда этот случай возможен, – это рендеринг HTML в набор файлов изображений.
Класс MemoryStreamProvider
Библиотека C# Aspose.HTML позволяет реализовать класс MemoryStreamProvider
как пользовательскую реализацию интерфейса
ICreateStreamProvider. Класс MemoryStreamProvider
предоставляет объекты C# MemoryStream в качестве выходных потоков для записи данных, которые могут храниться в памяти в виде потока.
Использование C# MemoryStream помогает избежать задержек, обычно связанных с чтением или записью файлов на диск. Кроме того, поскольку содержимое MemoryStream остается в памяти, физическое пространство на диске не используется.
1class MemoryStreamProvider : ICreateStreamProvider
2{
3 // List of MemoryStream objects created during the document rendering
4 public List<MemoryStream> Streams { get; } = new List<MemoryStream>();
5
6 public Stream GetStream(string name, string extension)
7 {
8 // This method is called when only one output stream is required, for instance for XPS, PDF or TIFF formats
9 MemoryStream result = new MemoryStream();
10 Streams.Add(result);
11 return result;
12 }
13
14 public Stream GetStream(string name, string extension, int page)
15 {
16 // 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.)
17 MemoryStream result = new MemoryStream();
18 Streams.Add(result);
19 return result;
20 }
21
22 public void ReleaseStream(Stream stream)
23 {
24 // Here you can release the stream filled with data and, for instance, flush it to the hard-drive
25 }
26
27 public void Dispose()
28 {
29 // Releasing resources
30 foreach (var stream in Streams)
31 stream.Dispose();
32 }
33}
Давайте рассмотрим основные части класса MemoryStreamProvider
:
- Свойство Streams. Список объектов
MemoryStream
создается во время рендеринга документа. Эти объекты будут хранить данные, которые записываются в выходные потоки. - Реализация методов
GetStream()
. Методы GetStream() создают новые объекты MemoryStream, добавляют их в список Streams и возвращают их как выходные потоки. - Реализация метода
ReleaseStream()
. Метод ReleaseStream() освобождает объект Stream, заполненный данными. В этой реализации метод пустой. Тем не менее, вы можете настроить его для выполнения таких операций, как сброс потока на жесткий диск или освобождение любых ресурсов, связанных с потоком. - Реализация метода Dispose(). Этот метод вызывается для освобождения любых ресурсов, удерживаемых классом
MemoryStreamProvider
. Эта реализация удаляет все объекты MemoryStream в списке Streams, используя цикл foreach.
C# MemoryStream to File
В следующем коде C# показано, как использовать класс MemoryStreamProvider
и библиотеку Aspose.HTML for .NET для преобразования HTML в JPG и сохранения изображения в файл. Давайте рассмотрим пример, где выполняются следующие шаги:
- Создайте новый экземпляр класса
MemoryStreamProvider
. Он будет использоваться в качестве выходного потока для процесса преобразования. - Инициализируйте HTML-документ с помощью класса HTMLDocument.
- Используйте конструктор
ImageSaveOptions(), чтобы настроить параметры сохранения изображения, такие как
ImageFormat
– JPEG (в данном случае). - Вызовите метод ConvertHTML(document, options, provider), чтобы преобразовать объект HTMLDocument в изображение с использованием параметров сохранения и MemoryStreamProvider.
- Используйте цикл
foreach
для перебора каждого объекта MemoryStream в свойстве Streams объекта streamProvider. Каждый MemoryStream представляет собой страницу преобразованного HTML-документа. - Вызовите метод
memory.Seek()
в потоке памяти, чтобы установить позицию в начало. Это делается для того, чтобы на следующем шаге все содержимое потока было скопировано в файловый поток. - Используйте метод
File.Create()
внутри цикла, чтобы создать выходной файл для текущей страницы. - Используйте метод
memory.CopyTo()
, чтобы скопировать содержимое потока памяти в объект FileStream, представляющий выходной файл. - После обработки каждой страницы счетчик страниц увеличивается, чтобы отслеживать номер страницы для имен выходных файлов.
1// Create an instance of MemoryStreamProvider
2using (var streamProvider = new MemoryStreamProvider())
3{
4 // Prepare HTML code
5 var code = @"<style>
6 div { page-break-after: always; }
7 </style>
8 <div style='border: 1px solid red; width: 300px'>First Page</div>
9 <div style='border: 1px solid red; width: 300px'>Second Page</div>
10 <div style='border: 1px solid red; width: 300px'>Third Page</div>
11 ";
12 // Initialize an HTML document from the HTML code
13 using var document = new HTMLDocument(code, ".");
14 {
15 // Convert HTML to Image by using the MemoryStreamProvider
16 Converter.ConvertHTML(document, new ImageSaveOptions(ImageFormat.Jpeg), streamProvider);
17
18 // Get access to the memory stream that contains the result data
19 var page = 1;
20 foreach (var memory in streamProvider.Streams)
21 {
22 memory.Seek(0, SeekOrigin.Begin);
23
24 // Flush the result data to the output file
25 using (FileStream fs = File.Create(Path.Combine(OutputDir, "page_" + page + ".jpg")))
26 {
27 memory.CopyTo(fs);
28 }
29 page++;
30 }
31 }
32}
Aspose.HTML предлагает бесплатные онлайн Конвертеры для преобразования файлов HTML, XHTML, MHTML, EPUB, XML и Markdown в различные популярные форматы. Вы можете легко конвертировать HTML в PDF, HTML в JPG, SVG в PDF, MHTML в PDF или MD to HTML. Просто выберите файл, выберите формат для преобразования, и готово! Это быстро и совершенно бесплатно!