Сохранение 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-файл:
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-документа в памяти, сбора и печати информации об обрабатываемых ресурсах.
- Инициализируйте HTML-документ, используя указанный путь к файлу HTML.
- Создайте экземпляр класса
MemoryResourceHandler
. Этот класс предназначен для захвата и хранения ресурсов в потоках памяти во время процесса обработки ресурсов. - Вызовите метод
Save()
HTML-документа и передайте ему экземплярMemoryResourceHandler
в качестве аргумента. Это связывает логику обработки ресурсовMemoryResourceHandler
с процессом сохранения HTML-документа. - Используйте метод
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.