Ausgabeströme – C# MemoryStream

Ausgabeströme – Output Streams – C#

Bei Konvertierungsvorgängen speichern wir das Rendering-Ergebnis normalerweise in der Datei. In einigen Fällen kann es jedoch erforderlich sein, das Ergebnis im Speicher zu speichern oder es an einen entfernten Speicherort zu senden. Sie können dies einfach tun, indem Sie die spezialisierte Schnittstelle ICreateStreamProvider implementieren und sie als Eingabeparameter für den Konverter verwenden. Diese Schnittstelle stellt einen Callback dar, der verwendet wird, wenn ein neuer Ausgabestrom benötigt wird.

Hinweis: Sie kann einige Male aufgerufen werden, wenn mehrere Ausgabeströme erforderlich sind. Das Szenario, in dem dieser Fall möglich ist, ist das Rendern von HTML in den Satz von Bilddateien.

MemoryStreamProvider-Klasse

Die Aspose.HTML C# Bibliothek ermöglicht die Realisierung der Klasse MemoryStreamProvider als eine eigene Implementierung der ICreateStreamProvider Schnittstelle. Die Klasse MemoryStreamProvider stellt C# MemoryStream-Objekte als Ausgabestreams zum Schreiben von Daten zur Verfügung, die als Stream im Speicher abgelegt werden können.

Die Verwendung eines C# MemoryStream hilft, Latenzen zu vermeiden, die üblicherweise mit dem Lesen oder Schreiben von Dateien auf einer Festplatte verbunden sind. Da der Inhalt eines MemoryStreams im Speicher verbleibt, wird außerdem kein physischer Speicherplatz auf der Festplatte beansprucht.

 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}

Schauen wir uns die Hauptbestandteile der Klasse MemoryStreamProvider an:

  1. Eigenschaft Streams. Eine Liste von MemoryStream-Objekten wird während des Renderings des Dokuments erstellt. Diese Objekte speichern die Daten, die in die Ausgabeströme geschrieben werden.
  2. Implementierung der GetStream()-Methoden. Die GetStream()-Methoden erstellen neue MemoryStream-Objekte, fügen sie der Streams-Liste hinzu und geben sie als Output-Streams zurück.
  3. Implementierung der Methode ReleaseStream(). Die ReleaseStream()-Methode gibt ein mit Daten gefülltes Stream-Objekt frei. In dieser Implementierung ist die Methode leer. Dennoch kann sie angepasst werden, um Operationen wie das Flushen des Streams auf eine Festplatte oder die Freigabe aller mit dem Stream verbundenen Ressourcen durchzuführen.
  4. Implementierung der Methode Dispose(). Diese Methode wird aufgerufen, um alle Ressourcen freizugeben, die von der MemoryStreamProvider Klasse gehalten werden. Diese Implementierung entsorgt alle MemoryStream-Objekte in der Streams-Liste mit Hilfe einer “Foreach”-Schleife.

C# MemoryStream in Datei

Der folgende C#-Code zeigt, wie die Klasse MemoryStreamProvider und die Aspose.HTML for .NET-Bibliothek verwendet werden, um ein mehrseitiges HTML-Dokument in JPG zu konvertieren und das Bild in einer Datei zu speichern. Schauen wir uns das Beispiel an, in dem die folgenden Schritte ausgeführt werden:

  1. Erstellen Sie eine neue Instanz der Klasse MemoryStreamProvider. Sie wird als Ausgabestrom für den Konvertierungsprozess verwendet.
  2. Initialisieren Sie ein HTML-Dokument mit Hilfe der HTMLDocument Klasse.
  3. Verwenden Sie den ImageSaveOptions()-Konstruktor, um die Bildspeicheroptionen zu konfigurieren, wie z.B. das ImageFormat – in diesem Fall JPEG.
  4. Rufen Sie die Methode ConvertHTML(document, options, provider) auf, um das HTMLDocument-Objekt unter Verwendung von Speicheroptionen und MemoryStreamProvider in ein Bild zu konvertieren.
  5. Verwenden Sie die foreach-Schleife, um über jedes MemoryStream-Objekt in der Streams-Eigenschaft des streamProvider-Objekts zu iterieren. Jeder MemoryStream stellt eine Seite des konvertierten HTML-Dokuments dar.
  6. Rufen Sie die Methode memory.Seek() für den MemoryStream auf, um die Position an den Anfang zu setzen. Dadurch wird sichergestellt, dass der gesamte Inhalt des Streams in die Ausgabedatei kopiert wird.
  7. Verwenden Sie die Methode File.Create() innerhalb der Schleife, um eine Ausgabedatei für die aktuelle Seite zu erstellen.
  8. Verwenden Sie die Methode memory.CopyTo(), um den Inhalt des Speicherstroms in das FileStream-Objekt zu kopieren, das die Ausgabedatei darstellt.
  9. Nach der Verarbeitung jeder Seite wird der Seitenzähler inkrementiert, um die Seitennummer für die Ausgabedateinamen festzuhalten.
 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 bietet kostenlose Online- Konverter zur Konvertierung von HTML-, XHTML-, MHTML-, EPUB-, XML- und Markdown-Dateien in eine Vielzahl von gängigen Formaten. Sie können ganz einfach HTML in PDF, HTML in JPG, SVG in PDF, MHTML in PDF oder MD in HTML konvertieren. Wählen Sie einfach eine Datei aus, wählen Sie das zu konvertierende Format und fertig. Es geht schnell und ist kostenlos!

Text “Kostenlose Online-Konvertierungsprogramme”

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.