Manipulaciones de forma

Buscar forma en la diapositiva

Este tema describirá una técnica sencilla para facilitar a los desarrolladores la búsqueda de una forma específica en una diapositiva sin usar su Id interno. Es importante saber que los archivos de Presentación de PowerPoint no disponen de ningún método para identificar formas en una diapositiva, salvo un Id interno único. Resulta difícil para los desarrolladores encontrar una forma usando su Id interno único. Todas las formas añadidas a las diapositivas poseen algún Texto alternativo. Sugerimos a los desarrolladores usar texto alternativo para encontrar una forma específica. Puede usar MS PowerPoint para definir el texto alternativo de los objetos que planea modificar en el futuro.

Después de establecer el texto alternativo de la forma deseada, puede abrir esa presentación con Aspose.Slides for Node.js via Java y recorrer todas las formas añadidas a una diapositiva. En cada iteración, puede comprobar el texto alternativo de la forma y la forma con el texto alternativo coincidente será la forma que necesita. Para demostrar esta técnica de forma más clara, hemos creado un método, findShape que realiza la búsqueda de una forma específica en una diapositiva y devuelve esa forma.

// Instanciar una clase Presentation que representa el archivo de presentación
var pres = new aspose.slides.Presentation("FindingShapeInSlide.pptx");
try {
    var slide = pres.getSlides().get_Item(0);
    // Texto alternativo de la forma a encontrar
    var shape = findShape(slide, "Shape1");
    if (shape != null) {
        console.log("Shape Name: " + shape.getName());
    }
} finally {
    if (pres != null) {
        pres.dispose();
    }
}
function findShape(slide, altText) {
    let shapes = slide.getShapes();
    
    for (let i = 0; i < shapes.size(); i++) {
        let shape = shapes.get_Item(i);
        
        if (shape.getAlternativeText() === altText) {
            return shape;
        }
    }

    return null;
}

Clonar forma

Para clonar una forma a una diapositiva usando Aspose.Slides for Node.js via Java:

  1. Crear una instancia de la clase Presentation.
  2. Obtener la referencia de una diapositiva mediante su índice.
  3. Acceder a la colección de formas de la diapositiva origen.
  4. Añadir una nueva diapositiva a la presentación.
  5. Clonar formas de la colección de la diapositiva origen a la nueva diapositiva.
  6. Guardar la presentación modificada como archivo PPTX.

El ejemplo a continuación añade una forma de grupo a una diapositiva.

// Instanciar la clase Presentation
var pres = new aspose.slides.Presentation("Source Frame.pptx");
try {
    var sourceShapes = pres.getSlides().get_Item(0).getShapes();
    var blankLayout = pres.getMasters().get_Item(0).getLayoutSlides().getByType(aspose.slides.SlideLayoutType.Blank);
    var destSlide = pres.getSlides().addEmptySlide(blankLayout);
    var destShapes = destSlide.getShapes();
    destShapes.addClone(sourceShapes.get_Item(1), 50, 150 + sourceShapes.get_Item(0).getHeight());
    destShapes.addClone(sourceShapes.get_Item(2));
    destShapes.insertClone(0, sourceShapes.get_Item(0), 50, 150);
    // Guardar el archivo PPTX en disco
    pres.save("CloneShape_out.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    if (pres != null) {
        pres.dispose();
    }
}

Eliminar forma

Aspose.Slides for Node.js via Java permite a los desarrolladores eliminar cualquier forma. Para eliminar la forma de cualquier diapositiva, siga los pasos a continuación:

  1. Crear una instancia de la clase Presentation.
  2. Acceder a la primera diapositiva.
  3. Encontrar la forma con el TextoAlternativo específico.
  4. Eliminar la forma.
  5. Guardar el archivo en disco.
// Crear objeto Presentation
var pres = new aspose.slides.Presentation();
try {
    // Obtener la primera diapositiva
    var sld = pres.getSlides().get_Item(0);
    // Añadir autoshape de tipo rectángulo
    sld.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 50, 40, 150, 50);
    sld.getShapes().addAutoShape(aspose.slides.ShapeType.Moon, 160, 40, 150, 50);
    var altText = "User Defined";
    var iCount = sld.getShapes().size();
    for (var i = 0; i < iCount; i++) {
        var ashp = sld.getShapes().get_Item(0);
        if (alttext === ashp.getAlternativeText()) {
            sld.getShapes().remove(ashp);
        }
    }
    // Guardar la presentación en disco
    pres.save("RemoveShape_out.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    if (pres != null) {
        pres.dispose();
    }
}

