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