Сохранение HTML-документа – примеры C#

После загрузки существующего файла или создания HTML-документа с нуля вы можете сохранить изменения с помощью одного из методов HTMLDocument.Save(). Существуют перегруженные методы сохранения документа в файл, URL-адрес или потоки.

Обратите внимание, что у нас есть две разные концепции создания выходных файлов:

  • Первая концепция основана на создании HTML-подобных файлов в качестве выходных данных. SaveOptions в качестве базового класса для этого подхода помогает управлять процессом сохранения связанных ресурсов, таких как сценарии, стили, изображения и т. д. Класс ResourceHandler отвечает за обработку ресурсов. Он разработан для сохранения HTML-контента и ресурсов в потоки и предоставляет методы, позволяющие контролировать действия, которые будут выполняться с ресурсом.
  • Вторая концепция сохранения докумнта может быть использована для создания визуального представления HTML. Базовым классом для этой концепции является RenderingOptions; у него есть специализированные методы для указания размера страницы, полей страницы, разрешения, пользовательских стилей и т. д.

В этой статье описывается только использование классов SaveOptions и ResourceHandler. Чтобы узнать больше о механизме рендеринга, прочтите статьи Renderers и Параметры рендеринга.

SaveOptions и ResourceHandlingOptions

SaveOptions – это базовый класс, который позволяет указывать дополнительные параметры для операций сохранения и помогает управлять связанными ресурсами. Свойство ResourceHandlingOptions класса SaveOptions используется для настройки обработки ресурсов. Класс ResourceHandlingOptions представляет параметры обработки ресурсов, а список доступных из них показан в следующей таблице:

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 options specifies behavior for other than JavaScript files.

Сохранить HTML

После завершения внесения изменений в HTML, вы можете сохранить документ. Сделать это можно с помощью одного из методов Save() класса HTMLDocument. Следующий пример – самый простой способ сохранить HTML-файл:

 1// Save HTML to a file
 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}

В приведенном выше примере мы используем конструктор HTMLDocument() для инициализации пустого HTML-документа. Метод CreateTextNode(data) класса HTMLDocument создает текстовый узел по заданной строке. Метод Save(path) сохраняет документ в локальный файл, указанный в пути.

Приведенный выше пример довольно прост. Однако в реальных приложениях часто требуется дополнительный контроль над процессом сохранения. В следующих нескольких разделах описывается, как использовать параметры обработки ресурсов или сохранять документ в различных форматах.

Сохранить HTML в файл

В следующем фрагменте кода показано, как использовать свойство ResourceHandlingOptions класса SaveOptions для управления связанными с вашими документами файлами.

 1// Save HTML with a linked resources
 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}

Сохранить HTML в хранилище локальной файловой системы

HTML-документ может содержать различные ресурсы, такие как CSS, внешние изображения и файлы. Aspose.HTML предоставляет возможность сохранять HTML со всеми связанными файлами – класс ResourceHandler разработан для сохранения HTML-контента и ресурсов в потоки. Этот класс отвечает за обработку ресурсов и предоставляет методы, позволяющие контролировать действия с каждым ресурсом.

Давайте рассмотрим пример сохранения HTML с ресурсами в указанное пользователем локальное файловое хранилище. Исходный документ with-resources.html и связанный с ним файл изображения находятся в одном каталоге. Конструктор FileSystemResourceHandler(customOutDir) принимает путь, указывающий, где будет сохранен документ с ресурсами, и создает объект FileSystemResourceHandler. Метод Save(resourceHandler) принимает этот объект и сохраняет HTML в выходное хранилище:

 1// Save HTML with resources to local storage
 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}

Сохранить HTML в ZIP-архив

Вы можете реализовать ResourceHandler, создав класс ZipResourceHandler. Он позволяет создавать структурированный и сжатый архив, содержащий документы HTML и связанные ресурсы, что делает его пригодным для таких сценариев, как архивирование и оптимизация хранения. Метод HandleResource() в классе ZipResourceHandler служит для настройки поведения обработки и хранения отдельных ресурсов в Zip-архиве.