Ocultar forma

Aspose.Slides for Node.js via Java permite a los desarrolladores ocultar cualquier forma. Para ocultar la forma de cualquier diapositiva, siga los pasos a continuación:

  1. Crear una instancia de la clase Presentation.
  2. Acceder a la primera diapositiva.
  3. Encontrar la forma con el TextoAlternativo específico.
  4. Ocultar la forma.
  5. Guardar el archivo en disco.
// Instanciar la clase Presentation que representa el PPTX
var pres = new aspose.slides.Presentation();
try {
    // Obtener la primera diapositiva
    var sld = pres.getSlides().get_Item(0);
    // Añadir autoshape de tipo rectángulo
    sld.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 50, 40, 150, 50);
    sld.getShapes().addAutoShape(aspose.slides.ShapeType.Moon, 160, 40, 150, 50);
    var alttext = "User Defined";
    var iCount = sld.getShapes().size();
    for (var i = 0; i < iCount; i++) {
        var ashp = sld.getShapes().get_Item(i);
        if (alttext === ashp.getAlternativeText()) {
            ashp.setHidden(true);
        }
    }
    // Guardar la presentación en disco
    pres.save("Hiding_Shapes_out.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    if (pres != null) {
        pres.dispose();
    }
}

Cambiar el orden de las formas

Aspose.Slides for Node.js via Java permite a los desarrolladores reordenar las formas. Reordenar la forma indica cuál está al frente y cuál está atrás. Para reordenar la forma en cualquier diapositiva, siga los pasos a continuación:

  1. Crear una instancia de la clase Presentation.
  2. Acceder a la primera diapositiva.
  3. Añadir una forma.
  4. Añadir texto al marco de texto de la forma.
  5. Añadir otra forma con las mismas coordenadas.
  6. Reordenar las formas.
  7. Guardar el archivo en disco.
var pres = new aspose.slides.Presentation("ChangeShapeOrder.pptx");
try {
    var slide = pres.getSlides().get_Item(0);
    var shp3 = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 200, 365, 400, 150);
    shp3.getFillFormat().setFillType(java.newByte(aspose.slides.FillType.NoFill));
    shp3.addTextFrame(" ");
    var para = shp3.getTextFrame().getParagraphs().get_Item(0);
    var portion = para.getPortions().get_Item(0);
    portion.setText("Watermark Text Watermark Text Watermark Text");
    shp3 = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Triangle, 200, 365, 400, 150);
    slide.getShapes().reorder(2, shp3);
    pres.save("Reshape_out.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    if (pres != null) {
        pres.dispose();
    }
}

Obtener ID de forma Interop

Aspose.Slides for Node.js via Java permite a los desarrolladores obtener un identificador de forma único en el ámbito de la diapositiva, en contraste con el método getUniqueId que permite obtener un identificador único en el ámbito de la presentación. El método getOfficeInteropShapeId se añadió a la clase Shape. El valor devuelto por getOfficeInteropShapeId corresponde al Id del objeto Microsoft.Office.Interop.PowerPoint.Shape. A continuación se muestra un fragmento de código de ejemplo.

var pres = new aspose.slides.Presentation("Presentation.pptx");
try {
    // Obtener identificador único de forma en el ámbito de la diapositiva
    var officeInteropShapeId = pres.getSlides().get_Item(0).getShapes().get_Item(0).getOfficeInteropShapeId();
} finally {
    if (pres != null) {
        pres.dispose();
    }
}

Establecer texto alternativo para la forma

