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 del documento 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 insert_shape. El método insert_shape 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-Python-via-.NET
doc = aw.Document()
builder = aw.DocumentBuilder(doc)
shape = builder.insert_shape(aw.drawing.ShapeType.TEXT_BOX, aw.drawing.RelativeHorizontalPosition.PAGE, 100,
aw.drawing.RelativeVerticalPosition.PAGE, 100, 50, 50, aw.drawing.WrapType.NONE)
shape.rotation = 30.0
builder.writeln()
shape = builder.insert_shape(aw.drawing.ShapeType.TEXT_BOX, 50, 50)
shape.rotation = 30.0
saveOptions = aw.saving.OoxmlSaveOptions(aw.SaveFormat.DOCX)
saveOptions.compliance = aw.saving.OoxmlCompliance.ISO29500_2008_TRANSITIONAL
doc.save(docs_base.artifacts_dir + "WorkingWithShapes.insert_shape.docx", saveOptions)

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 aspect_ratio_locked.

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-Python-via-.NET
doc = aw.Document()
builder = aw.DocumentBuilder(doc)
shape = builder.insert_image(docs_base.images_dir + "Transparent background logo.png")
shape.aspect_ratio_locked = False
doc.save(docs_base.artifacts_dir + "WorkingWithShapes.aspect_ratio_locked.docx")

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 is_layout_in_cell.

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-Python-via-.NET
doc = aw.Document()
builder = aw.DocumentBuilder(doc)
builder.start_table()
builder.row_format.height = 100
builder.row_format.height_rule = aw.HeightRule.EXACTLY
for i in range(0, 31) :
if (i != 0 and i % 7 == 0) :
builder.end_row()
builder.insert_cell()
builder.write("Cell contents")
builder.end_table()
watermark = aw.drawing.Shape(doc, aw.drawing.ShapeType.TEXT_PLAIN_TEXT)
watermark.relative_horizontal_position = aw.drawing.RelativeHorizontalPosition.PAGE
watermark.relative_vertical_position = aw.drawing.RelativeVerticalPosition.PAGE
watermark.is_layout_in_cell = True # Display the shape outside of the table cell if it will be placed into a cell.
watermark.width = 300
watermark.height = 70
watermark.horizontal_alignment = aw.drawing.HorizontalAlignment.CENTER
watermark.vertical_alignment = aw.drawing.VerticalAlignment.CENTER
watermark.rotation = -40
watermark.fill_color = drawing.Color.gray
watermark.stroke_color = drawing.Color.gray
watermark.text_path.text = "watermarkText"
watermark.text_path.font_family = "Arial"
watermark.name = "WaterMark_" + str(uuid.uuid4())
watermark.wrap_type = aw.drawing.WrapType.NONE
run = doc.get_child_nodes(aw.NodeType.RUN, True)[doc.get_child_nodes(aw.NodeType.RUN, True).count - 1].as_run()
builder.move_to(run)
builder.insert_node(watermark)
doc.compatibility_options.optimize_for(aw.settings.MsWordVersion.WORD2010)
doc.save(docs_base.artifacts_dir + "WorkingWithShapes.layout_in_cell.docx")

Crear rectángulo de esquina recortada

Puede crear un rectángulo de esquina recortada usando Aspose.Words. Los tipos de formas son SINGLE_CORNER_SNIPPED, TOP_CORNERS_SNIPPED, DIAGONAL_CORNERS_SNIPPED, TOP_CORNERS_ONE_ROUNDED_ONE_SNIPPED, SINGLE_CORNER_ROUNDED, TOP_CORNERS_ROUNDED y DIAGONAL_CORNERS_ROUNDED.

La forma DML se crea utilizando el método insert_shape 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-Python-via-.NET
doc = aw.Document()
builder = aw.DocumentBuilder(doc)
builder.insert_shape(aw.drawing.ShapeType.TOP_CORNERS_SNIPPED, 50, 50)
saveOptions = aw.saving.OoxmlSaveOptions(aw.SaveFormat.DOCX)
saveOptions.compliance = aw.saving.OoxmlCompliance.ISO29500_2008_TRANSITIONAL
doc.save(docs_base.artifacts_dir + "WorkingWithShapes.add_corners_snipped.docx", saveOptions)

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 bounds_in_points.

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-Python-via-.NET
doc = aw.Document()
builder = aw.DocumentBuilder(doc)
shape = builder.insert_image(docs_base.images_dir + "Transparent background logo.png")
shape.aspect_ratio_locked = False
print("\nGets the actual bounds of the shape in points: ")
print(shape.get_shape_renderer().bounds_in_points)