В следующем примере класс ZipResourceHandler используется для сохранения документа with-resources.html вместе со связанными с ним ресурсами в Zip-архив:

 1// Save HTML with resources to a Zip archive
 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}

Класс ZipResourceHandler расширяет базовый класс ResourceHandler и предоставляет удобный способ управления всем процессом обработки и хранения ресурсов, связанных с HTML-документом, в 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}

Сохранить HTML в потоки памяти

Реализация класса ResourceHandler в классе MemoryResourceHandler позволяет сохранять HTML в потоки памяти. Следующий код показывает, как использовать класс MemoryResourceHandler для хранения HTML-документа в памяти, сбора и печати информации об обрабатываемых ресурсах.

  1. Инициализируйте HTML-документ, используя указанный путь к файлу HTML.
  2. Создайте экземпляр класса MemoryResourceHandler. Этот класс предназначен для захвата и хранения ресурсов в потоках памяти во время процесса обработки ресурсов.
  3. Вызовите метод Save() HTML-документа и передайте ему экземпляр MemoryResourceHandler в качестве аргумента. Это связывает логику обработки ресурсов MemoryResourceHandler с процессом сохранения HTML-документа.
  4. Используйте метод PrintInfo() класса MemoryResourceHandler для печати информации об обрабатываемых ресурсах.
 1// Save HTML with resources to memory streams
 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}

После запуска примера будет напечатано сообщение о хранении в памяти:

uri:memory:///with-resources.html, length:256
uri:memory:///photo.png, length:57438

ResourceHandler – это базовый класс, который поддерживает создание потоков вывода и управление ими. Класс MemoryResourceHandler позволяет захватывать и хранить потоки ресурсов в памяти, обеспечивая динамический и гибкий способ обработки ресурсов без физического сохранения их в файловой системе. В следующем фрагменте кода показана реализация ResourceHandler в классе 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}

Сохранить HTML в MHTML

В некоторых случаях вам необходимо сохранить веб-страницу в виде одного файла. Документ MHTML может быть удобен и полезен для этой цели, поскольку он представляет собой архив веб-страницы и хранит все внутри себя. Перечисление HTMLSaveFormat указывает формат, в котором сохраняется документ. Это могут быть форматы HTML, MHTML и MD. В приведенном ниже примере показано, как использовать метод Save(path, saveFormat) для сохранения HTML в MHTML.

 1// Save HTML as MHTML
 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}

Сохраненный файл save-to-mhtml.mht хранит HTML файлыdocument.html» и «linked-file.html.

Сохранить HTML в Markdown

Markdown – это язык разметки с синтаксисом простого текста. Помимо примера HTML в MHTML, вы можете использовать HTMLSaveFormat для сохранения HTML в MD. Пожалуйста, взгляните на следующий пример:

 1// Save HTML as Markdown
 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}
Example-SaveHTMLToMD.cs hosted with ❤ by GitHub

Для получения дополнительной информации о том, как использовать конвертер Markdown, посетите статью Преобразование HTML в Markdown.

Сохранить SVG

Обычно вы можете увидеть SVG как часть HTML-файла, он используется для представления векторных данных на странице: изображений, значков, таблиц и т. д. Однако SVG также можно извлечь из Интернета. странице, и вы можете манипулировать ею так же, как и HTML-документом.

Поскольку SVGDocument и HTMLDocument основаны на одном и том же стандарте WHATWG DOM, все операции, такие как загрузка, чтение, редактирование, преобразование и сохранение, аналогичны для обоих документов. Таким образом, все примеры, в которых вы можете видеть манипуляции с HTMLDocument, применимы и для SVGDocument.

Чтобы сохранить изменения, используйте следующее:

 1// Save HTML as SVG
 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}
Example-SaveHTMLToSVG.cs hosted with ❤ by GitHub

Дополнительную информацию об основах рисования SVG и использовании API для обработки и рендеринга документов SVG вы найдете в документации Aspose.SVG for .NET.

Вы можете загрузить полные примеры и файлы данных с GitHub.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.