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