openxml
Insérer une image dans une "forme en ligne" intégrée dans des documents Word
Recherche…
Introduction
Insérez une image dans un document MS Word, par exemple des rectangles et des ovales.
Cette documentation suppose que vous savez comment insérer une image dans un document Word, ouvrir et fermer un document Word à l'aide d'OpenXML.
Ajoutez les espaces de noms OpenXML suivants à votre classe
using System;
using System.Collections.Generic;
using System.Linq;
using DocumentFormat.OpenXml;
using A = DocumentFormat.OpenXml.Drawing;
using DW = DocumentFormat.OpenXml.Drawing.Wordprocessing;
using PIC = DocumentFormat.OpenXml.Drawing.Pictures;
using DocumentFormat.OpenXml.Drawing.Wordprocessing;
using Wps = DocumentFormat.OpenXml.Office2010.Word.DrawingShape;
Ouvrez le document et ajoutez l'objet imagePart pour référencer l'image que vous souhaitez insérer dans la forme.
Maintenant, ouvrez le document en utilisant OpenXML, vous devez ajouter une imagePart qui référence l'objet image à l'objet MainDocumentPart en utilisant un flux de fichiers et obtenir l'ID de l'image
string temp;
MainDocumentPart mainPart = document.MainDocumentPart;
ImagePart imagePart = mainPart.AddImagePart(ImagePartType.Bmp);
using (FileStream stream = new FileStream(barcodepath, FileMode.Open))
{
imagePart.FeedData(stream);
}
temp = mainPart.GetIdOfPart(imagePart);
Obtenir une référence d'un objet Blip
Au bureau OpenXML, une image insérée dans un document Word est considérée comme un objet ou un élément "Blip". La classe est dérivée de DocumentFormat.OpenXml.Drawing the Blip doit avoir une valeur Embed qui est un ID imagePart. L'objet Blip se trouve alors dans un objet / élément BlipFill , qui entre également dans un objet / élément graphicData et qui, à son tour, entre dans un élément d'objet graphique . Je suis à peu près sûr que vous vous êtes rendu compte que tout fonctionne comme un arbre XML. Exemple d'arborescence XML ouverte ci-dessous.
<a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
<a:graphicData uri="http://schemas.microsoft.com/office/word/2010/wordprocessingShape">
<wps:wsp>
<wps:cNvSpPr>
<a:spLocks noChangeArrowheads="1" />
</wps:cNvSpPr>
<wps:spPr bwMode="auto">
<a:xfrm>
<a:off x="0" y="0" />
<a:ext cx="1234440" cy="1234440" />
</a:xfrm>
<a:prstGeom prst="roundRect">
<a:avLst>
<a:gd name="adj" fmla="val 16667" />
</a:avLst>
</a:prstGeom>
<a:blipFill dpi="0" rotWithShape="1">
<a:blip r:embed="Raade88ffea8d4c1b" />
<a:stretch>
<a:fillRect l="10000" t="10000" r="10000" b="10000" />
</a:stretch>
</a:blipFill>
</wps:spPr>
<wps:bodyPr rot="0" vert="horz" wrap="square" lIns="91440" tIns="45720" rIns="91440" bIns="45720" anchor="t" anchorCtr="0" upright="1">
<a:noAutofit />
</wps:bodyPr>
</wps:wsp>
</a:graphicData>
</a:graphic>
Ajout de la référence de l'image aux formes du document modèle.
Maintenant, vous avez une référence de l'image. Insérez l'image dans les formes du document modèle. Pour ce faire, vous devrez utiliser LINQ pour parcourir le document et obtenir une référence à toutes les formes du document. L'élément wps: spPr que vous voyez dans le code XML ci-dessus est l'élément xml des formes d'un document. La classe C # équivalente est WordprocessingShape
IEnumerable<DocumentFormat.OpenXml.Office2010.Word.DrawingShape.WordprocessingShape> shapes2 = document.MainDocumentPart.document.Body.Descendants<DocumentFormat.OpenXml.Office2010.Word.DrawingShape.WordprocessingShape>();
Avec une référence de collection de toutes les formes, parcourez la collection en boucle.
Maintenant que vous avez une collection de toutes les références de forme dans le document. Faites une boucle dans la collection avec un foreach, et à travers chaque itération, créez un objet Blip. Définissez la valeur d'intégration d'objet Blip sur la référence d'ID d'image que vous avez capturée précédemment dans la partie d'image. Créez également un objet Stretch et un objet FillRectangle (ceux-ci ne sont pas vraiment nécessaires, ils ne sont utilisés que pour un alignement correct de l'image). Et ajoutez chacun à son objet parent comme l'équivalent d'arborescence XML.
foreach (DocumentFormat.OpenXml.Office2010.Word.DrawingShape.WordprocessingShape sp in shapes2)
{
//Wps.ShapeProperties shapeProperties1 =
A.BlipFill blipFill1 = new A.BlipFill() { Dpi = (UInt32Value)0U, RotateWithShape = true };
A.Blip blip1 = new A.Blip() { Embed = temp };
A.Stretch stretch1 = new A.Stretch();
A.FillRectangle fillRectangle1 = new A.FillRectangle() { Left = 10000, Top = 10000, Right = 10000, Bottom = 10000 };
Wps.WordprocessingShape wordprocessingShape1 = new Wps.WordprocessingShape();
stretch1.Append(fillRectangle1);
blipFill1.Append(blip1);
blipFill1.Append(stretch1);
Wps.ShapeProperties shapeProperties1 = sp.Descendants<Wps.ShapeProperties>().First();
shapeProperties1.Append(blipFill1);
}