Enregistrer un document HTML – Exemples C#
Après avoir téléchargé un fichier existant ou créé un document HTML à partir de zéro, vous pouvez enregistrer les modifications à l’aide de l’une des méthodes HTMLDocument.Save(). Il existe des méthodes surchargées pour enregistrer un document dans un fichier, une URL ou des flux.
- L’API fournit l’espace de noms Aspose.Html.Saving avec les classes SaveOptions et ResourceHandlingOptions qui vous permettent de définir des options pour les opérations d’enregistrement.
- L’API fournit l’espace de noms Aspose.Html.Saving.ResourceHandlers qui contient les classes ResourceHandler et FileSystemResourceHandler responsables de la gestion des ressources.
Veuillez noter que nous avons deux concepts différents pour la création des fichiers de sortie :
- La première conception est basée sur la production de fichiers HTML en sortie. La classe SaveOptions, classe de base de cette approche, permet de gérer le processus d’enregistrement des ressources connexes telles que les scripts, les styles, les images, etc. La classe ResourceHandler est responsable de la gestion des ressources. Elle est développée pour enregistrer le contenu HTML et les ressources dans des flux et fournit des méthodes qui vous permettent de contrôler ce qui sera fait avec la ressource.
- Le second concept pourrait être utilisé pour créer une représentation visuelle du HTML en tant que résultat. La classe de base pour cette conception est RenderingOptions ; elle possède des méthodes spécialisées pour spécifier la taille de la page, les marges de la page, la résolution, les styles de l’utilisateur, etc.
Cet article ne décrit que l’utilisation des classes SaveOptions
et ResourceHandler
. Pour en savoir plus sur le mécanisme de rendu, veuillez consulter les articles
Renderers et
Rendering Options.
Options de sauvegarde et options de gestion des ressources
La classe
SaveOptions est une classe de base qui vous permet de spécifier des options supplémentaires pour les opérations d’enregistrement et vous aide à gérer les ressources liées. La propriété ResourceHandlingOptions
de la classe SaveOptions est utilisée pour la configuration de la gestion des ressources. La classe
ResourceHandlingOptions représente les options de gestion des ressources et la liste des options disponibles est présentée dans le tableau suivant :
Option | Description |
---|---|
UrlRestriction | Applies restrictions to the host or folders where resources are located. |
MaxHandlingDepth | If you need to save not the only specified HTML document, but also the linked HTML pages, this option gives you the ability to control the depth of the linked pages that should be saved. |
JavaScript | This option specifies how do we need to treat the JavaScript files: it could be saved as a separated linked file, embed into HTML file or even be ignored. |
Default | This option specifies behavior for other than JavaScript files. Gets or sets an enum, which represents the default way of resource handling. Currently, Save, Ignore, and Embed values are supported. The default value is Save. |
Enregistrer HTML
Une fois que vous avez terminé vos modifications en HTML, vous pouvez enregistrer le document. Vous pouvez le faire en utilisant l’une des méthodes Save() de la classe HTMLDocument. L’exemple suivant est la manière la plus simple de sauvegarder un fichier HTML :
1// Save HTML to a file using C#
2
3// Prepare an output path for a document saving
4string documentPath = Path.Combine(OutputDir, "save-to-file.html");
5
6// Initialize an empty HTML document
7using (HTMLDocument document = new HTMLDocument())
8{
9 // Create a text element and add it to the document
10 Text text = document.CreateTextNode("Hello, World!");
11 document.Body.AppendChild(text);
12
13 // Save the HTML document to the file on a disk
14 document.Save(documentPath);
15}
Dans l’exemple ci-dessus, nous utilisons le constructeur HTMLDocument() pour initialiser un document HTML vide. La méthode
CreateTextNode(data
) de la classe HTMLDocument crée un nœud de texte à partir de la chaîne spécifiée. La méthode
Save(path
) enregistre le document dans un fichier local spécifié par path.
L’exemple ci-dessus est assez simple. Cependant, dans les applications réelles, vous avez souvent besoin d’un contrôle supplémentaire sur le processus d’enregistrement. Les sections suivantes décrivent comment utiliser les options de gestion des ressources ou enregistrer votre document dans les différents formats.
Enregistrer HTML dans un fichier
L’extrait de code suivant montre comment utiliser la propriété ResourceHandlingOptions de la classe SaveOptions pour gérer les liens vers vos fichiers de documents.
1// Save HTML with a linked resources using C#
2
3// Prepare an output path for an HTML document
4string documentPath = Path.Combine(OutputDir, "save-with-linked-file.html");
5
6// Prepare a simple HTML file with a linked document
7File.WriteAllText(documentPath, "<p>Hello, World!</p>" +
8 "<a href='linked.html'>linked file</a>");
9
10// Prepare a simple linked HTML file
11File.WriteAllText(Path.Combine(OutputDir, "linked.html"), "<p>Hello, linked file!</p>");
12
13// Load the "save-with-linked-file.html" into memory
14using (HTMLDocument document = new HTMLDocument(documentPath))
15{
16 // Create a save options instance
17 HTMLSaveOptions options = new HTMLSaveOptions();
18
19 // The following line with value '0' cuts off all other linked HTML-files while saving this instance
20 // If you remove this line or change value to the '1', the 'linked.html' file will be saved as well to the output folder
21 options.ResourceHandlingOptions.MaxHandlingDepth = 1;
22
23 // Save the document with the save options
24 document.Save(Path.Combine(OutputDir, "save-with-linked-file_out.html"), options);
25}
Enregistrer HTML dans un système de fichiers local
Le document HTML peut contenir différentes ressources telles que des feuilles de style CSS, des images et des fichiers externes. Aspose.HTML for .NET fournit un moyen d’enregistrer le document HTML avec tous les fichiers liés – la classe ResourceHandler est développée pour enregistrer le contenu HTML et les ressources dans des flux. Cette classe est responsable de la gestion des ressources et fournit des méthodes qui vous permettent de contrôler ce qui est fait avec chaque ressource.
Prenons un exemple d’enregistrement de HTML avec ressources dans un fichier local spécifié par l’utilisateur. Le document source
with-resources.html et son fichier image lié se trouvent dans le même répertoire. Le constructeur
FileSystemResourceHandler(customOutDir
) prend un chemin indiquant où le document avec ressources sera sauvegardé et crée un objet FileSystemResourceHandler
. La méthode
Save(resourceHandler
) prend cet objet et enregistre le HTML dans le stockage de sortie.
1// Save HTML with resources to local storage using C#
2
3// Prepare a path to a source HTML file
4string inputPath = Path.Combine(DataDir, "with-resources.html");
5
6// Prepare a full path to an output directory
7string customOutDir = Path.Combine(Directory.GetCurrentDirectory(), "./../../../../tests-out/saving/");
8
9// Load the HTML document from a file
10using (HTMLDocument doc = new HTMLDocument(inputPath))
11{
12 // Save HTML with resources
13 doc.Save(new FileSystemResourceHandler(customOutDir));
14}
Enregistrer HTML dans une archive Zip
Vous pouvez mettre en œuvre le
ResourceHandler en créant la classe ZipResourceHandler. Elle vous permet de créer une archive structurée et compressée contenant des documents HTML et des ressources associées, ce qui convient à des scénarios tels que l’archivage et l’optimisation du stockage. La méthode
HandleResource() de la classe ZipResourceHandler
permet de personnaliser la manière dont les ressources individuelles sont traitées et stockées dans une archive Zip.
Dans l’exemple suivant, la classe ZipResourceHandler
est utilisée pour enregistrer le document
with-resources.html avec ses ressources liées dans une archive Zip :
1// Save an HTML document with all linked resources into a ZIP archive using C#
2
3// Prepare a path to a source HTML file
4string inputPath = Path.Combine(DataDir, "with-resources.html");
5
6string dir = Directory.GetCurrentDirectory();
7
8// Prepare a full path to an output zip storage
9string customArchivePath = Path.Combine(dir, "./../../../../tests-out/saving/archive.zip");
10
11// Load the HTML document
12using (HTMLDocument doc = new HTMLDocument(inputPath))
13{
14 // Initialize an instance of the ZipResourceHandler class
15 using (ZipResourceHandler resourceHandler = new ZipResourceHandler(customArchivePath))
16 {
17 // Save HTML with resources to a Zip archive
18 doc.Save(resourceHandler);
19 }
20}
La classe ResourceHandler
est destinée à être implémentée par le client. La classe ZipResourceHandler
étend la classe de base ResourceHandler
et fournit un moyen pratique de gérer l’ensemble du processus de manipulation et de stockage des ressources liées à un document HTML dans une archive Zip :
1// Custom resource handler to save HTML with resources into a ZIP archive
2
3internal class ZipResourceHandler : ResourceHandler, IDisposable
4{
5 private FileStream zipStream;
6 private ZipArchive archive;
7 private int streamsCounter;
8 private bool initialized;
9
10 public ZipResourceHandler(string name)
11 {
12 DisposeArchive();
13 zipStream = new FileStream(name, FileMode.Create);
14 archive = new ZipArchive(zipStream, ZipArchiveMode.Update);
15 initialized = false;
16 }
17
18 public override void HandleResource(Resource resource, ResourceHandlingContext context)
19 {
20 string zipUri = (streamsCounter++ == 0
21 ? Path.GetFileName(resource.OriginalUrl.Href)
22 : Path.Combine(Path.GetFileName(Path.GetDirectoryName(resource.OriginalUrl.Href)),
23 Path.GetFileName(resource.OriginalUrl.Href)));
24 string samplePrefix = String.Empty;
25 if (initialized)
26 samplePrefix = "my_";
27 else
28 initialized = true;
29
30 using (Stream newStream = archive.CreateEntry(samplePrefix + zipUri).Open())
31 {
32 resource.WithOutputUrl(new Url("file:///" + samplePrefix + zipUri)).Save(newStream, context);
33 }
34 }
35
36 private void DisposeArchive()
37 {
38 if (archive != null)
39 {
40 archive.Dispose();
41 archive = null;
42 }
43
44 if (zipStream != null)
45 {
46 zipStream.Dispose();
47 zipStream = null;
48 }
49
50 streamsCounter = 0;
51 }
52
53 public void Dispose()
54 {
55 DisposeArchive();
56 }
57}
Enregistrer HTML dans des flux de mémoire
L’implémentation de la classe
ResourceHandler dans la classe MemoryResourceHandler permet de sauvegarder du HTML dans des flux de mémoire. Le code suivant montre comment utiliser la classe MemoryResourceHandler
pour stocker un document HTML en mémoire, en collectant et en imprimant des informations sur les ressources manipulées.
- Initialise un document HTML en utilisant le chemin d’accès au fichier HTML spécifié.
- Créer une instance de la classe
MemoryResourceHandler
. Cette classe est conçue pour capturer et stocker les ressources dans les flux de mémoire pendant le processus de traitement des ressources. - Appeler la méthode
Save()
du document HTML et lui passer l’instanceMemoryResourceHandler
comme argument. Cela permet d’associer la logique de gestion des ressources duMemoryResourceHandler
au processus d’enregistrement du document HTML. - Utilisez la méthode
PrintInfo()
duMemoryResourceHandler
pour imprimer des informations sur les ressources manipulées.
1// Save HTML with resources to memory streams using C#
2
3// Prepare a path to a source HTML file
4string inputPath = Path.Combine(DataDir, "with-resources.html");
5
6// Load the HTML document
7using (HTMLDocument doc = new HTMLDocument(inputPath))
8{
9 // Create an instance of the MemoryResourceHandler class and save HTML to memory
10 MemoryResourceHandler resourceHandler = new MemoryResourceHandler();
11 doc.Save(resourceHandler);
12 resourceHandler.PrintInfo();
13}
Après l’exécution de l’exemple, le message relatif à la mémoire est imprimé :
uri:memory:///with-resources.html, length:256
uri:memory:///photo1.png, length:57438
La classe
ResourceHandler est une classe de base qui prend en charge la création et la gestion des flux de sortie. La classe MemoryResourceHandler
vous permet de capturer et de stocker des ressources dans des flux en mémoire, ce qui constitue un moyen dynamique et flexible de gérer des ressources sans les enregistrer physiquement dans le système de fichiers. L’extrait de code suivant montre la réalisation du ResourceHandler
dans la classe MemoryResourceHandler :
1// In-memory resource handler that captures and stores HTML resources as streams
2
3internal class MemoryResourceHandler : ResourceHandler
4{
5 public List<Tuple<Stream, Resource>> Streams;
6
7 public MemoryResourceHandler()
8 {
9 Streams = new List<Tuple<Stream, Resource>>();
10 }
11
12 public override void HandleResource(Resource resource, ResourceHandlingContext context)
13 {
14 MemoryStream outputStream = new MemoryStream();
15 Streams.Add(Tuple.Create<Stream, Resource>(outputStream, resource));
16 resource
17 .WithOutputUrl(new Url(Path.GetFileName(resource.OriginalUrl.Pathname), "memory:///"))
18 .Save(outputStream, context);
19 }
20
21 public void PrintInfo()
22 {
23 foreach (Tuple<Stream, Resource> stream in Streams)
24 Console.WriteLine($"uri:{stream.Item2.OutputUrl}, length:{stream.Item1.Length}");
25 }
26}
Enregistrer HTML en MHTML
Dans certains cas, vous devez enregistrer votre page web sous la forme d’un fichier unique. le document MHTML peut s’avérer pratique et utile à cette fin, car il s’agit d’une archive de page web qui stocke tout à l’intérieur d’elle-même. L’énumération HTMLSaveFormat spécifie le format dans lequel le document est enregistré. Il peut s’agir des formats HTML, MHTML et MD. L’exemple ci-dessous montre comment utiliser la méthode
Save(path, saveFormat
) pour l’enregistrement HTML vers MHTML.
1// Save HTML as MHTML using C#
2
3// Prepare an output path for a document saving
4string savePath = Path.Combine(OutputDir, "save-to-mhtml.mht");
5
6// Prepare a simple HTML file with a linked document
7File.WriteAllText("save-to-mhtml.html", "<p>Hello, World!</p>" +
8 "<a href='linked-file.html'>linked file</a>");
9
10// Prepare a simple linked HTML file
11File.WriteAllText("linked-file.html", "<p>Hello, linked file!</p>");
12
13// Load the "save-to-mhtml.html" into memory
14using (HTMLDocument document = new HTMLDocument("save-to-mhtml.html"))
15{
16 // Save the document to MHTML format
17 document.Save(savePath, HTMLSaveFormat.MHTML);
18}
Le fichier “save-to-mhtml.mht” enregistré stocke le code HTML des fichiers “document.html” et “linked-file.html”.
Enregistrer HTML en Markdown
Markdown est un langage de balisage avec une syntaxe de texte brut. Comme pour l’exemple HTML vers MHTML, vous pouvez utiliser le HTMLSaveFormat
pour l’enregistrement HTML vers MD. Jetez un oeil à l’exemple suivant :
1// Save HTML as Markdown using C#
2
3// Prepare an output path for a document saving
4string documentPath = Path.Combine(OutputDir, "save-html-to-markdown.md");
5
6// Prepare HTML code
7string html_code = "<H2>Hello, World!</H2>";
8
9// Initialize a document from a string variable
10using (HTMLDocument document = new HTMLDocument(html_code, "."))
11{
12 // Save the document as a Markdown file
13 document.Save(documentPath, HTMLSaveFormat.Markdown);
14}
Pour plus d’informations sur l’utilisation de HTML Converter, veuillez consulter l’article Convertir HTML en Markdown.
Enregistrer SVG
Habituellement, vous pouvez voir SVG dans un fichier HTML, il est utilisé pour représenter les données vectorielles sur la page : images, icônes, tableaux, etc. Cependant, le SVG peut également être extrait de la page web et vous pouvez le manipuler de la même manière que le document HTML.
Puisque SVGDocument et HTMLDocument sont basés sur le même standard WHATWG DOM, toutes les opérations telles que le chargement, la lecture, l’édition, la conversion et l’enregistrement sont similaires pour les deux documents. Ainsi, tous les exemples de manipulation du document HTML s’appliquent également au document SVG.
Pour enregistrer vos modifications, procédez comme suit :
1// Save HTML as SVG using C#
2
3// Prepare an output path for a document saving
4string documentPath = Path.Combine(OutputDir, "save-html-to-svg.svg");
5
6// Prepare SVG code
7string code = @"
8 <svg xmlns='http://www.w3.org/2000/svg' height='200' width='300'>
9 <g fill='none' stroke-width= '10' stroke-dasharray='30 10'>
10 <path stroke='red' d='M 25 40 l 215 0' />
11 <path stroke='black' d='M 35 80 l 215 0' />
12 <path stroke='blue' d='M 45 120 l 215 0' />
13 </g>
14 </svg>";
15
16// Initialize an SVG instance from the content string
17using (SVGDocument document = new SVGDocument(code, "."))
18{
19 // Save the SVG file to a disk
20 document.Save(documentPath);
21}
Pour plus d’informations sur le dessin de base SVG et l’utilisation de l’API pour le traitement et le rendu des documents SVG, voir Aspose.SVG for .NET Documentation.
Vous pouvez télécharger les exemples complets et les fichiers de données sur GitHub.