Aspose.Slides for Node.js via Java permite a los desarrolladores establecer el TextoAlternativo de cualquier forma. Las formas en una presentación pueden distinguirse mediante el método AlternativeText o el método Shape Name. Los métodos setAlternativeText y getAlternativeText pueden leerse o establecerse usando Aspose.Slides así como Microsoft PowerPoint. Mediante este método, puede etiquetar una forma y realizar diferentes operaciones como eliminar, ocultar o reordenar formas en una diapositiva. Para establecer el TextoAlternativo de una forma, siga los pasos a continuación:

  1. Crear una instancia de la clase Presentation.
  2. Acceder a la primera diapositiva.
  3. Añadir cualquier forma a la diapositiva.
  4. Realizar alguna operación con la forma recién añadida.
  5. Recorrer las formas para encontrar una forma.
  6. Establecer el TextoAlternativo.
  7. Guardar el archivo en disco.
// Instanciar la clase Presentation que representa el PPTX
var pres = new aspose.slides.Presentation();
try {
    // Obtener la primera diapositiva
    var sld = pres.getSlides().get_Item(0);
    // Añadir autoshape de tipo rectángulo
    var shp1 = sld.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 50, 40, 150, 50);
    var shp2 = sld.getShapes().addAutoShape(aspose.slides.ShapeType.Moon, 160, 40, 150, 50);
    shp2.getFillFormat().setFillType(java.newByte(aspose.slides.FillType.Solid));
    shp2.getFillFormat().getSolidFillColor().setColor(java.getStaticFieldValue("java.awt.Color", "GRAY"));
    for (var i = 0; i < sld.getShapes().size(); i++) {
        var shape = sld.getShapes().get_Item(i);
        if (shape != null) {
            shape.setAlternativeText("User Defined");
        }
    }
    // Guardar la presentación en disco
    pres.save("Set_AlternativeText_out.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    if (pres != null) {
        pres.dispose();
    }
}

Acceder a formatos de diseño para la forma

Aspose.Slides for Node.js via Java proporciona una API sencilla para acceder a los formatos de diseño de una forma. Este artículo muestra cómo puede acceder a dichos formatos.

A continuación se muestra un fragmento de código de ejemplo.

var pres = new aspose.slides.Presentation("pres.pptx");
try {
    for (let i = 0; i < pres.getLayoutSlides().size(); i++) {
        let layoutSlide = pres.getLayoutSlides().get_Item(i);
        for (let j = 0; j < layoutSlide.getShapes().size(); j++) {
            let shape = layoutSlide.getShapes().get_Item(j);
            var fillFormats = shape.getFillFormat();
            var lineFormats = shape.getLineFormat();
        }
    }
} finally {
    if (pres != null) {
        pres.dispose();
    }
}

Renderizar forma como SVG

Ahora Aspose.Slides for Node.js via Java admite la renderización de una forma como SVG. El método writeAsSvg (y su sobrecarga) se añadió a la clase Shape. Este método permite guardar el contenido de la forma como un archivo SVG. El fragmento de código a continuación muestra cómo exportar la forma de una diapositiva a un archivo SVG.

var pres = new aspose.slides.Presentation("TestExportShapeToSvg.pptx");
try {
    var stream = java.newInstanceSync("java.io.FileOutputStream", "SingleShape.svg");
    try {
        pres.getSlides().get_Item(0).getShapes().get_Item(0).writeAsSvg(stream);
    } finally {
        if (stream != null) {
            stream.close();
        }
    }
} catch (e) {console.log(e);
} finally {
    if (pres != null) {
        pres.dispose();
    }
}

Alineación de formas

Aspose.Slides permite alinear formas ya sea respecto a los márgenes de la diapositiva o respecto a otras formas. Con este fin, se añadió el método sobrecargado SlidesUtil.alignShape(). La enumeración ShapesAlignmentType define las posibles opciones de alineación.

Ejemplo 1

El código fuente a continuación alinea las formas con índices 1,2 y 4 a lo largo del borde superior de la diapositiva.

var pres = new aspose.slides.Presentation("example.pptx");
try {
    var slide = pres.getSlides().get_Item(0);
    var shape1 = slide.getShapes().get_Item(1);
    var shape2 = slide.getShapes().get_Item(2);
    var shape3 = slide.getShapes().get_Item(4);
    aspose.slides.SlideUtil.alignShapes(aspose.slides.ShapesAlignmentType.AlignTop, true, pres.getSlides().get_Item(0), java.newArray("int", [slide.getShapes().indexOf(shape1), slide.getShapes().indexOf(shape2), slide.getShapes().indexOf(shape3)]));
} finally {
    if (pres != null) {
        pres.dispose();
    }
}

