Convertir HTML de un archivo ZIP a JPG – ejemplo de C#

En este artículo, creamos un controlador de mensajes personalizado para realizar una tarea específica: convertir HTML de un archivo ZIP a JPG.

Puede descargar los ejemplos completos de C# y los archivos de datos desde GitHub.

Hay muchas razones por las que necesitarías convertir HTML de un archivo ZIP al formato JPG. Por ejemplo, si desea convertir un documento HTML (XHTML) que contiene recursos vinculados a JPG, debe empaquetar todos estos recursos junto con el documento en un único archivo ZIP y convertirlo a JPG. Aspose.HTML for .NET proporciona funcionalidad para crear controladores de mensajes personalizados para trabajar con archivos ZIP.

Crear un controlador de mensajes personalizado

Aspose.HTML for .NET ofrece funcionalidad para la creación de un controlador de mensajes personalizado. Diseñemos el controlador personalizado que podemos usar para trabajar con archivos ZIP. Tome los siguientes pasos:

  1. Utilice el espacio de nombres necesario, que es Aspose.Html.Net. Este espacio de nombres se presenta mediante clases e interfaces que son responsables de facilitar el procesamiento de la red.

  2. Para crear un controlador de mensajes personalizado, debe definir su propia clase que se derivará de la clase MessageHandler. La clase MessageHandler representa un tipo base para controladores de mensajes.

1using Aspose.Html.Net;
2...
3
4	class ZipArchiveMessageHandler : MessageHandler
5	{
6	}
  1. Anule el método Invoke() de la clase MessageHandler para implementar el comportamiento personalizado del controlador de mensajes.
 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}

Consideremos más de cerca el fragmento de código:

Agregue ZipArchiveMessageHandler a la canalización

El concepto clave del trabajo de los controladores de mensajes es encadenarlos, y ahora necesitaría agregar ZipArchiveMessageHandler en el proceso. El constructor Configuration() crea una instancia de la clase Configuration. Una vez creada la configuración, se invocan los métodos GetService<INetworkService>() y MessageHandlers.Add(). El método Add() toma un objeto zip como parámetro y agrega ZipArchiveMessageHandler al final de la colección de controladores de mensajes.

 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);

En el ejemplo, el archivo ZIP (test.zip) tiene el documento HTML (test.html) en el que todos los recursos relacionados tienen rutas relativas al documento HTML.

Nota: El constructor HTMLDocument(address, configuration) toma la ruta absoluta al archivo ZIP. Pero todos los recursos relacionados tienen rutas relativas en el documento HTML y en el código del ejemplo.

Para obtener más información sobre cómo convertir HTML a JPG usando el método Renderto(device), lea el artículo Ajuste de convertidores.

Puede descargar los ejemplos completos de C# y los archivos de datos desde GitHub.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.