Конвертировать HTML из ZIP-архива в JPG – C# пример
В этой статье мы создадим собственный обработчик сообщений для выполнения конкретной задачи – преобразования HTML из ZIP-архива в JPG.
Вы можете скачать полные примеры C# и файлы данных с GitHub.
Есть много причин, по которым вам может потребоваться преобразовать HTML из ZIP-архива в формат JPG. Например, если вы хотите преобразовать документ HTML (XHTML), содержащий связанные ресурсы, в JPG, вы должны упаковать все эти ресурсы вместе с документом в один ZIP-архив и преобразовать ZIP в JPG. Aspose.HTML для .NET предоставляет функциональные возможности для создания пользовательских обработчиков сообщений для работы с ZIP-архивами.
Создайте собственный обработчик сообщений
Aspose.HTML для .NET предлагает функциональные возможности для создания собственного обработчика сообщений. Давайте разработаем собственный обработчик, который мы можем использовать для работы с ZIP-архивами. Выполните следующие действия:
- Используйте необходимое пространство имен, которым является Aspose.Html.Net. Это пространство имен представлено классами и интерфейсами, которые отвечают за упрощение сетевой обработки.
- Чтобы создать собственный обработчик сообщений, вам необходимо определить собственный класс, который будет производным от класса MessageHandler. Класс MessageHandler представляет базовый тип для обработчиков сообщений.
1using Aspose.Html.Net;
2...
3
4 class ZipArchiveMessageHandler : MessageHandler
5 {
6 }
- Инициализируйте экземпляр класса ZipArchiveMessageHandler и определите для него свойство Filter.
- Переопределите метод Invoke() класса MessageHandler для реализации пользовательского поведения обработчика сообщений.
1
2using System.Net;
3using Aspose.Html;
4using Aspose.Html.Net;
5using Aspose.Html.Net.MessageFilters;
6using Aspose.Zip;
7...
8
9 // Define ZipArchiveMessageHandler class that is derived from the MessageHandler class
10 class ZipArchiveMessageHandler : MessageHandler, IDisposable
11 {
12 private string filePath;
13 private Archive archive;
14
15 // Initialize an instance of the ZipArchiveMessageHandler class
16 public ZipArchiveMessageHandler(string path)
17 {
18 this.filePath = path;
19 Filters.Add(new ProtocolMessageFilter("zip"));
20 }
21
22 // Override the Invoke() method
23 public override void Invoke(INetworkOperationContext context)
24 {
25 // Call the GetFile() method that defines the logic in the Invoke() method
26 var buff = GetFile(context.Request.RequestUri.Pathname.TrimStart('/'));
27 if (buff != null)
28 {
29 // Checking: if a resource is found in the archive, then return it as a Response
30 context.Response = new ResponseMessage(HttpStatusCode.OK)
31 {
32 Content = new ByteArrayContent(buff)
33 };
34 context.Response.Headers.ContentType.MediaType = MimeType.FromFileExtension(context.Request.RequestUri.Pathname);
35 }
36 else
37 {
38 context.Response = new ResponseMessage(HttpStatusCode.NotFound);
39 }
40
41 // Call the next message handler in the chain
42 Next(context);
43 }
44 }
Рассмотрим поближе фрагмент кода:
Пользовательский ZipArchiveMessageHandler должен наследоваться от базового класса MessageHandler. Он имеет две переменные: архив и строковое представление пути к архиву. Наследование от IDisposable необходимо для обеспечения механизма детерминированного освобождения неуправляемых ресурсов.
Обработчик сообщений имеет концепцию фильтрации. В этом случае добавляется фильтр протокола (схемы), этот обработчик сообщений будет работать только с протоколом
"zip"
.Фильтрация сообщений по ресурсному протоколу реализована с помощью класса ProtocolMessageFilter. Конструктор ProtocolMessageFilter() инициализирует новый экземпляр класса ProtocolMessageFilter. Он принимает протоколы
"zip"
в качестве параметра.Метод Invoke() реализует поведение обработчика сообщений. Он вызывается для каждого обработчика в конвейере и принимает context в качестве параметра. Метод GetFile() определяет логику метода Invoke(). Он реализует цепочку обязанностей, после которой вызывается следующий обработчик Next(
context
).Метод GetFile() реализует поиск данных в виде байтового массива в zip-архиве на основе Request и формирует Response.
context
предоставляет контекстную информацию для сетевых служб, через него проходит сущность операции и возвращается результат операции. В Aspose.HTML context реализуется интерфейсом INetworkOperationContext, который имеет два свойства (параметра) – Request и Response.
Определите методы GetFile(), GetArchive() и Dispose()
1using System.IO;
2using Aspose.Zip;
3...
4
5 byte[] GetFile(string path)
6 {
7 path = path.Replace(@"\", @"/");
8 var result = GetArchive().Entries.FirstOrDefault(x => path == x.Name);
9 if (result != null)
10 {
11 using (var fs = result.Open())
12 using (MemoryStream ms = new MemoryStream())
13 {
14 fs.CopyTo(ms);
15 return ms.ToArray();
16 }
17 }
18 return null;
19 }
20
21 Archive GetArchive()
22 {
23 return archive ??= new Archive(filePath);
24 }
25
26 public void Dispose()
27 {
28 archive?.Dispose();
29 }
Добавьте ZipArchiveMessageHandler в конвейер
Ключевой концепцией работы обработчиков сообщений является объединение их в цепочку, и теперь вам нужно добавить ZipArchiveMessageHandler в конвейер. Конструктор Configuration() создает экземпляр класса
Configuration. После создания конфигурации вызываются методы GetServicezip
и добавляет ZipArchiveMessageHandler в конец коллекции обработчиков сообщений.
1using System;
2using Aspose.Html;
3using Aspose.Html.Net;
4using Aspose.Html.Rendering.Image;
5using Aspose.Html.Services;
6...
7
8 // Prepare path to a source zip file
9 string documentPath = Path.Combine(DataDir, "test.zip");
10
11 // Prepare path for converted file saving
12 string savePath = Path.Combine(OutputDir, "zip-to-jpg.jpg");
13
14 // Create an instance of ZipArchiveMessageHandler
15 using var zip = new ZipArchiveMessageHandler(documentPath);
16
17 // Create an instance of the Configuration class
18 using var configuration = new Configuration();
19
20 // Add ZipArchiveMessageHandler to the chain of existing message handlers
21 configuration
22 .GetService<INetworkService>()
23 .MessageHandlers.Add(zip);
24
25 // Initialize an HTML document with specified configuration
26 using var document = new HTMLDocument("zip:///test.html", configuration);
27
28 // Create an instance of Rendering Options
29 var options = new ImageRenderingOptions()
30 {
31 Format = ImageFormat.Jpeg
32 };
33
34 // Create an instance of Image Device
35 using var device = new ImageDevice(options, savePath);
36
37 // Render HTML to JPG
38 document.RenderTo(device);
В примере ZIP-архив (test.zip) содержит HTML-документ (test.html), в котором все связанные ресурсы имеют пути относительно HTML-документа.
Примечание. Конструктор
HTMLDocument(address, configuration
) принимает абсолютный путь к ZIP-архиву. Но все связанные ресурсы имеют относительные пути в документе HTML и в коде примера.
Для получения дополнительной информации о том, как преобразовать HTML в JPG с помощью метода
Renderto(device
), пожалуйста, прочитайте
Fine-Tuning Converters.
Aspose.HTML предлагает бесплатный онлайн Конвертер ZIP в JPG, который конвертирует HTML из ZIP-архива в JPG с высоким качеством, легко и быстро. Просто загрузите, конвертируйте свои файлы и получите результат за несколько секунд!