Сохранение 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-файл:

 1using System.IO;
 2using Aspose.Html;
 3...
 4    // Prepare an output path for a document saving
 5	string documentPath = Path.Combine(OutputDir, "save-to-file.html");
 6
 7    // Initialize an empty HTML document
 8    using (var document = new HTMLDocument())
 9    {
10        // Create a text node and add it to the document
11        var text = document.CreateTextNode("Hello World!");
12        document.Body.AppendChild(text);
13
14        // Save the HTML document to a local file
15        document.Save(documentPath);
16    }

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

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

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

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

 1using System.IO;
 2using Aspose.Html;
 3using Aspose.Html.Saving;
 4...
 5    // Prepare an output path for a document
 6    string documentPath = Path.Combine(OutputDir, "save-with-linked-file.html");
 7
 8    // Prepare a simple HTML file with a linked document
 9    File.WriteAllText(documentPath, "<p>Hello World!</p>" +
10                                    "<a href='linked.html'>linked file</a>");
11    // Prepare a simple linked HTML file
12    File.WriteAllText("linked.html", "<p>Hello linked file!</p>");
13
14    // Load the "save-with-linked-file.html" into memory
15    using (var document = new HTMLDocument(documentPath))
16    {
17        // Create a save options instance
18        var options = new HTMLSaveOptions();
19
20        // The following line with value '0' cuts off all other linked HTML-files while saving this instance
21        // If you remove this line or change value to the '1', the 'linked.html' file will be saved as well to the output folder
22        options.ResourceHandlingOptions.MaxHandlingDepth = 1;
23
24        // Save the document with the save options
25        document.Save(Path.Combine(OutputDir, "save-with-linked-file_out.html"), options);
26    }

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

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

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

 1using Aspose.Html;
 2using Aspose.Html.Saving.ResourceHandlers;
 3using System.IO;
 4
 5...
 6
 7    // Prepare a path to a source HTML file
 8    string inputPath = Path.Combine(DataDir, "with-resources.html");
 9
10    // Prepare a full path to an output directory 
11    string customOutDir = Path.Combine(Directory.GetCurrentDirectory(), "./../../../../tests-out/save/");
12
13    // Load the HTML document from a file
14    using (var doc = new HTMLDocument(inputPath))
15    {
16        // Save HTML with resources
17        doc.Save(new FileSystemResourceHandler(customOutDir));
18    }

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

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

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

 1using System.IO;
 2using Aspose.Html;
 3using Aspose.Html.Saving;
 4using Aspose.Html.Saving.ResourceHandlers;
 5using System.IO.Compression;
 6...
 7
 8    // Prepare a path to a source HTML file 
 9    string inputPath = Path.Combine(DataDir, "with-resources.html");
10
11    var dir = Directory.GetCurrentDirectory();
12
13    // Prepare a full path to an output zip storage
14    string customArchivePath = Path.Combine(dir, "./../../../../tests-out/save/archive.zip");
15
16    // Load the HTML document
17    using (var doc = new HTMLDocument(inputPath))
18    {
19        // Initialize an instance of the ZipResourceHandler class
20        using (var resourceHandler = new ZipResourceHandler(customArchivePath))
21        {
22            // Save HTML with resources to a Zip archive
23            doc.Save(resourceHandler);
24        }
25    }

Класс ZipResourceHandler расширяет базовый класс ResourceHandler и предоставляет удобный способ управления всем процессом обработки и хранения ресурсов, связанных с HTML-документом, в Zip-архиве:

 1    internal 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    }

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

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

  1. Инициализируйте HTML-документ, используя указанный путь к файлу HTML.
  2. Создайте экземпляр класса MemoryResourceHandler. Этот класс предназначен для захвата и хранения ресурсов в потоках памяти во время процесса обработки ресурсов.
  3. Вызовите метод Save() HTML-документа и передайте ему экземпляр MemoryResourceHandler в качестве аргумента. Это связывает логику обработки ресурсов MemoryResourceHandler с процессом сохранения HTML-документа.
  4. Используйте метод PrintInfo() класса MemoryResourceHandler для печати информации об обрабатываемых ресурсах.
 1using System.IO;
 2using Aspose.Html;
 3using Aspose.Html.Saving;
 4using Aspose.Html.Saving.ResourceHandlers;
 5using System.Collections.Generic;
 6...
 7
 8    // Prepare a path to a source HTML file 
 9    string inputPath = Path.Combine(DataDir, "with-resources.html");
10    
11    // Load the HTML document
12    using (var doc = new HTMLDocument(inputPath))
13    {
14        // Create an instance of the MemoryResourceHandler class and save HTML to memory
15        var resourceHandler = new MemoryResourceHandler();
16        doc.Save(resourceHandler);
17        resourceHandler.PrintInfo();
18    }

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

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

ResourceHandler – это базовый класс, который поддерживает создание потоков вывода и управление ими. Класс MemoryResourceHandler позволяет захватывать и хранить потоки ресурсов в памяти, обеспечивая динамический и гибкий способ обработки ресурсов без физического сохранения их в файловой системе. В следующем фрагменте кода показана реализация ResourceHandler в классе MemoryResourceHandler:

 1    internal 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    }

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

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

 1using System.IO;
 2using Aspose.Html;
 3using Aspose.Html.Saving;
 4...
 5    // Prepare an output path for a document saving
 6    string documentPath = Path.Combine(OutputDir, "save-to-MTHML.mht");
 7
 8    // Prepare a simple HTML file with a linked document
 9    File.WriteAllText("document.html", "<p>Hello World!</p>" +
10                                       "<a href='linked-file.html'>linked file</a>");
11    // Prepare a simple linked HTML file
12    File.WriteAllText("linked-file.html", "<p>Hello linked file!</p>");
13
14    // Load the "document.html" into memory
15    using (var document = new HTMLDocument("document.html"))
16    {
17        // Save the document to MHTML format
18        document.Save(documentPath, HTMLSaveFormat.MHTML);
19
20    }

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

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

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

 1using System.IO;
 2using Aspose.Html;
 3using Aspose.Html.Saving;
 4...
 5    // Prepare an output path for a document saving
 6    string documentPath = Path.Combine(OutputDir, "save-to-MD.md");
 7
 8    // Prepare HTML code
 9    var html_code = "<H2>Hello World!</H2>";
10
11    // Initialize a document from the string variable
12    using (var document = new HTMLDocument(html_code, "."))
13    {
14        // Save the document as a Markdown file
15        document.Save(documentPath, HTMLSaveFormat.Markdown);
16    }

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

Сохранить SVG

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

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

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

 1using System.IO;
 2using Aspose.Html;
 3using Aspose.Html.Dom.Svg;
 4...
 5    // Prepare an output path for an SVG document saving
 6    string documentPath = Path.Combine(OutputDir, "save-to-SVG.svg");
 7
 8    // Prepare SVG code
 9    var code = @"
10        <svg xmlns='http://www.w3.org/2000/svg' height='200' width='300'>
11            <g fill='none' stroke-width= '10' stroke-dasharray='30 10'>
12                <path stroke='red' d='M 25 40 l 215 0' />
13                <path stroke='black' d='M 35 80 l 215 0' />
14                <path stroke='blue' d='M 45 120 l 215 0' />
15            </g>
16        </svg>";
17
18    // Initialize an SVG instance from the content string
19    using (var document = new SVGDocument(code, "."))
20    {
21        // Save the SVG file to a disk
22        document.Save(documentPath);
23    }

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

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

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.