Come aggiungere forme di disegno ai documenti Word in .NET
Questa guida mostra come aggiungere contenuti al livello di disegno di un documento Word con Aspose.Words FOSS per .NET: inserire un AutoShape, aggiungere un’immagine, posizionarla e avvolgere il testo attorno, riempirla e stilizzarla, raggruppare più forme e impostare un filigrana. Aspose.Words FOSS per .NET è disponibile tramite NuGet o compilando dal sorgente.
Guida passo passo
Passo 1: Ottieni la libreria
Clona il repository e compila Aspose.Words.sln in configurazione Release, quindi aggiungi un riferimento al progetto a Aspose.Words.csproj dal tuo progetto .NET personale, come descritto nel Guida all’installazione. Aggiungi using Aspose.Words; and using Aspose.Words.Drawing; all’inizio di qualsiasi file che lavora con le forme.
Passo 2: Aggiungi un AutoShape
Costruisci una forma direttamente con new Shape(doc, shapeType), dove shapeType è un valore ShapeType come Rectangle, Ellipse, Star o TextBox, quindi inseriscila nell’albero con DocumentBuilder.InsertNode(node). Shape è la classe concreta e sealed che costruisci e configuri; deriva dalla classe abstract ShapeBase, che definisce la posizione (Left, Top, Width, Height, Rotation) e gli oggetti di formattazione secondari (Fill, Stroke, ShadowFormat, Glow, Reflection) condivisi con GroupShape.
Passo 3: Aggiungi un’immagine
DocumentBuilder.InsertImage è il percorso diretto per le immagini: le overload accettano un Image, un percorso file, un Stream, o un array di byte grezzo, con ulteriori overload che prendono espliciti width/height o argomenti di posizionamento completi (horzPos, left, vertPos, top, width, height, wrapType). Il Shape risultante ha la proprietà ImageData che contiene i dati dell’immagine — chiama ImageData.SetImage(...) per sostituire l’immagine, e usa CropTop/CropBottom/CropLeft/CropRight, Brightness, Contrast, e GrayScale per aggiustamenti di base.
Passo 4: Posiziona la forma e avvolgi il testo
Una forma in linea (il risultato predefinito di InsertImage) fluisce con il testo circostante e ignora le proprietà di posizionamento finché non galleggia — controlla IsInline per confermare in quale modalità si trovi una forma. Per far galleggiare una forma, imposta WrapType su un valore non in linea e imposta RelativeHorizontalPosition / RelativeVerticalPosition (ognuno relativo a Page, Margin, Column, o a un ancoraggio simile) insieme agli offset Left/Top. WrapSide controlla l’avvolgimento specifico per lato, e HorizontalAlignment / VerticalAlignment gestiscono l’allineamento relativo semplice invece degli offset espliciti.
Passo 5: Riempire e stilizzare la forma
Shape.Fill (un oggetto Fill) dipinge l’interno della forma: Fill.Solid(color) per un colore piatto, Fill.OneColorGradient(...) / Fill.TwoColorGradient(...) per gradienti, Fill.Patterned(patternType) per un motivo, e Fill.SetImage(...) per un riempimento immagine — FillType indica quale è attualmente attivo. Il contorno proviene dalla proprietà Stroke. Per gli effetti, ShadowFormat, Glow (GlowFormat), Reflection (ReflectionFormat), e SoftEdge (SoftEdgeFormat) espongono ciascuno le proprie impostazioni e un metodo Remove() che cancella l’effetto riportandolo a nessuno.
Passo 6: Raggruppa più forme
Combina diverse forme in un’unica unità con DocumentBuilder.InsertGroupShape(shapes), che restituisce un GroupShape. GroupShape è esso stesso un ShapeBase, quindi porta i propri Fill, ShadowFormat, Glow, e Reflection che si applicano all’intero gruppo; sposta o ridimensiona il GroupShape invece dei suoi singoli figli così la trasformazione delle coordinate del gruppo rimane coerente. Per una forma che contiene testo, Shape.TextBox (un oggetto TextBox) controlla il padding (InternalMarginLeft/Right/Top/Bottom), il dimensionamento automatico (FitShapeToText), la direzione del testo (LayoutFlow), e l’allineamento verticale (VerticalAnchor).
Passo 7: Aggiungi una filigrana
Document.Watermark gestisce una singola filigrana a livello di documento indipendente da qualsiasi forma inserita manualmente. Chiama Watermark.SetText(text) o SetText(text, options) per una filigrana di testo, o SetImage(...) per una filigrana immagine; Watermark.Remove() la rimuove, e Watermark.Type restituisce l’attuale WatermarkType (Text, Image, o None). TextWatermarkOptions imposta FontFamily, FontSize, Color, e Layout (WatermarkLayout.Horizontal o Diagonal); ImageWatermarkOptions imposta Scale e IsWashout.
Problemi comuni e soluzioni
Setting Left/Top su una forma non ha alcun effetto visibile. La forma è ancora inline (IsInline == true). Imposta WrapType a un valore floating e imposta RelativeHorizontalPosition/RelativeVerticalPosition in modo che le proprietà di offset abbiano effetto.
Shape.ImageData lancia o non restituisce nulla. La forma non è una forma immagine. Controlla Shape.HasImage prima della lettura ImageData.
Le forme figlio di un gruppo non si muovono insieme. I figli sono stati riposizionati individualmente invece che tramite il gruppo. Sposta o ridimensiona il GroupShape se stessa, così la sua trasformazione di coordinate si applica a ogni figlio.
Il testo del filigrana non utilizza il font richiesto. No TextWatermarkOptions è stato passato. Chiama Watermark.SetText(text, options) con un TextWatermarkOptions istanza la cui FontFamily è impostata.
Domande frequenti
Qual è la differenza tra Shape e ShapeBase?
ShapeBase è la classe base astratta condivisa da Shape e GroupShape. Scrivi codice contro ShapeBase quando deve gestire entrambi i tipi in modo uniforme; usa Shape direttamente per i membri specifici di un singolo oggetto di disegno, come ImageData.
Come inserisco un’immagine con una dimensione specifica?
Usa una sovraccarico di DocumentBuilder.InsertImage che accetta argomenti espliciti width e height, insieme alla sorgente dell’immagine (un Image, percorso file, Stream o array di byte).
Come faccio a far galleggiare una forma invece di farla stare in linea con il testo?
Imposta il suo WrapType a un valore non in linea e imposta RelativeHorizontalPosition / RelativeVerticalPosition in modo che gli offset Left/Top siano interpretati rispetto alla pagina, al margine o alla colonna.
Un documento può avere contemporaneamente sia una filigrana di testo sia una di immagine?
No. Document.Watermark.Type segnala il tipo di filigrana corrente; richiamare SetText o SetImage nuovamente sostituisce qualsiasi filigrana impostata in precedenza.
Come rimuovo un’ombra o un riflesso da una forma?
Chiama Remove() sull’oggetto di formattazione corrispondente — Shape.ShadowFormat.Remove() o Shape.Reflection.Remove().