Convertir le HTML d'une archive ZIP en PDF – 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 PDF.
Il y a de nombreuses raisons pour lesquelles vous avez besoin de convertir HTML d’une archive ZIP au format PDF. Le format PDF présente de nombreux avantages que d’autres fichiers n’ont pas. Par exemple, de nombreux programmes et applications prennent en charge les documents PDF, la plupart des navigateurs web tels que Chrome et Firefox peuvent afficher un PDF. Les fichiers PDF sont optimisés pour l’impression ; ils sont idéaux pour créer des copies physiques de vos documents. Le format PDF prend en charge de nombreux algorithmes de compression. Vous pouvez configurer les paramètres de sécurité de votre fichier PDF, etc.
Créer un gestionnaire de messages personnalisé
Aspose.HTML for .NET offre une fonctionnalité permettant de créer des gestionnaires de messages personnalisés. Concevons un gestionnaire personnalisé que nous pourrons 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. L’héritage de IDisposable est nécessaire pour fournir un mécanisme de libération déterministe des ressources non gérées.
1using Aspose.Html.Net;
2...
3
4 class ZipArchiveMessageHandler : MessageHandler, IDisposable
5 {
6 }
Vous avez donc défini votre propre classe ZipArchiveMessageHandler, il vous faut maintenant effectuer quelques opérations à l’intérieur de celle-ci.
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 cet extrait de code :
Tout d’abord, 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 d’accès à l’archive.
Le gestionnaire de message possède le concept de filtrage. Dans ce cas, un filtre de protocole (schéma) est ajouté ; ce gestionnaire de messages ne fonctionnera qu’avec le protocole
"zip"
. En d’autres termes, si la ressource a un protocole"zip"
, elle sera traitée par ZipArchiveMessageHandler.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(context
) suivant est appelé. La méthode GetFile() réalise une recherche de données sous la forme d’un tableau d’octets dans une archive zip, sur la base d’une requête et de formulaires de réponse.context
provides contextual information for network services, the entity of the operation is passed through it, and the result of the operation is returned. In Aspose.HTML, thecontext
is realized by INetworkOperationContext interface that has two properties (parameters) – Request and Response. Request gets or sets the request message, Response gets or sets the response message. The Request contains information for a web request, for example, a URL – a path to a resource, headers, etc. The Response contains the response that the endpoint (Internet) returned.
Vous pouvez télécharger les exemples complets et les fichiers de données sur GitHub.
Ajouter ZipArchiveMessageHandler dans le pipeline
Vous devez maintenant ajouter ZipArchiveMessageHandler dans le pipeline. Utilisez la méthode Add() qui prend un objet zip
en paramètre et ajoute ZipArchiveMessageHandler à la fin de la collection des gestionnaires de messages.
La propriété INetworkService.MessageHandlers permet d’obtenir une liste d’instances de MessageHandler à invoquer lors de l’exécution d’une RequestMessage.
1// Convert HTML from a ZIP archive to PDF 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-pdf.pdf");
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 the PDF Device
27using PdfDevice device = new PdfDevice(savePath);
28
29// Render ZIP to PDF
30document.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.
Veuillez lire l’article
Fine-Tuning Converters pour en savoir plus sur la conversion de HTML en PDF à l’aide de la méthode
Renderto(device
).
Aspose.HTML propose un Convertisseur ZIP en PDF gratuit en ligne qui vous permet de convertir rapidement, facilement et clairement le code HTML d’une archive ZIP en PDF. Téléchargez, convertissez les fichiers et obtenez les résultats en quelques secondes. Aucun logiciel supplémentaire n’est nécessaire. Essayez notre convertisseur robuste gratuitement dès maintenant !