Recuperar imágenes de un documento de Word .docx

Guión

Este artículo le enseña cómo crear una aplicación web ASP.NET para recuperar todas las imágenes de un documento en formato Microsoft Docx.

Preparar la aplicación web ASP.NET

Usando Visual Studio, cree una aplicación web ASP.NET Core simple con Razor Pages. Usando el Administrador de paquetes NuGet, consulte dos paquetes para su proyecto: Aspose.Zip para descompresión y Aspose.Imaging para verificación de imágenes.
Busque la página Index.cshtml dentro de su Explorador de soluciones. Ahora, agregue un formulario a esa página con el atributo enctype="multipart/form-data" dentro de la etiqueta <form>. Necesitaba transferir un documento de Word al servidor web. Luego, agregue un campo de entrada de tipo “archivo” para el archivo docx cargado. Aquí está el marcado HTML completo para el formulario:

1<form method="post" enctype="multipart/form-data">
2    <span>Microsoft *.docx document: </span>
3    <input type="file" name="uploadedFile" required="required" accept=".docx" />   
4    <br />
5    <input type="submit" value="Upload" />
6</form>

Se han agregado atributos “Aceptar” para comodidad del usuario.

Estructura Docx

Docx documet es un archivo zip en sí mismo. Si tiene imágenes incrustadas, se ubican en la carpeta ‘word/media’ después de la extracción. Entonces, el usuario proporciona el archivo docx y envía el formulario. En el lado del servidor necesitamos componer un método OnPost apropiado para la fuente Index.cshtml.cs. Dentro de este método extraemos archivo zip usando el constructor apropiado. Aquí está el borrador del método:

 1    public void OnPost(IFormFile uploadedFile) {
 2        using (Archive archive = new Archive(uploadedFile.OpenReadStream())) {
 3            using (Archive archive = new Archive(uploadedFile.OpenReadStream()))
 4            {
 5                foreach (var entry in archive.Entries.Where(e => e.Name.StartsWith(@"word/media", StringComparison.InvariantCultureIgnoreCase)))
 6                {
 7                ...
 8                }
 9            }	
10        }
11    }

Modelo de página y representación de imágenes

Después de la extracción, debemos verificar que la entrada extraída sea en realidad una imagen. Para ello podemos utilizar el método Image.CanLoad. Si aprueba la imagen válida, necesitamos almacenar bytes dentro del modelo de página para representar esa imagen. Agregue la propiedad Lista pública<byte[]> ImageBytes { get; conjunto privado; } a Modelo de índice. Llenamos esta lista con bytes de imágenes extraídas. Para mostrarlos en la página web utilizamos URI de datos con conversión de bytes de imagen a cadena base64. Aquí hay una representación del código Razor en Index.cshtml

1    @{
2    if (Model.ImageBytes != null && Model.ImageBytes.Count > 0) {
3            <h4>Images within document:</h4>
4            foreach (byte[] image in Model.ImageBytes) {
5                <img src="data:image;base64,@Convert.ToBase64String(image)"/>
6            }
7        }
8    }

Respuesta final

Así que ponlo todo junto. Se ha descomprimido cada entrada del archivo y luego se ha creado una imagen a partir de estos bytes.
No validamos el archivo de usuario en esta muestra. En aplicaciones del mundo real, debes verificar un archivo cargado y su contenido.
A continuación se muestra el método OnPost final.

 1público vacío OnPost (IFormFile uploadedFile)
 2{
 3    ImageBytes = nueva Lista<byte[]>();
 4
 5    using (Archive archive = new Archive(uploadedFile.OpenReadStream()))
 6    {
 7        foreach (var entry in archive.Entries.Where(e => e.Name.StartsWith(@"word/media", StringComparison.InvariantCultureIgnoreCase)))
 8        {
 9            using (MemoryStream extracted = new MemoryStream())
10            {
11                entry.Open().CopyTo(extracted);
12                extracted.Seek(0, SeekOrigin.Begin);
13
14                if (Aspose.Imaging.Image.CanLoad(extracted))
15                    ImageBytes.Add(extracted.ToArray());
16             }
17         }
18     }
19}
Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.