HTML aus ZIP-Archiv in JPG konvertieren – C#-Beispiel

In diesem Artikel erstellen wir einen benutzerdefinierten Message Handler, um eine bestimmte Aufgabe zu erfüllen – die Konvertierung von HTML aus einem ZIP-Archiv in JPG.

Es gibt viele Gründe, warum Sie HTML aus einem ZIP-Archiv in das Format JPG konvertieren müssen. Wenn Sie z.B. ein HTML(XHTML)-Dokument, das verlinkte Ressourcen enthält, in das JPG-Format konvertieren wollen, sollten Sie alle diese Ressourcen zusammen mit dem Dokument in ein einziges ZIP-Archiv packen und es in das JPG-Format konvertieren. Aspose.HTML for .NET bietet Funktionen zur Erstellung benutzerdefinierter Nachrichten-Handler für die Arbeit mit ZIP-Archiven.

Erstellen eines benutzerdefinierten Nachrichten-Handlers

Aspose.HTML for .NET bietet Funktionen für die Erstellung eines benutzerdefinierten Nachrichten-Handlers. Entwerfen wir den benutzerdefinierten Handler, den wir für die Arbeit mit ZIP-Archiven verwenden können. Führen Sie die folgenden Schritte aus:

  1. Verwenden Sie den erforderlichen Namespace, nämlich Aspose.Html.Net. Dieser Namespace wird durch Klassen und Schnittstellen dargestellt, die für eine einfache Netzwerkverarbeitung verantwortlich sind.

  2. Um einen benutzerdefinierten Message Handler zu erstellen, müssen Sie Ihre eigene Klasse definieren, die von der Klasse MessageHandler abgeleitet wird. Die Klasse MessageHandler stellt einen Basistyp für Message-Handler dar.

1using Aspose.Html.Net;
2...
3
4	class ZipArchiveMessageHandler : MessageHandler
5	{
6	}
  1. Initialisieren Sie eine Instanz der Klasse ZipArchiveMessageHandler und definieren Sie eine Filter-Eigenschaft für sie.

  2. Überschreiben Sie die Methode Invoke() der Klasse MessageHandler, um das Verhalten des benutzerdefinierten Nachrichten-Handlers zu implementieren.

 1// Implement ZipArchiveMessageHandler in C#
 2
 3// This message handler prints a message about start and finish processing request
 4class ZipArchiveMessageHandler : MessageHandler, IDisposable
 5{
 6    private string filePath;
 7    private Archive archive;
 8
 9    // Initialize an instance of the ZipArchiveMessageHandler class
10    public ZipArchiveMessageHandler(string path)
11    {
12        this.filePath = path;
13        Filters.Add(new ProtocolMessageFilter("zip"));
14    }
15
16    // Override the Invoke() method
17    public override void Invoke(INetworkOperationContext context)
18    {
19        // Call the GetFile() method that defines the logic in the Invoke() method
20        byte[] buff = GetFile(context.Request.RequestUri.Pathname.TrimStart('/'));
21        if (buff != null)
22        {
23            // Checking: if a resource is found in the archive, then return it as a Response
24            context.Response = new ResponseMessage(HttpStatusCode.OK)
25            {
26                Content = new ByteArrayContent(buff)
27            };
28            context.Response.Headers.ContentType.MediaType = MimeType.FromFileExtension(context.Request.RequestUri.Pathname);
29        }
30        else
31        {
32            context.Response = new ResponseMessage(HttpStatusCode.NotFound);
33        }
34
35        // Call the next message handler
36        Next(context);
37    }
38
39
40    byte[] GetFile(string path)
41    {
42        path = path.Replace(@"\", @"/");
43        ArchiveEntry result = GetArchive().Entries.FirstOrDefault(x => path == x.Name);
44        if (result != null)
45        {
46            using (Stream fs = result.Open())
47            using (MemoryStream ms = new MemoryStream())
48            {
49                fs.CopyTo(ms);
50                return ms.ToArray();
51            }
52        }
53        return null;
54    }
55
56    Archive GetArchive()
57    {
58        return archive ??= new Archive(filePath);
59    }
60
61    public void Dispose()
62    {
63        archive?.Dispose();
64    }
65}

Betrachten wir das Codeschnipsel genauer:

ZipArchiveMessageHandler zur Pipeline hinzufügen

Das Schlüsselkonzept der Nachrichten-Handler ist ihre Verkettung, und Sie müssen nun ZipArchiveMessageHandler in die Pipeline aufnehmen. Der Konstruktor Configuration() erstellt eine Instanz der Klasse Configuration. Nachdem die Konfiguration erstellt wurde, werden die Methoden GetService<INetworkService>() und MessageHandlers.Add() aufgerufen. Die Add()-Methode nimmt ein zip-Objekt als Parameter entgegen und fügt ZipArchiveMessageHandler an das Ende der Sammlung der Message-Handler an.

 1// Convert HTML from a ZIP archive to JPG using C#
 2
 3// Add this line before you try to use the 'IBM437' encoding
 4System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
 5
 6// Prepare path to a source zip file
 7string documentPath = Path.Combine(DataDir, "test.zip");
 8
 9// Prepare path for converted file saving
10string savePath = Path.Combine(OutputDir, "zip-to-jpg.jpg");
11
12// Create an instance of ZipArchiveMessageHandler
13using ZipArchiveMessageHandler zip = new ZipArchiveMessageHandler(documentPath);
14
15// Create an instance of the Configuration class
16using Configuration configuration = new Configuration();
17
18// Add ZipArchiveMessageHandler to the chain of existing message handlers
19configuration
20    .GetService<INetworkService>()
21    .MessageHandlers.Add(zip);
22
23// Initialize an HTML document with specified configuration
24using HTMLDocument document = new HTMLDocument("zip:///test.html", configuration);
25
26// Create an instance of Rendering Options
27ImageRenderingOptions options = new ImageRenderingOptions()
28{
29    Format = ImageFormat.Jpeg
30};
31
32// Create an instance of Image Device
33using ImageDevice device = new ImageDevice(options, savePath);
34
35// Render ZIP to JPG
36document.RenderTo(device);

Im Beispiel enthält das ZIP-Archiv (test.zip) das HTML-Dokument (test.html), in dem alle zugehörigen Ressourcen Pfade relativ zum HTML-Dokument haben.

Hinweis: Der HTMLDocument(address, configuration) Konstruktor nimmt den absoluten Pfad zum ZIP-Archiv. Alle zugehörigen Ressourcen haben jedoch relative Pfade im HTML-Dokument und im Code des Beispiels.

Weitere Informationen zur Konvertierung von HTML in JPG mit der Methode RenderTo(device) finden Sie im Artikel Feinabstimmung von Konvertern.

Sie können die vollständigen C#-Beispiele und Datendateien von GitHub herunterladen.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.