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.

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:

OptionDescription
UrlRestrictionApplies restrictions to the host or folders where resources are located.
MaxHandlingDepthIf 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.
JavaScriptThis 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.
DefaultThis 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.

  1. Inicialice un documento HTML utilizando la ruta del archivo HTML especificada.
  2. 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.
  3. Llame al método Save() del documento HTML y pásele la instancia MemoryResourceHandler como argumento. Esto asocia la lógica de manejo de recursos de MemoryResourceHandler con el proceso de guardar documentos HTML.
  4. Utilice el método PrintInfo() de MemoryResourceHandler 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.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.