Convertir le HTML d'une archive ZIP en JPG – Exemple C#

Dans cet article, nous créons un gestionnaire de messages personnalisé pour effectuer une tâche spécifique – convertir le code HTML d’une archive ZIP en JPG.

Il existe de nombreuses raisons pour lesquelles vous avez besoin de convertir HTML d’une archive ZIP au format JPG. Par exemple, si vous souhaitez convertir un document HTML(XHTML) contenant des ressources liées au format JPG, vous devez regrouper toutes ces ressources avec le document dans une seule archive ZIP et la convertir au format JPG. Aspose.HTML for .NET propose une fonctionnalité permettant de créer des gestionnaires de messages personnalisés pour travailler avec des archives ZIP.

Créer un gestionnaire de messages personnalisé

Aspose.HTML for .NET offre la possibilité de créer un gestionnaire de messages personnalisé. Concevons le gestionnaire personnalisé que nous pouvons utiliser pour travailler avec des archives ZIP. Procédez comme suit :

  1. Utilisez l’espace de nommage nécessaire, à savoir Aspose.Html.Net. Cet espace de noms est présenté par des classes et des interfaces qui sont chargées de faciliter le traitement des réseaux.

  2. Pour créer un gestionnaire de messages personnalisé, vous devez définir votre propre classe qui sera dérivée de la classe MessageHandler. La classe MessageHandler représente un type de base pour les gestionnaires de messages.

1using Aspose.Html.Net;
2...
3
4	class ZipArchiveMessageHandler : MessageHandler
5	{
6	}
  1. Initialiser une instance de la classe ZipArchiveMessageHandler et lui définir une propriété Filter.

  2. Surchargez la méthode Invoke() de la classe MessageHandler pour mettre en œuvre le comportement du gestionnaire de messages personnalisé.

 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}

Examinons de plus près l’extrait de code :

Ajouter ZipArchiveMessageHandler au pipeline

Le concept clé du fonctionnement des gestionnaires de messages est leur enchaînement, et vous devez maintenant ajouter ZipArchiveMessageHandler dans le pipeline. Le constructeur Configuration() crée une instance de la classe Configuration. Une fois la configuration créée, les méthodes GetService<INetworkService>() et MessageHandlers.Add() sont invoquées. La méthode Add() prend en paramètre un objet zip et ajoute ZipArchiveMessageHandler à la fin de la collection des gestionnaires de messages.

 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);

Dans l’exemple, l’archive ZIP (test.zip) contient le document HTML (test.html) dans lequel toutes les ressources liées ont des chemins relatifs au document HTML.

Note: Le constructeur HTMLDocument(address, configuration) prend le chemin absolu vers l’archive ZIP. Mais toutes les ressources associées ont des chemins relatifs dans le document HTML et dans le code de l’exemple.

Pour plus d’informations sur la façon de convertir HTML en JPG en utilisant la méthode Renderto(device), veuillez lire l’article Fine-Tuning Converters.

Vous pouvez télécharger les exemples C# complets et les fichiers de données sur GitHub.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.