Trabajar con formas
Este tema analiza cómo trabajar mediante programación con formas usando Aspose.Words.
Las formas en Aspose.Words representan un objeto en la capa de dibujo, como una autoforma, un cuadro de texto, una forma libre, un objeto OLE, un control ActiveX o una imagen. Un documento de Word puede contener una o más formas diferentes. Las formas en Aspose.Words están representadas por la clase Shape.
Insertar formas usando el Generador de documentos
Puede insertar una forma en línea con el tipo y tamaño especificados y una forma flotante con la posición, el tamaño y el tipo de ajuste de texto especificados en un documento utilizando el método InsertShape. El método InsertShape permite insertar formas DML en el modelo del documento. El documento debe guardarse en un formato que admita formas DML; de lo contrario, dichos nodos se convertirán a formas VML mientras se guarda el documento.
El siguiente ejemplo de código muestra cómo insertar estos tipos de formas en el documento:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
//Free-floating shape insertion. | |
Shape shape = builder.InsertShape(ShapeType.TextBox, RelativeHorizontalPosition.Page, 100, RelativeVerticalPosition.Page, 100, 50, 50, WrapType.None); | |
shape.Rotation = 30.0; | |
builder.Writeln(); | |
//Inline shape insertion. | |
shape = builder.InsertShape(ShapeType.TextBox, 50, 50); | |
shape.Rotation = 30.0; | |
OoxmlSaveOptions so = new OoxmlSaveOptions(SaveFormat.Docx); | |
// "Strict" or "Transitional" compliance allows to save shape as DML. | |
so.Compliance = OoxmlCompliance.Iso29500_2008_Transitional; | |
dataDir = dataDir + "Shape_InsertShapeUsingDocumentBuilder_out.docx"; | |
// Save the document to disk. | |
doc.Save(dataDir, so); |
Establecer relación de aspecto bloqueada
Usando Aspose.Words, puede especificar si la relación de aspecto de la forma está bloqueada a través de la propiedad AspectRatioLocked.
El siguiente ejemplo de código muestra cómo trabajar con la propiedad AspectRatioLocked:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
var shape = builder.InsertImage(dataDir + "Test.png"); | |
shape.AspectRatioLocked = false; | |
dataDir = dataDir + "Shape_AspectRatioLocked_out.doc"; | |
// Save the document to disk. | |
doc.Save(dataDir); |
Establecer diseño de forma en celda
También puede especificar si la forma se muestra dentro o fuera de una tabla usando la propiedad IsLayoutInCell.
El siguiente ejemplo de código muestra cómo trabajar con la propiedad IsLayoutInCell:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
Document doc = new Document(dataDir + @"LayoutInCell.docx"); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
Shape watermark = new Shape(doc, ShapeType.TextPlainText); | |
watermark.RelativeHorizontalPosition = RelativeHorizontalPosition.Page; | |
watermark.RelativeVerticalPosition = RelativeVerticalPosition.Page; | |
watermark.IsLayoutInCell = true; // Display the shape outside of table cell if it will be placed into a cell. | |
watermark.Width = 300; | |
watermark.Height = 70; | |
watermark.HorizontalAlignment = HorizontalAlignment.Center; | |
watermark.VerticalAlignment = VerticalAlignment.Center; | |
watermark.Rotation = -40; | |
watermark.Fill.Color = Color.Gray; | |
watermark.StrokeColor = Color.Gray; | |
watermark.TextPath.Text = "watermarkText"; | |
watermark.TextPath.FontFamily = "Arial"; | |
watermark.Name = string.Format("WaterMark_{0}", Guid.NewGuid()); | |
watermark.WrapType = WrapType.None; | |
Run run = doc.GetChildNodes(NodeType.Run, true)[doc.GetChildNodes(NodeType.Run, true).Count - 1] as Run; | |
builder.MoveTo(run); | |
builder.InsertNode(watermark); | |
doc.CompatibilityOptions.OptimizeFor(MsWordVersion.Word2010); | |
dataDir = dataDir + "Shape_IsLayoutInCell_out.docx"; | |
// Save the document to disk. | |
doc.Save(dataDir); |
Crear rectángulo de esquina recortada
Puede crear un rectángulo de esquina recortada usando Aspose.Words. Los tipos de formas son SingleCornerSnipped, TopCornersSnipped, DiagonalCornersSnipped, TopCornersOneRoundedOneSnipped, SingleCornerRounded, TopCornersRounded y DiagonalCornersRounded.
La forma DML se crea utilizando el método InsertShape con estos tipos de formas. Estos tipos no se pueden utilizar para crear formas VML. El intento de crear una forma utilizando el constructor público de la clase “Shape” genera la excepción “NotSupportedException”.
El siguiente ejemplo de código muestra cómo insertar este tipo de formas en el documento:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
Shape shape = builder.InsertShape(ShapeType.TopCornersSnipped, 50, 50); | |
OoxmlSaveOptions so = new OoxmlSaveOptions(SaveFormat.Docx); | |
so.Compliance = OoxmlCompliance.Iso29500_2008_Transitional; | |
dataDir = dataDir + "AddCornersSnipped_out.docx"; | |
//Save the document to disk. | |
doc.Save(dataDir, so); |
Obtener puntos de límites de forma reales
Usando Aspose.Words API, puede obtener la ubicación y el tamaño de la forma que contiene el bloque en puntos, en relación con el ancla de la forma superior. Para hacer esto, use la propiedad BoundsInPoints.
El siguiente ejemplo de código muestra cómo trabajar con la propiedad BoundsInPoints:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
var shape = builder.InsertImage(dataDir + "Test.png"); | |
shape.AspectRatioLocked = false; | |
Console.Write("\nGets the actual bounds of the shape in points."); | |
Console.WriteLine(shape.GetShapeRenderer().BoundsInPoints); |
Especificar anclaje vertical
Puede especificar la alineación vertical del texto dentro de una forma utilizando la propiedad VerticalAnchor.
El siguiente ejemplo de código muestra cómo trabajar con la propiedad VerticalAnchor:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
Document doc = new Document(dataDir + @"VerticalAnchor.docx"); | |
NodeCollection shapes = doc.GetChildNodes(NodeType.Shape, true); | |
Shape textBoxShape = shapes[0] as Shape; | |
if (textBoxShape != null) | |
{ | |
textBoxShape.TextBox.VerticalAnchor = TextBoxAnchor.Bottom; | |
} | |
doc.Save(dataDir + "VerticalAnchor_out.docx"); |
Detectar forma SmartArt
Aspose.Words también permite detectar si la Forma tiene un objeto SmartArt
. Para hacer esto, use la propiedad HasSmartArt.
El siguiente ejemplo de código muestra cómo trabajar con la propiedad HasSmartArt:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
Document doc = new Document(dataDir + "input.docx"); | |
int count = 0; | |
foreach (Shape shape in doc.GetChildNodes(NodeType.Shape, true)) | |
{ | |
if (shape.HasSmartArt) | |
count++; | |
} | |
Console.WriteLine("The document has {0} shapes with SmartArt.", count); |
Insertar regla horizontal en el documento
Puede insertar una forma de regla horizontal en un documento utilizando el método InsertHorizontalRule.
El siguiente ejemplo de código muestra cómo hacer esto:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
// Initialize document. | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
builder.Writeln("Insert a horizontal rule shape into the document."); | |
builder.InsertHorizontalRule(); | |
dataDir = dataDir + "DocumentBuilder.InsertHorizontalRule_out.doc"; | |
doc.Save(dataDir); |
Aspose.Words API proporciona la propiedad HorizontalRuleFormat para acceder a las propiedades de la forma de regla horizontal. La clase HorizontalRuleFormat expone propiedades básicas como Altura, Color, NoShade, etc. para el formato de una regla horizontal.
El siguiente ejemplo de código muestra cómo configurar HorizontalRuleFormat:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
DocumentBuilder builder = new DocumentBuilder(); | |
Shape shape = builder.InsertHorizontalRule(); | |
HorizontalRuleFormat horizontalRuleFormat = shape.HorizontalRuleFormat; | |
horizontalRuleFormat.Alignment = HorizontalRuleAlignment.Center; | |
horizontalRuleFormat.WidthPercent = 70; | |
horizontalRuleFormat.Height = 3; | |
horizontalRuleFormat.Color = Color.Blue; | |
horizontalRuleFormat.NoShade = true; | |
builder.Document.Save("HorizontalRuleFormat.docx"); |
Importar formas con XML matemático como formas en DOM
Puede utilizar la propiedad ConvertShapeToOfficeMath para convertir las formas con EquationXML en objetos de Office Math. El valor predeterminado de esta propiedad corresponde al comportamiento de Microsoft Word, es decir, las formas con ecuación XML no se convierten en objetos matemáticos de Office.
El siguiente ejemplo de código muestra cómo convertir formas en objetos de Office Math:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
LoadOptions lo = new LoadOptions(); | |
lo.ConvertShapeToOfficeMath = true; | |
// Specify load option to use previous default behaviour i.e. convert math shapes to office math ojects on loading stage. | |
Document doc = new Document(dataDir + @"OfficeMath.docx", lo); | |
//Save the document into DOCX | |
doc.Save(dataDir + "ConvertShapeToOfficeMath_out.docx", SaveFormat.Docx); |