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 :
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();
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
 
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();          
 
        }