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