Получить изображения из документа Word .docx

Сценарий

В этой статье вы узнаете, как составить веб-приложение ASP.NET для получения всех изображений из документа формата Microsoft Docx.

Подготовка веб-приложения ASP.NET

Используя Visual Studio, создайте простое веб-приложение ASP.NET Core с помощью Razor Pages. Используя диспетчер пакетов NuGet, найдите два пакета для вашего проекта: Aspose.Zip для распаковки и Aspose.Imaging для проверки образа.
Найдите страницу Index.cshtml в обозревателе решений. Теперь добавьте форму на эту страницу с атрибутом enctype=“multipart/form-data” в теге

. Необходимо было перенести документ Word на веб-сервер. Затем добавьте поле ввода типа «файл» для загруженного файла docx. Вот полная HTML-разметка формы:

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>

Для удобства пользователя были добавлены атрибуты Accept.

Структура документа

Docx documet сам по себе представляет собой zip-архив. Если в нем есть встроенные изображения, после извлечения они располагаются в папке «word/media». Итак, пользователь предоставляет файл docx и отправляет форму. На стороне сервера нам нужно создать соответствующий метод OnPost для источника Index.cshtml.cs. В рамках этого метода мы извлекаем zip-архив с помощью соответствующего конструктора. Вот проект метода:

 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    }

Модель страницы и рендеринг изображений

После извлечения нам нужно убедиться, что извлеченная запись на самом деле является изображением. Для этой цели мы можем использовать метод Image.CanLoad. Если он одобряет допустимое изображение, нам нужно сохранить его байты в модели страницы, чтобы отобразить это изображение. Добавить свойство public List<byte[]> ImageBytes {get; частный набор; } в IndexModel. Мы заполняем этот список извлеченными байтами изображения. Чтобы показать их на веб-странице, мы используем URI данных с преобразованием байтов изображения в строку base64. Вот код рендеринга Razor в 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    }

Завершение ответа

Итак, соберите все это вместе. Каждая запись архива распаковывается, затем из этих байтов формируется образ.
В этом примере мы не проверяем файл пользователя. В реальных приложениях вам следует проверить загруженный архив и его содержимое.
Ниже приведен последний метод OnPost.

 1public void OnPost (IFormFile uploadedFile)
 2{
 3    ImageBytes = новый список<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.