Конвертировать HTML из ZIP-архива в PDF – пример С#
В этой статье мы создадим собственный обработчик сообщений для выполнения конкретной задачи – преобразования HTML из ZIP-архива в PDF.
Есть много причин, по которым вам может понадобиться конвертировать HTML из ZIP-архива в формат PDF. PDF имеет много преимуществ, которых нет у других файлов. Например, многие программы и приложения поддерживают PDF-документы, большинство веб-браузеров, таких как Chrome и Firefox, могут отображать PDF-файлы. PDF-файлы оптимизированы для печати; они идеально подходят для создания физических копий ваших документов. PDF поддерживает множество алгоритмов сжатия. Вы можете настроить параметры безопасности для вашего PDF-файла и т. д.
Создайте собственный обработчик сообщений
Aspose.HTML для .NET предлагает функциональные возможности для создания пользовательских обработчиков сообщений. Давайте разработаем собственный обработчик, который мы можем использовать для работы с ZIP-архивами. Выполните следующие действия:
Используйте необходимое пространство имен, которым является Aspose.Html.Net. Это пространство имен представлено классами и интерфейсами, которые отвечают за упрощение сетевой обработки.
Чтобы создать собственный обработчик сообщений, вам необходимо определить собственный класс, который будет производным от класса MessageHandler. Класс MessageHandler представляет базовый тип для обработчиков сообщений. Наследование от IDisposable необходимо для обеспечения механизма детерминированного освобождения неуправляемых ресурсов.
1using Aspose.Html.Net;
2...
3
4 class ZipArchiveMessageHandler : MessageHandler, IDisposable
5 {
6 }
Итак, вы определили свой собственный класс ZipArchiveMessageHandler, теперь вам нужно проделать в нем некоторые операции.
- Инициализируйте экземпляр класса 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
42 Next(context);
43 }
44 }
Давайте внимательно посмотрим на этот фрагмент кода:- Прежде всего, пользовательский ZipArchiveMessageHandler должен наследоваться от базового класса MessageHandler. Он имеет две переменные: архив и строковое представление пути к архиву.
Обработчик сообщений имеет концепцию фильтрации. В этом случае добавляется фильтр протокола (схемы); этот обработчик сообщений будет работать только с протоколом «zip». То есть, если у ресурса протокол “zip”, то он будет обработан ZipArchiveMessageHandler.
Фильтрация сообщений по ресурсному протоколу реализована с помощью класса ProtocolMessageFilter. Конструктор ProtocolMessageFilter() инициализирует новый экземпляр класса ProtocolMessageFilter. Он принимает протоколы
"zip"
в качестве параметра.Метод Invoke() реализует поведение обработчика сообщений. Он вызывается для каждого обработчика в конвейере и принимает «контекст» в качестве параметра. Метод GetFile() определяет логику метода Invoke(). Он реализует цепочку обязанностей, после которой вызывается следующий обработчик Next(
context
). Метод GetFile() реализует поиск данных в виде байтового массива в zip-архиве на основе Request и формирует Response.context
предоставляет контекстную информацию для сетевых служб, через него проходит сущность операции и возвращается результат операции. В Aspose.HTML «контекст» реализуется интерфейсом INetworkOperationContext, который имеет два свойства (параметра) – Request и Response. Request получает или задает сообщение запроса, Response получает или задает ответное сообщение. Запрос содержит информацию для веб-запроса, например, URL-адрес – путь к ресурсу, заголовки и т. д. 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 }
Вы можете скачать полные примеры и файлы данных с GitHub.
Добавьте ZipArchiveMessageHandler в конвейер
Теперь вам нужно добавить ZipArchiveMessageHandler в конвейер. Используйте метод Add(), который принимает объект zip в качестве параметра и добавляет ZipArchiveMessageHandler в конец коллекции обработчиков сообщений.
Свойство INetworkService.MessageHandlers получает список экземпляров MessageHandler, которые будут вызываться как RequestMessage выполняется.
1using System;
2using Aspose.Html;
3using Aspose.Html.Net;
4using Aspose.Html.Rendering.Pdf;
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-pdf.pdf");
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 the PDF Device
29 using var device = new PdfDevice(savePath);
30
31 // Render ZIP to PDF
32 document.RenderTo(device);
В примере ZIP-архив (test.zip) содержит HTML-документ (test.html), в котором все связанные ресурсы имеют пути относительно HTML-документа.
Примечание. Конструктор
HTMLDocument(address, configuration
) принимает абсолютный путь к ZIP-архиву. Но все связанные ресурсы имеют относительные пути в документе HTML и в коде примера.
Прочтите статью
Fine-Tuning Convserters, чтобы узнать больше о преобразовании HTML в PDF с помощью
Renderto(device
).
Aspose.HTML предоставляет бесплатный онлайн-конвертер ZIP to PDF Converter, который позволяет быстро, легко и четко конвертировать ZIP в PDF. Загружайте, конвертируйте файлы и получайте результаты за считанные секунды. Никакого дополнительного программного обеспечения не требуется. Попробуйте наш надежный конвертер ZIP в PDF бесплатно прямо сейчас!