Récupérer des images à partir d'un document Word .docx
Scénario
Cet article vous apprend à composer une application Web ASP.NET pour récupérer toutes les images d’un document au format Microsoft Docx.
Préparer l’application Web ASP.NET
À l’aide de Visual Studio, composez une application Web ASP.NET Core simple avec Razor Pages.
À l’aide de NuGet Package Manager, référez-vous à deux packages pour votre projet :
Aspose.Zip pour la décompression et
Aspose.Imaging pour la vérification de l’image.
Recherchez la page « Index.cshtml » dans votre Explorateur de solutions. Maintenant, ajoutez un formulaire à cette page avec l’attribut enctype="multipart/form-data"
dans la balise <form>
. Il fallait transférer le document Word vers le serveur Web. Ensuite, ajoutez un champ de saisie de type « fichier » pour le fichier docx téléchargé.
Voici le balisage HTML complet du formulaire :
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>
Les attributs « Accepter » ont été ajoutés pour la commodité de l’utilisateur.
Structure Docx
Docx documet est lui-même une archive zip. S’il contient des images intégrées, elles se trouvent dans le dossier « word/media » après l’extraction. Ainsi, l’utilisateur fournit le fichier docx et soumet le formulaire. Côté serveur, nous devons composer une méthode OnPost
appropriée pour la source Index.cshtml.cs
. Dans cette méthode, nous extrayons
l’archive zip en utilisant
le constructeur approprié. Voici le brouillon de la méthode :
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 }
Modèle de page et rendu d’image
Après l’extraction, nous devons vérifier que l’entrée extraite est bien une image. Pour cela, nous pouvons utiliser la méthode
Image.CanLoad. S’il approuve l’image valide, nous devons en stocker des octets dans le modèle de page pour restituer cette image. Ajoutez la propriété public List<byte[]> ImageBytes { get; ensemble privé; }
à IndexModel
.
Nous remplissons cette liste avec les octets d’images extraits. Pour les afficher sur la page Web, nous utilisons
data URI avec conversion des octets d’image en chaîne base64.
Voici un code Razor de rendu sur 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 }
Réponse finale
Alors, mettez tout cela ensemble. Chaque entrée de l’archive a été décompressée, puis une image composée à partir de ces octets.
Nous ne validons pas le fichier utilisateur dans cet exemple. Dans les applications réelles, vous devez vérifier une archive téléchargée et son contenu.
Vous trouverez ci-dessous la méthode finale OnPost
.
1public void OnPost (IFormFile fichier téléchargé)
2{
3 ImageBytes = new List<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}