Guardar documento HTML – ejemplos de C#
Después de descargar un archivo existente o crear un documento HTML desde cero, puede guardar los cambios utilizando uno de los métodos HTMLDocument.Save(). Existen métodos sobrecargados para guardar un documento en un archivo, URL o secuencias.
- La API proporciona el espacio de nombres Aspose.Html.Saving con las clases SaveOptions y ResourceHandlingOptions que le permiten configurar opciones para guardar operaciones.
- La API proporciona un espacio de nombres Aspose.Html.Saving.ResourceHandlers que contiene las clases ResourceHandler y FileSystemResourceHandler responsables de manejar los recursos.
Tenga en cuenta que tenemos dos conceptos diferentes para crear los archivos de salida:
- La primera concepción se basa en producir archivos tipo HTML como salida. SaveOptions como clase base para este enfoque ayuda a manejar el proceso de guardar recursos relacionados como scripts, estilos, imágenes, etc. La clase ResourceHandler es responsable de manejar los recursos. Está desarrollado para guardar contenido y recursos HTML en secuencias y proporciona métodos que le permiten controlar lo que se hará con el recurso.
- Como resultado, el segundo concepto podría usarse para crear una representación visual de HTML. La clase base para esta concepción es RenderingOptions; Tiene métodos especializados para especificar el tamaño de la página, los márgenes de la página, la resolución, los estilos de usuario, etc.
Este artículo solo describe cómo usar las clases SaveOptions
y ResourceHandler
. Para leer más sobre el mecanismo de renderizado, siga los artículos
Renderizadores y
Opciones de renderizado.
SaveOptions y ResourceHandlingOptions
SaveOptions es una clase base que le permite especificar opciones adicionales para guardar operaciones y ayuda a administrar los recursos vinculados. La propiedad ResourceHandlingOptions
de la clase SaveOptions se utiliza para la configuración del manejo de recursos. La clase
ResourceHandlingOptions representa opciones de manejo de recursos y la lista de las disponibles se muestra en la siguiente tabla:
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. |
Guardar HTML
Una vez que haya terminado los cambios en HTML, es posible que desee guardar el documento. Puedes hacerlo usando uno de los métodos Save() de la clase HTMLDocument. El siguiente ejemplo es la forma más sencilla de guardar un archivo HTML:
1// Prepare an output path for a document saving
2string documentPath = Path.Combine(OutputDir, "save-to-file.html");
3
4// Initialize an empty HTML document
5using (var document = new HTMLDocument())
6{
7 // Create a text element and add it to the document
8 var text = document.CreateTextNode("Hello, World!");
9 document.Body.AppendChild(text);
10
11 // Save the HTML document to the file on a disk
12 document.Save(documentPath);
13}
En el ejemplo anterior, utilizamos el constructor HTMLDocument() para inicializar un documento HTML vacío. El método
CreateTextNode(data
) de la clase HTMLDocument crea un nodo de texto dada la cadena especificada. El método
Save(path
) guarda el documento en un archivo local especificado por la ruta.
El ejemplo anterior es bastante simple. Sin embargo, en aplicaciones de la vida real, a menudo se necesita control adicional sobre el proceso de guardado. Las siguientes secciones describen cómo utilizar las opciones de manejo de recursos o guardar su documento en diferentes formatos.
Guardar HTML en un archivo
El siguiente fragmento de código muestra cómo utilizar la propiedad ResourceHandlingOptions de la clase SaveOptions para administrar archivos vinculados a sus documentos.
1// Prepare an output path for an HTML document
2string documentPath = Path.Combine(OutputDir, "save-with-linked-file.html");
3
4// Prepare a simple HTML file with a linked document
5File.WriteAllText(documentPath, "<p>Hello, World!</p>" +
6 "<a href='linked.html'>linked file</a>");
7
8// Prepare a simple linked HTML file
9File.WriteAllText(Path.Combine(OutputDir, "linked.html"), "<p>Hello, linked file!</p>");
10
11// Load the "save-with-linked-file.html" into memory
12using (var document = new HTMLDocument(documentPath))
13{
14 // Create a save options instance
15 var options = new HTMLSaveOptions();
16
17 // The following line with value '0' cuts off all other linked HTML-files while saving this instance
18 // If you remove this line or change value to the '1', the 'linked.html' file will be saved as well to the output folder
19 options.ResourceHandlingOptions.MaxHandlingDepth = 1;
20
21 // Save the document with the save options
22 document.Save(Path.Combine(OutputDir, "save-with-linked-file_out.html"), options);
23}
Guarde HTML en un almacenamiento del sistema de archivos local
El documento HTML puede contener diferentes recursos como CSS, imágenes y archivos externos. Aspose.HTML for .NET proporciona una forma de guardar HTML con todos los archivos vinculados: la clase ResourceHandler está desarrollada para guardar contenido HTML y recursos en secuencias. Esta clase es responsable de manejar los recursos y proporciona métodos que le permiten controlar lo que se hace con cada recurso.
Consideremos un ejemplo de cómo guardar HTML con recursos en un almacenamiento de archivos local especificado por el usuario. El documento fuente
with-resources.html y su archivo de imagen vinculado están en el mismo directorio. El constructor
FileSystemResourceHandler(customOutDir
) toma una ruta que indica dónde se guardará el documento con recursos y crea un objeto FileSystemResourceHandler
. El método
Save(resourceHandler
) toma este objeto y guarda HTML en el almacenamiento de salida.
1// Prepare a path to a source HTML file
2string inputPath = Path.Combine(DataDir, "with-resources.html");
3
4// Prepare a full path to an output directory
5string customOutDir = Path.Combine(Directory.GetCurrentDirectory(), "./../../../../tests-out/saving/");
6
7// Load the HTML document from a file
8using (var doc = new HTMLDocument(inputPath))
9{
10 // Save HTML with resources
11 doc.Save(new FileSystemResourceHandler(customOutDir));
12}
Guarde HTML en un archivo Zip
Puede implementar
ResourceHandler creando la clase ZipResourceHandler. Le permite crear un archivo estructurado y comprimido que contiene documentos HTML y recursos asociados, lo que lo hace adecuado para escenarios como el archivado y la optimización del almacenamiento. El método
HandleResource() en la clase ZipResourceHandler
sirve para personalizar el comportamiento de cómo se procesan y almacenan los recursos individuales en un archivo Zip.
En el siguiente ejemplo, la clase ZipResourceHandler
se utiliza para guardar el documento
with-resources.html junto con sus recursos vinculados en un archivo Zip:
1// Prepare a path to a source HTML file
2string inputPath = Path.Combine(DataDir, "with-resources.html");
3
4var dir = Directory.GetCurrentDirectory();
5
6// Prepare a full path to an output zip storage
7string customArchivePath = Path.Combine(dir, "./../../../../tests-out/saving/archive.zip");
8
9// Load the HTML document
10using (var doc = new HTMLDocument(inputPath))
11{
12 // Initialize an instance of the ZipResourceHandler class
13 using (var resourceHandler = new ZipResourceHandler(customArchivePath))
14 {
15 // Save HTML with resources to a Zip archive
16 doc.Save(resourceHandler);
17 }
18}
La clase ResourceHandler
está destinada a la implementación del cliente. La clase ZipResourceHandler
extiende la clase base ResourceHandler
y proporciona una manera conveniente de administrar todo el proceso de manejo y almacenamiento de recursos vinculados con un documento HTML en un archivo Zip:
1internal class ZipResourceHandler : ResourceHandler, IDisposable
2{
3 private FileStream zipStream;
4 private ZipArchive archive;
5 private int streamsCounter;
6 private bool initialized;
7
8 public ZipResourceHandler(string name)
9 {
10 DisposeArchive();
11 zipStream = new FileStream(name, FileMode.Create);
12 archive = new ZipArchive(zipStream, ZipArchiveMode.Update);
13 initialized = false;
14 }
15
16 public override void HandleResource(Resource resource, ResourceHandlingContext context)
17 {
18 var zipUri = (streamsCounter++ == 0
19 ? Path.GetFileName(resource.OriginalUrl.Href)
20 : Path.Combine(Path.GetFileName(Path.GetDirectoryName(resource.OriginalUrl.Href)),
21 Path.GetFileName(resource.OriginalUrl.Href)));
22 var samplePrefix = String.Empty;
23 if (initialized)
24 samplePrefix = "my_";
25 else
26 initialized = true;
27
28 using (var newStream = archive.CreateEntry(samplePrefix + zipUri).Open())
29 {
30 resource.WithOutputUrl(new Url("file:///" + samplePrefix + zipUri)).Save(newStream, context);
31 }
32 }
33
34 private void DisposeArchive()
35 {
36 if (archive != null)
37 {
38 archive.Dispose();
39 archive = null;
40 }
41
42 if (zipStream != null)
43 {
44 zipStream.Dispose();
45 zipStream = null;
46 }
47
48 streamsCounter = 0;
49 }
50
51 public void Dispose()
52 {
53 DisposeArchive();
54 }
55}
Guardar HTML en secuencias de memoria
La implementación de la clase
ResourceHandler en la clase MemoryResourceHandler permite guardar HTML en flujos de memoria. El siguiente código muestra cómo utilizar la clase MemoryResourceHandler
para almacenar un documento HTML en la memoria, recopilando e imprimiendo información sobre los recursos manejados.
- Inicialice un documento HTML utilizando la ruta del archivo HTML especificada.
- Cree una instancia de la clase
MemoryResourceHandler
. Esta clase está diseñada para capturar y almacenar recursos dentro de flujos de memoria durante el proceso de manejo de recursos. - Llame al método
Save()
del documento HTML y pásele la instanciaMemoryResourceHandler
como argumento. Esto asocia la lógica de manejo de recursos deMemoryResourceHandler
con el proceso de guardar documentos HTML. - Utilice el método
PrintInfo()
deMemoryResourceHandler
para imprimir información sobre los recursos manejados.
1// Prepare a path to a source HTML file
2string inputPath = Path.Combine(DataDir, "with-resources.html");
3
4// Load the HTML document
5using (var doc = new HTMLDocument(inputPath))
6{
7 // Create an instance of the MemoryResourceHandler class and save HTML to memory
8 var resourceHandler = new MemoryResourceHandler();
9 doc.Save(resourceHandler);
10 resourceHandler.PrintInfo();
11}
Después de ejecutar el ejemplo, se imprimirá el mensaje sobre el almacenamiento de memoria:
uri:memory:///with-resources.html, length:256
uri:memory:///photo1.png, length:57438
ResourceHandler es una clase base que admite la creación y gestión de flujos de salida. La clase MemoryResourceHandler
le permite capturar y almacenar flujos de recursos en memoria, proporcionando una forma dinámica y flexible de manejar recursos sin guardarlos físicamente en el sistema de archivos. El siguiente fragmento de código muestra la realización de ResourceHandler
en la clase MemoryResourceHandler:
1internal class MemoryResourceHandler : ResourceHandler
2{
3 public List<Tuple<Stream, Resource>> Streams;
4
5 public MemoryResourceHandler()
6 {
7 Streams = new List<Tuple<Stream, Resource>>();
8 }
9
10 public override void HandleResource(Resource resource, ResourceHandlingContext context)
11 {
12 var outputStream = new MemoryStream();
13 Streams.Add(Tuple.Create<Stream, Resource>(outputStream, resource));
14 resource
15 .WithOutputUrl(new Url(Path.GetFileName(resource.OriginalUrl.Pathname), "memory:///"))
16 .Save(outputStream, context);
17 }
18
19 public void PrintInfo()
20 {
21 foreach (var stream in Streams)
22 Console.WriteLine($"uri:{stream.Item2.OutputUrl}, length:{stream.Item1.Length}");
23 }
24}
Guardar HTML en MHTML
En algunos casos, deberá guardar su página web como un solo archivo. El documento MHTML puede resultar útil y útil para este propósito, ya que es un archivo de página web y almacena todo dentro de sí mismo. La enumeración HTMLSaveFormat especifica el formato en el que se guarda el documento; pueden ser formatos HTML, MHTML y MD. El siguiente ejemplo muestra cómo utilizar el método
Save(path, saveFormat
) para guardar HTML en MHTML.
1// Prepare an output path for a document saving
2string savePath = Path.Combine(OutputDir, "save-to-mhtml.mht");
3
4// Prepare a simple HTML file with a linked document
5File.WriteAllText("save-to-mhtml.html", "<p>Hello, World!</p>" +
6 "<a href='linked-file.html'>linked file</a>");
7
8// Prepare a simple linked HTML file
9File.WriteAllText("linked-file.html", "<p>Hello, linked file!</p>");
10
11// Load the "save-to-mhtml.html" into memory
12using (var document = new HTMLDocument("save-to-mhtml.html"))
13{
14 // Save the document to MHTML format
15 document.Save(savePath, HTMLSaveFormat.MHTML);
16}
El archivo “save-to-mhtml.mht” guardado almacena HTML de los archivos “document.html” y “linked-file.html”.
Guardar HTML en Markdown
Markdown es un lenguaje de marcado con sintaxis de texto sin formato. Además del ejemplo de HTML a MHTML, puede utilizar HTMLSaveFormat
para guardar HTML a MD. Por favor, eche un vistazo al siguiente ejemplo:
1// Prepare an output path for a document saving
2string documentPath = Path.Combine(OutputDir, "save-html-to-markdown.md");
3
4// Prepare HTML code
5var html_code = "<H2>Hello, World!</H2>";
6
7// Initialize a document from a string variable
8using (var document = new HTMLDocument(html_code, "."))
9{
10 // Save the document as a Markdown file
11 document.Save(documentPath, HTMLSaveFormat.Markdown);
12}
Para obtener más información sobre cómo utilizar HTML Converter, visite el artículo Convertir HTML a Markdown.
Guardar SVG
Por lo general, puede ver SVG como parte de un archivo HTML, se usa para representar los datos vectoriales en la página: imágenes, íconos, tablas, etc. Sin embargo, SVG también se puede extraer de la web. página y puede manipularla de forma similar al documento HTML.
Dado que SVGDocument y HTMLDocument se basan en el mismo estándar WHATWG DOM, todas las operaciones como cargar, leer, editar, convertir y guardar son similares para ambos documentos. Por lo tanto, todos los ejemplos en los que puede ver manipulación con HTMLDocument también son aplicables para SVGDocument.
Para guardar sus cambios, utilice lo siguiente:
1// Prepare an output path for a document saving
2string documentPath = Path.Combine(OutputDir, "save-html-to-svg.svg");
3
4// Prepare SVG code
5var code = @"
6 <svg xmlns='http://www.w3.org/2000/svg' height='200' width='300'>
7 <g fill='none' stroke-width= '10' stroke-dasharray='30 10'>
8 <path stroke='red' d='M 25 40 l 215 0' />
9 <path stroke='black' d='M 35 80 l 215 0' />
10 <path stroke='blue' d='M 45 120 l 215 0' />
11 </g>
12 </svg>";
13
14// Initialize an SVG instance from the content string
15using (var document = new SVGDocument(code, "."))
16{
17 // Save the SVG file to a disk
18 document.Save(documentPath);
19}
Para obtener más información sobre el dibujo básico de SVG y el uso de API para el procesamiento y representación de documentos SVG, consulte la Documentación de Aspose.SVG for .NET.
Puede descargar los ejemplos completos y los archivos de datos desde GitHub.