Ejemplo 2

El ejemplo a continuación muestra cómo alinear toda la colección de formas respecto a la forma más baja de la colección.

var pres = new aspose.slides.Presentation("example.pptx");
try {
    aspose.slides.SlideUtil.alignShapes(aspose.slides.ShapesAlignmentType.AlignBottom, false, pres.getSlides().get_Item(0));
} finally {
    if (pres != null) {
        pres.dispose();
    }
}

Propiedades de volteo

En Aspose.Slides, la clase ShapeFrame proporciona control sobre el espejo horizontal y vertical de las formas mediante sus propiedades flipH y flipV. Ambas propiedades son de tipo byte, permitiendo valores 1 para indicar volteo, 0 para no voltear, o -1 para usar el comportamiento predeterminado. Estos valores son accesibles desde el Frame de una forma.

Para modificar la configuración de volteo, se construye una nueva instancia de ShapeFrame con la posición y tamaño actuales de la forma, los valores deseados para flipH y flipV, y el ángulo de rotación. Asignar esta instancia al Frame de la forma y guardar la presentación aplica las transformaciones de espejo y las escribe en el archivo de salida.

Supongamos que tenemos un archivo sample.pptx en el que la primera diapositiva contiene una única forma con la configuración de volteo predeterminada, como se muestra a continuación.

The shape to be flipped

El siguiente ejemplo de código recupera las propiedades de volteo actuales de la forma y la voltea tanto horizontal como verticalmente.

var presentation = new asposeSlides.Presentation("sample.pptx");
try {
    var slide = presentation.getSlides().get_Item(0);
    var shape = slide.getShapes().get_Item(0);

    // Obtener la propiedad de volteo horizontal de la forma.
    var horizontalFlip = shape.getFrame().getFlipH();
    console.log("Horizontal flip:", horizontalFlip);

    // Obtener la propiedad de volteo vertical de la forma.
    var verticalFlip = shape.getFrame().getFlipV();
    console.log("Vertical flip:", verticalFlip);

    var x = java.newFloat(shape.getFrame().getX());
    var y = java.newFloat(shape.getFrame().getY());
    var width = java.newFloat(shape.getFrame().getWidth());
    var height = java.newFloat(shape.getFrame().getHeight());
    var flipH = java.newByte(asposeSlides.NullableBool.True); // Voltear horizontalmente.
    var flipV = java.newByte(asposeSlides.NullableBool.True); // Voltear verticalmente.
    var rotation = shape.getFrame().getRotation();

    shape.setFrame(new asposeSlides.ShapeFrame(x, y, width, height, flipH, flipV, rotation));

    presentation.save("output.pptx", asposeSlides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

El resultado:

The flipped shape

FAQ

¿Puedo combinar formas (unión/intersección/resta) en una diapositiva como en un editor de escritorio?

No hay una API de operación booleana incorporada. Puede aproximarse construyendo el contorno deseado usted mismo, por ejemplo calculando la geometría resultante (mediante GeometryPath) y creando una nueva forma con ese contorno, opcionalmente eliminando las originales.

¿Cómo puedo controlar el orden de apilamiento (z-order) para que una forma siempre quede “encima”?

Cambie el orden de inserción/movimiento dentro de la colección shapes de la diapositiva. Para resultados predecibles, finalice el z-order después de todas las demás modificaciones de la diapositiva.

¿Puedo “bloquear” una forma para evitar que los usuarios la editen en PowerPoint?

Sí. Establezca los indicadores de protección a nivel de forma (/slides/es/nodejs-java/applying-protection-to-presentation/) (por ejemplo, bloquear selección, movimiento, redimensionado, edición de texto). Si es necesario, aplique restricciones en la diapositiva maestra o de diseño. Tenga en cuenta que esta es una protección a nivel de UI, no una característica de seguridad; para una protección más fuerte, combine con restricciones a nivel de archivo como recomendaciones de solo lectura o contraseñas (/slides/es/nodejs-java/password-protected-presentation/).