Especificar anclaje vertical

Puede especificar la alineación vertical del texto dentro de una forma utilizando la propiedad vertical_anchor.

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-Python-via-.NET
doc = aw.Document()
builder = aw.DocumentBuilder(doc)
textBox = builder.insert_shape(aw.drawing.ShapeType.TEXT_BOX, 200, 200)
textBox.text_box.vertical_anchor = aw.drawing.TextBoxAnchor.BOTTOM
builder.move_to(textBox.first_paragraph)
builder.write("Textbox contents")
doc.save(docs_base.artifacts_dir + "WorkingWithShapes.vertical_anchor.docx")

Detectar forma SmartArt

Aspose.Words también permite detectar si la Forma tiene un objeto SmartArt. Para hacer esto, use la propiedad propiedad has_smart_art.

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-Python-via-.NET
doc = aw.Document(docs_base.my_dir + "SmartArt.docx")
count = 0
for shape in doc.get_child_nodes(aw.NodeType.SHAPE, True) :
shape = shape.as_shape()
if(shape.has_smart_art) :
count += 1
print("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 insert_horizontal_rule.

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-Python-via-.NET
doc = aw.Document()
builder = aw.DocumentBuilder(doc)
builder.writeln("Insert a horizontal rule shape into the document.")
builder.insert_horizontal_rule()
doc.save(docs_base.artifacts_dir + "AddContentUsingDocumentBuilder.insert_horizontal_rule.docx")

Aspose.Words API proporciona la propiedad horizontal_rule_format para acceder a las propiedades de la forma de regla horizontal. La clase HorizontalRuleFormat expone propiedades básicas como height, color, no_shade, etc. para el formato de una regla horizontal.

El siguiente ejemplo de código demuestra cómo configurar HorizontalRuleFormat:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
builder = aw.DocumentBuilder()
shape = builder.insert_horizontal_rule()
horizontalRuleFormat = shape.horizontal_rule_format
horizontalRuleFormat.alignment = aw.drawing.HorizontalRuleAlignment.CENTER
horizontalRuleFormat.width_percent = 70
horizontalRuleFormat.height = 3
horizontalRuleFormat.color = drawing.Color.blue
horizontalRuleFormat.no_shade = True
builder.document.save(docs_base.artifacts_dir + "AddContentUsingDocumentBuilder.horizontal_rule_format.docx")

Insertar objeto OLE como icono

Aspose.Words API proporciona una función Forma.insert_ole_object_as_icon para insertar un objeto OLE incrustado o vinculado como un icono en el documento. Esta función permite especificar el archivo de icono y el título. El tipo de objeto OLE se detectará mediante la extensión del archivo.

El siguiente ejemplo de código demuestra cómo configurar la inserción de un objeto OLE como un icono en el documento:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
doc = aw.Document()
builder = aw.DocumentBuilder(doc)
builder.insert_ole_object_as_icon(docs_base.my_dir + "Presentation.pptx", False, docs_base.images_dir + "Logo icon.ico", "My embedded file")
doc.save(docs_base.artifacts_dir + "WorkingWithOleObjectsAndActiveX.insert_ole_object_as_icon.docx")

Importar formas con XML matemático como formas en DOM

Puede utilizar la propiedad convert_shape_to_office_math para convertir las formas con EquationXML en objetos de Office Math. El valor predeterminado de esta propiedad corresponde al comportamiento de MS 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-Python-via-.NET
loadOptions = aw.loading.LoadOptions()
loadOptions.convert_shape_to_office_math = True
doc = aw.Document(docs_base.my_dir + "Office math.docx", loadOptions)
doc.save(docs_base.artifacts_dir + "WorkingWithLoadOptions.convert_shape_to_office_math.docx", aw.SaveFormat.DOCX)