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 :
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.
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 }
Initialiser une instance de la classe ZipArchiveMessageHandler et lui définir une propriété Filter.
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 :
Le ZipArchiveMessageHandler personnalisé doit hériter de la classe MessageHandler de base. Il possède deux variables : l’archive et la représentation sous forme de chaîne de caractères du chemin vers l’archive. L’héritage de IDisposable est nécessaire pour fournir un mécanisme de libération déterministe des ressources non gérées.
Le gestionnaire de message possède le concept de filtrage. Dans ce cas, un filtre de protocole (schéma) est ajouté, ce gestionnaire de message ne fonctionnera qu’avec le protocole
"zip"
.Filtering messages by resource protocol is implemented using the ProtocolMessageFilter class. The ProtocolMessageFilter() constructor initializes a new instance of the ProtocolMessageFilter class. It takes the
"zip"
protocols as a parameter.La méthode Invoke() implémente le comportement du gestionnaire de message. Elle est appelée pour chaque gestionnaire dans le pipeline et prend un
contexte
comme paramètre. La méthode GetFile() définit la logique de la méthode Invoke(). Elle implémente la chaîne de tâches, après laquelle le gestionnaire Next(contexte
) suivant est appelé.The GetFile() method realizes a search for data as a byte array in a zip archive based on Request and forms Response.
le
contexte
fournit des informations contextuelles pour les services réseau, l’entité de l’opération lui est transmise et le résultat de l’opération est renvoyé. Dans Aspose.HTML, lecontexte
est réalisé par l’interface INetworkOperationContext qui possède deux propriétés (paramètres) – Request et Response.
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.