Como Adicionar Formas de Desenho a Documentos Word no .NET

Como Adicionar Formas de Desenho a Documentos Word no .NET

Este guia mostra como adicionar conteúdo à camada de desenho de um documento Word com Aspose.Words FOSS para .NET: inserir um AutoShape, adicionar uma imagem, posicioná-la e envolver o texto ao seu redor, preenchê-la e estilizar, agrupar várias formas e definir uma marca d’água. Aspose.Words FOSS para .NET está disponível via NuGet ou compilando a partir do código-fonte.

Guia Passo a Passo

Etapa 1: Obter a Biblioteca

Clone o repositório e compile Aspose.Words.sln na configuração Release, então adicione uma referência de projeto a Aspose.Words.csproj do seu próprio projeto .NET, conforme descrito no Guia de Instalação. Adicione using Aspose.Words; and using Aspose.Words.Drawing; no topo de qualquer arquivo que trabalhe com formas.


Etapa 2: Adicionar um AutoShape

Construa uma forma diretamente com new Shape(doc, shapeType), onde shapeType é um valor ShapeType como Rectangle, Ellipse, Star ou TextBox, então insira-a na árvore com DocumentBuilder.InsertNode(node). Shape é a classe concreta e selada que você constrói e configura; ela deriva da classe abstrata ShapeBase, que define a posição (Left, Top, Width, Height, Rotation) e os sub-objetos de formatação (Fill, Stroke, ShadowFormat, Glow, Reflection) compartilhados com GroupShape.


Etapa 3: Adicionar uma Imagem

DocumentBuilder.InsertImage é a rota direta para imagens: as sobrecargas aceitam um Image, um caminho de arquivo, um Stream ou um array de bytes bruto, com outras sobrecargas que recebem width/height explícitos ou argumentos de posicionamento completos (horzPos, left, vertPos, top, width, height, wrapType). A propriedade ImageData do Shape resultante contém os dados da imagem — chame ImageData.SetImage(...) para trocar a imagem, e use CropTop/CropBottom/CropLeft/CropRight, Brightness, Contrast e GrayScale para ajustes básicos.


Etapa 4: Posicionar a Forma e Ajustar Texto

Uma forma inline (o resultado padrão de InsertImage) flui com o texto ao redor e ignora propriedades de posicionamento até que seja flutuada — verifique IsInline para confirmar em qual modo a forma está. Para flutuar uma forma, defina WrapType para um valor não inline e ajuste RelativeHorizontalPosition / RelativeVerticalPosition (cada um relativo a Page, Margin, Column ou um âncora semelhante) juntamente com os deslocamentos Left/Top. WrapSide controla o ajuste específico de lado, e HorizontalAlignment / VerticalAlignment tratam do alinhamento relativo simples em vez de deslocamentos explícitos.


Etapa 5: Preencher e Estilizar a Forma

Shape.Fill (um objeto Fill) pinta o interior da forma: Fill.Solid(color) para uma cor sólida, Fill.OneColorGradient(...) / Fill.TwoColorGradient(...) para gradientes, Fill.Patterned(patternType) para um padrão e Fill.SetImage(...) para preenchimento com imagem — FillType indica qual está atualmente ativo. O contorno vem da propriedade Stroke. Para efeitos, ShadowFormat, Glow (GlowFormat), Reflection (ReflectionFormat) e SoftEdge (SoftEdgeFormat) expõem suas próprias configurações e um método Remove() que limpa o efeito, retornando a nenhum.


Etapa 6: Agrupar Várias Formas

Combine várias formas em uma única unidade com DocumentBuilder.InsertGroupShape(shapes), que retorna um GroupShape. GroupShape é ele próprio um ShapeBase, portanto possui seus próprios Fill, ShadowFormat, Glow e Reflection que se aplicam ao grupo como um todo; mova ou redimensione o GroupShape em vez de seus filhos individuais para que a transformação de coordenadas do grupo permaneça consistente. Para uma forma que contém texto, Shape.TextBox (um objeto TextBox) controla o preenchimento (InternalMarginLeft/Right/Top/Bottom), o dimensionamento automático (FitShapeToText), a direção do texto (LayoutFlow) e o alinhamento vertical (VerticalAnchor).


Etapa 7: Adicionar uma Marca d’água

Document.Watermark gerencia uma única marca d’água em todo o documento, independente de qualquer forma que você tenha inserido manualmente. Chame Watermark.SetText(text) ou SetText(text, options) para uma marca d’água de texto, ou SetImage(...) para uma marca d’água de imagem; Watermark.Remove() a limpa, e Watermark.Type informa o WatermarkType atual (Text, Image ou None). TextWatermarkOptions define FontFamily, FontSize, Color e Layout (WatermarkLayout.Horizontal ou Diagonal); ImageWatermarkOptions define Scale e IsWashout.

Problemas Comuns e Soluções

Setting Left/Top em uma forma não tem efeito visível. A forma ainda está inline (IsInline == true). Defina WrapType para um valor flutuante e defina RelativeHorizontalPosition/RelativeVerticalPosition para que as propriedades de deslocamento tenham efeito.

Shape.ImageData lança ou não retorna nada. A forma não é uma forma de imagem. Verifique Shape.HasImage antes de ler ImageData.

Os shapes filhos de um grupo não se movem juntos. Os filhos foram reposicionados individualmente em vez de através do grupo. Mova ou redimensione o GroupShape por si mesmo, de modo que sua transformação de coordenadas se aplique a todos os filhos.

O texto da marca d’água não usa a fonte solicitada. Não TextWatermarkOptions foi passado. Chame Watermark.SetText(text, options) com um TextWatermarkOptions instância cuja FontFamily está definida.

Perguntas Frequentes

Qual é a diferença entre Shape e ShapeBase?

ShapeBase é a classe base abstrata compartilhada por Shape e GroupShape. Escreva código contra ShapeBase quando ele deve lidar com qualquer tipo de forma uniformemente; use Shape diretamente para membros específicos de um único objeto de desenho, como ImageData.

Como insiro uma imagem com um tamanho específico?

Use uma sobrecarga de DocumentBuilder.InsertImage que aceita argumentos explícitos de width e height, juntamente com a origem da imagem (um Image, caminho de arquivo, Stream ou array de bytes).

Como faço uma forma flutuar em vez de ficar em linha com o texto?

Defina seu WrapType para um valor não em linha e ajuste RelativeHorizontalPosition / RelativeVerticalPosition para que os deslocamentos Left/Top sejam interpretados em relação à página, margem ou coluna.

Um documento pode ter simultaneamente uma marca d’água de texto e uma de imagem?

No. Document.Watermark.Type relata o tipo de marca d’água atual; chamar SetText ou SetImage novamente substitui qualquer marca d’água que tenha sido definida anteriormente.

Como remover uma sombra ou reflexão de uma forma?

Chame Remove() no objeto de formatação correspondente — Shape.ShadowFormat.Remove() ou Shape.Reflection.Remove().

Ver também

 Português