Сохранение HTML-документа – примеры C#
После загрузки существующего файла или создания HTML-документа с нуля вы можете сохранить изменения с помощью одного из методов HTMLDocument.Save(). Существуют перегруженные методы сохранения документа в файл, URL-адрес или потоки.
- API предоставляет пространство имен Aspose.Html.Saving с классами SaveOptions и ResourceHandlingOptions, которые позволяют задавать параметры операций сохранения.
- API предоставляет пространство имен Aspose.Html.Saving.ResourceHandlers, которое содержит классы ResourceHandler и FileSystemResourceHandler, отвечающие за обработку ресурсов.
Обратите внимание, что у нас есть две разные концепции создания выходных файлов:
- Первая концепция основана на создании HTML-подобных файлов в качестве выходных данных. SaveOptions в качестве базового класса для этого подхода помогает управлять процессом сохранения связанных ресурсов, таких как сценарии, стили, изображения и т. д. Класс ResourceHandler отвечает за обработку ресурсов. Он разработан для сохранения HTML-контента и ресурсов в потоки и предоставляет методы, позволяющие контролировать действия, которые будут выполняться с ресурсом.
- Вторая концепция сохранения докумнта может быть использована для создания визуального представления HTML. Базовым классом для этой концепции является RenderingOptions; у него есть специализированные методы для указания размера страницы, полей страницы, разрешения, пользовательских стилей и т. д.
В этой статье описывается только использование классов SaveOptions и ResourceHandler. Чтобы узнать больше о механизме рендеринга, прочтите статьи Renderers и Параметры рендеринга.
SaveOptions и ResourceHandlingOptions
SaveOptions – это базовый класс, который позволяет указывать дополнительные параметры для операций сохранения и помогает управлять связанными ресурсами. Свойство ResourceHandlingOptions
класса SaveOptions используется для настройки обработки ресурсов. Класс
ResourceHandlingOptions представляет параметры обработки ресурсов, а список доступных из них показан в следующей таблице:
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 options specifies behavior for other than JavaScript files. |
Сохранить HTML
После завершения внесения изменений в HTML, вы можете сохранить документ. Сделать это можно с помощью одного из методов Save() класса HTMLDocument. Следующий пример – самый простой способ сохранить 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}
В приведенном выше примере мы используем конструктор HTMLDocument() для инициализации пустого HTML-документа. Метод
CreateTextNode(data
) класса HTMLDocument создает текстовый узел по заданной строке. Метод
Save(path
) сохраняет документ в локальный файл, указанный в пути.
Приведенный выше пример довольно прост. Однако в реальных приложениях часто требуется дополнительный контроль над процессом сохранения. В следующих нескольких разделах описывается, как использовать параметры обработки ресурсов или сохранять документ в различных форматах.
Сохранить HTML в файл
В следующем фрагменте кода показано, как использовать свойство ResourceHandlingOptions класса SaveOptions для управления связанными с вашими документами файлами.
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}
Сохранить HTML в хранилище локальной файловой системы
HTML-документ может содержать различные ресурсы, такие как CSS, внешние изображения и файлы. Aspose.HTML предоставляет возможность сохранять HTML со всеми связанными файлами – класс ResourceHandler разработан для сохранения HTML-контента и ресурсов в потоки. Этот класс отвечает за обработку ресурсов и предоставляет методы, позволяющие контролировать действия с каждым ресурсом.
Давайте рассмотрим пример сохранения HTML с ресурсами в указанное пользователем локальное файловое хранилище. Исходный документ
with-resources.html и связанный с ним файл изображения находятся в одном каталоге. Конструктор
FileSystemResourceHandler(customOutDir
) принимает путь, указывающий, где будет сохранен документ с ресурсами, и создает объект FileSystemResourceHandler
. Метод
Save(resourceHandler
) принимает этот объект и сохраняет HTML в выходное хранилище:
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}
Сохранить HTML в ZIP-архив
Вы можете реализовать
ResourceHandler, создав класс ZipResourceHandler. Он позволяет создавать структурированный и сжатый архив, содержащий документы HTML и связанные ресурсы, что делает его пригодным для таких сценариев, как архивирование и оптимизация хранения. Метод
HandleResource() в классе ZipResourceHandler
служит для настройки поведения обработки и хранения отдельных ресурсов в Zip-архиве.
В следующем примере класс ZipResourceHandler
используется для сохранения документа
with-resources.html вместе со связанными с ним ресурсами в 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}
Класс ZipResourceHandler
расширяет базовый класс ResourceHandler
и предоставляет удобный способ управления всем процессом обработки и хранения ресурсов, связанных с HTML-документом, в 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}
Сохранить HTML в потоки памяти
Реализация класса
ResourceHandler в классе MemoryResourceHandler позволяет сохранять HTML в потоки памяти. Следующий код показывает, как использовать класс MemoryResourceHandler
для хранения HTML-документа в памяти, сбора и печати информации об обрабатываемых ресурсах.
- Инициализируйте HTML-документ, используя указанный путь к файлу HTML.
- Создайте экземпляр класса
MemoryResourceHandler
. Этот класс предназначен для захвата и хранения ресурсов в потоках памяти во время процесса обработки ресурсов. - Вызовите метод
Save()
HTML-документа и передайте ему экземплярMemoryResourceHandler
в качестве аргумента. Это связывает логику обработки ресурсовMemoryResourceHandler
с процессом сохранения HTML-документа. - Используйте метод
PrintInfo()
классаMemoryResourceHandler
для печати информации об обрабатываемых ресурсах.
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}
После запуска примера будет напечатано сообщение о хранении в памяти:
uri:memory:///with-resources.html, length:256
uri:memory:///photo.png, length:57438
ResourceHandler – это базовый класс, который поддерживает создание потоков вывода и управление ими. Класс MemoryResourceHandler
позволяет захватывать и хранить потоки ресурсов в памяти, обеспечивая динамический и гибкий способ обработки ресурсов без физического сохранения их в файловой системе. В следующем фрагменте кода показана реализация ResourceHandler
в классе 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}
Сохранить HTML в MHTML
В некоторых случаях вам необходимо сохранить веб-страницу в виде одного файла. Документ MHTML может быть удобен и полезен для этой цели, поскольку он представляет собой архив веб-страницы и хранит все внутри себя. Перечисление HTMLSaveFormat указывает формат, в котором сохраняется документ. Это могут быть форматы HTML, MHTML и MD. В приведенном ниже примере показано, как использовать метод
Save(path, saveFormat
) для сохранения HTML в 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}
Сохраненный файл save-to-mhtml.mht
хранит HTML файлыdocument.html
» и «linked-file.html
.
Сохранить HTML в Markdown
Markdown – это язык разметки с синтаксисом простого текста. Помимо примера HTML в MHTML, вы можете использовать HTMLSaveFormat для сохранения HTML в MD. Пожалуйста, взгляните на следующий пример:
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}
Для получения дополнительной информации о том, как использовать конвертер Markdown, посетите статью Преобразование HTML в Markdown.
Сохранить SVG
Обычно вы можете увидеть SVG как часть HTML-файла, он используется для представления векторных данных на странице: изображений, значков, таблиц и т. д. Однако SVG также можно извлечь из Интернета. странице, и вы можете манипулировать ею так же, как и HTML-документом.
Поскольку SVGDocument и HTMLDocument основаны на одном и том же стандарте WHATWG DOM, все операции, такие как загрузка, чтение, редактирование, преобразование и сохранение, аналогичны для обоих документов. Таким образом, все примеры, в которых вы можете видеть манипуляции с HTMLDocument, применимы и для SVGDocument.
Чтобы сохранить изменения, используйте следующее:
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}
Дополнительную информацию об основах рисования SVG и использовании API для обработки и рендеринга документов SVG см. в Документации Aspose.SVG for .NET.
Вы можете загрузить полные примеры и файлы данных с GitHub.