IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Changer l'image d'un ContentControl Word


Sujet :

C#

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2005
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 150
    Points : 152
    Points
    152
    Par défaut Changer l'image d'un ContentControl Word
    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();          
     
            }

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Août 2005
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 150
    Points : 152
    Points
    152
    Par défaut
    J'ai changé ma façon de faire pour utiliser l'OpenXML SDk 2.0 donc mon code devient :
    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
     
    using wPack = DocumentFormat.OpenXml.Packaging;
     
    wPack.WordprocessingDocument wDoc = wPack.WordprocessingDocument.Open(
                    path, true);
     
                wPack.MainDocumentPart mainPart = wDoc.MainDocumentPart;
     
                #region Document
                foreach (wPack.ImagePart imagePart in mainPart.ImageParts)
                {
                    if (Path.GetFileNameWithoutExtension(
                        imagePart.Uri.ToString()).Equals("CustomerLogo"))
                    {
                        Stream stm = new FileStream(iPath, FileMode.Open);
                        imagePart.FeedData(stm);
                        stm.Close();
                    }
                }
    Mais j'ai aussi le même problème, je change bien mon image (remplace l'ancienne par la nouvelle) mais quand j'ouvre mon docx avec Word, il continu a m'afficher celle que j'ai précédemment chargé via Word ou les Primary Interop assembly.

    Un peu aide SVP, j'arrive pas à croire que personne n'a jamais eu à faire ce genre de chose...

    PS: Sinon, si quelqu'un sait comment faire pour que Word ne nécessite pas une session de lancé je suis preneur, comme ça je retourne sur les dll Interop et on ciao le OpenXML !

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Août 2005
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 150
    Points : 152
    Points
    152
    Par défaut
    Bonjour,

    Après de longue heure de recherche sur le net j'ai enfin trouver un code source sur codeproject permettant de modifier l'image dans un ContentControl. Ce dernier étant buggé (il ne retrouve pas l'id de la relation en fonction du ContentControl mais juste l'id du premier).

    Donc je poste en pièce jointe un Zip contenant le code source modifié et 100% fonctionnel afin que d'autre ne galère pas autant que moi.

    Source: http://www.codeproject.com/KB/office...07_Images.aspx
    Fichiers attachés Fichiers attachés

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [FLASH MX2004] Changer l'image d'un bouton
    Par exe dans le forum Flash
    Réponses: 3
    Dernier message: 05/12/2004, 14h26
  2. [JLabel] changer une image
    Par dadg dans le forum Composants
    Réponses: 5
    Dernier message: 28/09/2004, 10h28
  3. Comment changer l'image Bitmap en fond d'écran du bureau ?
    Par Maddelphi dans le forum API, COM et SDKs
    Réponses: 8
    Dernier message: 23/06/2004, 19h57
  4. changer l'image d'arrière plan du bureau
    Par etenclin dans le forum MFC
    Réponses: 7
    Dernier message: 22/08/2002, 15h54
  5. Changer l'image d'une texture
    Par alltech dans le forum DirectX
    Réponses: 5
    Dernier message: 21/08/2002, 01h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo