Bonjour,
Je cherche comment changer l'image d'un ContentControl Word. Je sais le faire via les dll d'interop d'office mais pour des raisons techniques je ne peux les utiliser.
J'utilise donc la classe Package contenu dans System.IO.Packaging. Via cette méthode je peux changer l'image qui est contenu dans le dossier /word/media du docx.
Mais quand j'ouvre le fichier docx, Word continu à m'afficher l'ancienne image alors que cette dernières n'existe plus vue qu'elle a été écrasé par la nouvelle.
Quelqu'un saurais comment faire en sorte que Word m'affiche bien la nouvelle ?
Voici mon Code :
Les méthodes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 //iPath contient le chemin vers ma nouvelle image et path contient le chemin vers le docx Stream stm = new FileStream(iPath, FileMode.Open); //overture du package en lecture/écriture Package officePackage = Package.Open(path, FileMode.Open, FileAccess.ReadWrite); //type de contenu pour la partie principale const String officeDocRelType = @"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"; PackagePart mainPart = null; Uri documentUri = null; //on récupère la partie contenant les propriétés foreach (PackageRelationship relationship in officePackage.GetRelationshipsByType(officeDocRelType)) { // Il n'y a qu'une seule partie de type partType dans le package documentUri = PackUriHelper.ResolvePartUri(new Uri("/", UriKind.Relative), relationship.TargetUri); mainPart = officePackage.GetPart(documentUri); //On récupère toutes les relations de type image List<PackagePart> imagePackagePart = this.GetImagePackagePart(mainPart, officePackage); foreach (PackagePart imagePart in imagePackagePart) { //On vérifie si le nom du fichier image est "CustomerLogo" if (Path.GetFileNameWithoutExtension( imagePart.Uri.ToString()).Equals("CustomerLogo")) { this.ReplaceStream(stm, imagePart.GetStream()); } } break; } //fermeture du package officePackage.Close();
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 private List<PackagePart> GetImagePackagePart(PackagePart mainPart, Package officePackage) { const String imageRelType = @"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image"; List<PackagePart> listePackageParts = new List<PackagePart>(); Uri imageUri = null; //on récupère les parties correspondantes aux images. Les images sont relatives à la mainPart foreach (PackageRelationship relationship in mainPart.GetRelationshipsByType(imageRelType)) { //relationship.TargetUri contient media/image1.jpg (par exemple) imageUri = PackUriHelper.ResolvePartUri(new Uri(mainPart.Uri.ToString(), UriKind.Relative), relationship.TargetUri); listePackageParts.Add(officePackage.GetPart(imageUri)); } return listePackageParts; } private void ReplaceStream(Stream source, Stream target) { const int bufSize = 0x1000; // const int bufSize = 1024; byte[] buf = new byte[bufSize]; int bytesRead = 0; while ((bytesRead = source.Read(buf, 0, bufSize)) > 0) { target.Write(buf, 0, (int)bytesRead); } source.Close(); target.Close(); }
Partager