Сохранение 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// 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-документа в памяти, сбора и печати информации об обрабатываемых ресурсах.
- Инициализируйте HTML-документ, используя указанный путь к файлу HTML.
- Создайте экземпляр класса
MemoryResourceHandler
. Этот класс предназначен для захвата и хранения ресурсов в потоках памяти во время процесса обработки ресурсов. - Вызовите метод
Save()
HTML-документа и передайте ему экземплярMemoryResourceHandler
в качестве аргумента. Это связывает логику обработки ресурсовMemoryResourceHandler
с процессом сохранения HTML-документа. - Используйте метод
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}
Для получения дополнительной информации о том, как использовать конвертер 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}
Дополнительную информацию об основах рисования SVG и использовании API для обработки и рендеринга документов SVG вы найдете в документации Aspose.SVG for .NET.
Вы можете загрузить полные примеры и файлы данных с GitHub.