Comment ajouter des formes de dessin aux documents Word dans .NET
Ce guide montre comment ajouter du contenu à la couche de dessin d’un document Word avec Aspose.Words FOSS pour .NET: insérer un AutoShape, ajouter une image, le positionner et faire le texte l’envelopper, le remplir et le styliser, regrouper plusieurs formes et définir un filigrane. Aspose.Words FOSS pour .NET est disponible via NuGet ou en le compilant à partir du code source.
Guide étape par étape
Étape 1: obtenir la bibliothèque
Clonez le dépôt et compilez Aspose.Words.sln en configuration Release, puis ajoutez une référence de projet à Aspose.Words.csproj de votre propre projet .NET, comme décrit dans le Guide d’installation. Ajoutez using Aspose.Words; and using Aspose.Words.Drawing; en haut de tout fichier qui travaille avec des formes.
Étape 2: ajouter un AutoShape
Construisez une forme directement avec new Shape(doc, shapeType), où shapeType est une valeur ShapeType telle que Rectangle, Ellipse, Star ou TextBox, puis insérez-la dans l’arbre avec DocumentBuilder.InsertNode(node). Shape est la classe concrète et scellée que vous construisez et configurez; elle dérive de l’abstraite ShapeBase, qui définit la position (Left, Top, Width, Height, Rotation) et les sous-objets de mise en forme (Fill, Stroke, ShadowFormat, Glow, Reflection) partagés avec GroupShape.
Étape 3: Ajouter une image
DocumentBuilder.InsertImage est le chemin direct pour les images: les surcharges acceptent un Image, un chemin de fichier, un Stream, ou un tableau d’octets brut, avec d’autres surcharges qui prennent des width/height explicites ou des arguments de positionnement complets (horzPos, left, vertPos, top, width, height, wrapType). La propriété ImageData du Shape résultant contient les données de l’image — appelez ImageData.SetImage(...) pour remplacer l’image, et utilisez CropTop/CropBottom/CropLeft/CropRight, Brightness, Contrast et GrayScale pour des ajustements de base.
Étape 4: Positionner la forme et ajuster le texte
Une forme en ligne (le résultat par défaut de InsertImage) s’écoule avec le texte environnant et ignore les propriétés de positionnement tant qu’elle ne flotte pas — vérifiez IsInline pour confirmer dans quel mode se trouve la forme. Pour faire flotter une forme, définissez WrapType sur une valeur non en ligne et définissez RelativeHorizontalPosition / RelativeVerticalPosition (chacune relative à Page, Margin, Column ou à une ancre similaire) ainsi que les décalages Left/Top. WrapSide contrôle le contour d’ajustement côté spécifique, et HorizontalAlignment / VerticalAlignment gèrent l’alignement relatif simple au lieu de décalages explicites.
Étape 5: Remplir et styliser la forme
Shape.Fill (un objet Fill) peint l’intérieur de la forme: Fill.Solid(color) pour une couleur unie, Fill.OneColorGradient(...) / Fill.TwoColorGradient(...) pour des dégradés, Fill.Patterned(patternType) pour un motif, et Fill.SetImage(...) pour un remplissage d’image — FillType indique laquelle est actuellement active. Le contour provient de la propriété Stroke. Pour les effets, ShadowFormat, Glow (GlowFormat), Reflection (ReflectionFormat) et SoftEdge (SoftEdgeFormat) exposent chacun leurs propres paramètres et une méthode Remove() qui réinitialise l’effet à aucun.
Étape 6: Regrouper plusieurs formes
Combinez plusieurs formes en une seule unité avec DocumentBuilder.InsertGroupShape(shapes), qui renvoie un GroupShape. GroupShape est lui-même un ShapeBase, il possède donc ses propres Fill, ShadowFormat, Glow et Reflection qui s’appliquent à l’ensemble du groupe; déplacez ou redimensionnez le GroupShape plutôt que ses enfants individuels afin que la transformation de coordonnées du groupe reste cohérente. Pour une forme contenant du texte, Shape.TextBox (un objet TextBox) contrôle le remplissage (InternalMarginLeft/Right/Top/Bottom), le redimensionnement automatique (FitShapeToText), la direction du texte (LayoutFlow) et l’alignement vertical (VerticalAnchor).
Étape 7: Ajouter un filigrane
Document.Watermark gère un filigrane unique à l’échelle du document, indépendant de toute forme que vous avez insérée manuellement. Appelez Watermark.SetText(text) ou SetText(text, options) pour un filigrane texte, ou SetImage(...) pour un filigrane image; Watermark.Remove() le supprime, et Watermark.Type rapporte le WatermarkType actuel (Text, Image ou None). TextWatermarkOptions définit FontFamily, FontSize, Color et Layout (WatermarkLayout.Horizontal ou Diagonal); ImageWatermarkOptions définit Scale et IsWashout.
Problèmes courants et solutions
Setting Left/Top sur une forme n’a aucun effet visible. La forme est toujours en ligne (IsInline == true). Définir WrapType à une valeur flottante et définir RelativeHorizontalPosition/RelativeVerticalPosition afin que les propriétés de décalage prennent effet.
Shape.ImageData lance une exception ou ne renvoie rien. La forme n’est pas une forme d’image. Vérifiez Shape.HasImage avant la lecture ImageData.
Les formes enfants d’un groupe ne se déplacent pas ensemble. Les enfants ont été repositionnés individuellement au lieu d’être déplacés via le groupe. Déplacez ou redimensionnez le GroupShape lui-même, de sorte que sa transformation de coordonnées s’applique à chaque enfant.
Le texte du filigrane n’utilise pas la police demandée. Non TextWatermarkOptions a été passé. Appeler Watermark.SetText(text, options) avec un TextWatermarkOptions instance dont le FontFamily est défini.
Foire aux questions
Quelle est la différence entre Shape et ShapeBase?
ShapeBase est la classe de base abstraite partagée par Shape et GroupShape. Écrivez du code contre ShapeBase lorsqu’il doit gérer les deux types de manière uniforme; utilisez Shape directement pour les membres spécifiques à un seul objet de dessin, comme ImageData.
Comment insérer une image avec une taille précise?
Utilisez une surcharge DocumentBuilder.InsertImage qui accepte des arguments explicites width et height, ainsi que la source de l’image (un Image, le chemin du fichier, Stream, ou un tableau d’octets).
Comment faire flotter une forme au lieu qu’elle reste en ligne avec le texte?
Définissez son WrapType sur une valeur non en ligne et réglez RelativeHorizontalPosition / RelativeVerticalPosition de sorte que les décalages Left/Top soient interprétés par rapport à la page, à la marge ou à la colonne.
Un document peut-il avoir à la fois un filigrane texte et un filigrane image?
No. Document.Watermark.Type indique le type actuel du filigrane; appeler SetText ou SetImage à nouveau remplace le filigrane qui était précédemment défini.
Comment puis-je supprimer une ombre ou un reflet d’une forme?
Appelez Remove() sur l’objet de mise en forme correspondant — Shape.ShadowFormat.Remove() ou Shape.Reflection.Remove().