Flujos de salida – C# MemoryStream
Flujos de salida – Output Streams – C#
En las operaciones de conversión, normalmente guardamos el resultado de la renderización en el archivo. Sin embargo, en algunos casos, es posible que necesite almacenar el resultado en la memoria o enviarlo a un almacenamiento remoto. Puede hacerlo fácilmente implementando la interfaz especializada ICreateStreamProvider y usándola como parámetro de entrada para el convertidor. Esta interfaz representa una devolución de llamada que se utiliza cuando se requiere un nuevo flujo de salida.
Nota: Es posible que se invoque varias veces cuando se requieren varios flujos de salida. El escenario en el que este caso es posible es renderizar HTML en el conjunto de archivos de imagen.
Clase MemoryStreamProvider
La biblioteca Aspose.HTML C# permite realizar la clase MemoryStreamProvider
como una implementación personalizada de la interfaz ICreateStreamProvider. La clase MemoryStreamProvider
proporciona objetos C# MemoryStream como flujos de salida para escribir datos, que se pueden almacenar en la memoria como un flujo.
El uso de C# MemoryStream ayuda a evitar las latencias comúnmente asociadas con la lectura o escritura de archivos en un disco. Además, debido a que el contenido de un MemoryStream permanece en la memoria, no se utiliza el espacio físico del disco. El código C# siguiente es un ejemplo de la aplicación que utiliza ICreateStreamProvider para almacenar el resultado de la representación en la memoria y descargarlo en el archivo más tarde:
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}
Veamos las partes principales de la clase MemoryStreamProvider
:
- Propiedad
Streams
. Se crea una lista de objetos MemoryStream durante la representación del documento. Estos objetos almacenarán los datos que se escriben en los flujos de salida. - Implementación de los métodos
GetStream()
. Los métodos GetStream() crean nuevos objetos MemoryStream, los agregan a la lista Streams y los devuelven como flujos de salida. - Implementación del método
ReleaseStream()
. El método ReleaseStream() libera un objeto Stream lleno de datos. En esta implementación, el método está vacío. Aún así, puede personalizarlo para realizar operaciones como vaciar la transmisión en un disco duro o liberar cualquier recurso asociado con la transmisión. - Implementación del método
Dispose()
. Se llama a este método para liberar cualquier recurso retenido por la claseMemoryStreamProvider
. Esta implementación elimina todos los objetos MemoryStream en la lista Streams usando un bucleforeach
.
C# MemoryStream a archivo
El siguiente código C# demuestra cómo utilizar la clase MemoryStreamProvider
y la biblioteca Aspose.HTML for .NET para convertir un documento HTML de varias páginas a JPG y guardar la imagen en un archivo. Veamos el ejemplo donde se realizan los siguientes pasos:
- Cree una nueva instancia de la clase
MemoryStreamProvider
. Se utilizará como flujo de salida para el proceso de conversión. - Inicialice un documento HTML utilizando la clase HTMLDocument.
- Utilice el constructor
ImageSaveOptions() para configurar las opciones de guardado de la imagen, como
ImageFormat
– JPEG (en este caso). - Llame al método ConvertHTML(document, options, provider) para convertir el objeto HTMLDocument en una imagen usando las opciones de guardar y MemoryStreamProvider.
- Utilice el bucle
foreach
para iterar sobre cada objetoMemoryStream
en la propiedadStreams
del objetostreamProvider
. Cada MemoryStream representa una página del documento HTML convertido. - Llame al método
memory.Seek()
en el flujo de memoria para establecer la posición al principio. Esto garantiza que todo el contenido de la transmisión se copiará en el archivo de salida. - Utilice el método
File.Create()
dentro del bucle para crear un archivo de salida para la página actual. - Utilice el método
memory.CopyTo()
para copiar el contenido del flujo de memoria al objeto FileStream, que representa el archivo de salida. - Después de procesar cada página, el contador de páginas se incrementa para realizar un seguimiento del número de página de los nombres de los archivos de salida.
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 ofrece Convertidores en línea gratuitos para convertir archivos HTML, XHTML, MHTML, EPUB, XML y Markdown a una variedad de formatos populares. Puede convertir fácilmente HTML a PDF, HTML a JPG, SVG a PDF, MHTML a PDF o MD a HTML. Simplemente seleccione un archivo, elija el formato a convertir y listo. ¡Es rápido y completamente gratis!