Cómo crear presentaciones en C++

Cómo crear presentaciones en C++

Aspose.Slides FOSS for C++ le permite crear presentaciones de PowerPoint completamente en C++ sin depender de Microsoft Office. Esta guía muestra cómo crear una nueva presentación, agregar diapositivas y formas, dar formato al texto y guardar el resultado.

Guía paso a paso

Paso 1: Añadir la biblioteca a su proyecto CMake

Utilice CMake FetchContent para integrar la biblioteca directamente desde GitHub. Se requiere C++20 o posterior.

cmake_minimum_required(VERSION 3.20)
project(my_slides_app LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

include(FetchContent)
FetchContent_Declare(
    aspose_slides_foss
    GIT_REPOSITORY https://github.com/aspose-slides-foss/Aspose.Slides-FOSS-for-Cpp.git
    GIT_TAG main
)
FetchContent_MakeAvailable(aspose_slides_foss)

add_executable(my_app main.cpp)
target_link_libraries(my_app PRIVATE aspose_slides_foss)

No se requieren otros paquetes del sistema.


Paso 2: Incluir los encabezados requeridos

#include <Aspose/Slides/Foss/presentation.h>

Todos los tipos residen en el espacio de nombres Aspose::Slides::Foss. Para mayor brevedad, los ejemplos a continuación usan un alias de espacio de nombres:

namespace asf = Aspose::Slides::Foss;

Paso 3: Crear una presentación

Construya un Presentation en la pila. Una nueva presentación comienza con una diapositiva en blanco.

#include <Aspose/Slides/Foss/presentation.h>
#include <iostream>

int main() {
    namespace asf = Aspose::Slides::Foss;

    asf::Presentation prs;
    std::cout << "Slides in new presentation: " << prs.slides().size() << "\n";
    prs.save("output.pptx", asf::SaveFormat::PPTX);
    return 0;
}

Importante: Utilice la asignación en pila o std::unique_ptr para que el destructor libere los recursos internos automáticamente.


Paso 4: Acceder a una diapositiva

La primera diapositiva está en el índice 0. Una presentación en blanco tiene exactamente una diapositiva.

namespace asf = Aspose::Slides::Foss;

asf::Presentation prs;
auto& slide = prs.slides()[0]; // zero-based index
prs.save("output.pptx", asf::SaveFormat::PPTX);

Paso 5: Añadir una forma

Use slide.shapes().add_auto_shape() para agregar una AutoShape. Los parámetros son (shape_type, x, y, width, height) todos en puntos (1 punto = 1/72 de pulgada; la diapositiva estándar es 720 x 540 pt).

#include <Aspose/Slides/Foss/presentation.h>

int main() {
    namespace asf = Aspose::Slides::Foss;

    asf::Presentation prs;
    auto& slide = prs.slides()[0];

    // Rectangle at (50, 50) with 400 wide and 120 tall
    auto& shape = slide.shapes().add_auto_shape(
        asf::ShapeType::RECTANGLE, 50, 50, 400, 120);

    // Set text on the shape's text frame
    shape.text_frame()->set_text("Hello from Aspose.Slides FOSS!");

    prs.save("with-shape.pptx", asf::SaveFormat::PPTX);
    return 0;
}

Paso 6: Guardar la presentación

Llame prs.save(path, SaveFormat::PPTX) antes de que Presentation salga del alcance. PPTX es el único formato de salida compatible.

prs.save("result.pptx", asf::SaveFormat::PPTX);

El archivo se escribe de forma atómica; si ocurre un error antes de esta llamada, no se crea ningún archivo de salida.


Ejemplo completo y funcional

El siguiente programa crea una presentación de dos diapositivas con una forma de título en la primera diapositiva y una tabla en la segunda.

#include <Aspose/Slides/Foss/presentation.h>
#include <vector>
#include <string>

int main() {
    namespace asf = Aspose::Slides::Foss;

    asf::Presentation prs;

    // --- Slide 1: title shape ---
    auto& slide1 = prs.slides()[0];
    auto& title = slide1.shapes().add_auto_shape(
        asf::ShapeType::RECTANGLE, 40, 40, 640, 80);
    title.text_frame()->set_text("Q1 Results: Executive Summary");
    auto& fmt = title.text_frame()->paragraphs()[0].portions()[0].portion_format();
    fmt.set_font_height(32);
    fmt.set_font_bold(asf::NullableBool::TRUE);
    fmt.fill_format().set_fill_type(asf::FillType::SOLID);
    fmt.fill_format().solid_fill_color().set_color(
        asf::Color::from_argb(255, 0, 70, 127));

    // --- Slide 2: table ---
    prs.slides().add_empty_slide(&prs.layout_slides()[0]);
    auto& slide2 = prs.slides()[1];
    std::vector<double> col_w = {200.0, 120.0, 120.0};
    std::vector<double> row_h = {40.0, 40.0, 40.0};
    auto& table = slide2.shapes().add_table(40, 40, col_w, row_h);

    std::vector<std::string> headers = {"Region", "Revenue", "Growth"};
    std::vector<std::vector<std::string>> data = {
        {"North", "$1.2M", "+8%"},
        {"South", "$0.9M", "+4%"},
    };
    for (size_t col = 0; col < headers.size(); ++col) {
        table.rows()[0][col].text_frame()->set_text(headers[col]);
    }
    for (size_t r = 0; r < data.size(); ++r) {
        for (size_t c = 0; c < data[r].size(); ++c) {
            table.rows()[r + 1][c].text_frame()->set_text(data[r][c]);
        }
    }

    prs.save("q1-results.pptx", asf::SaveFormat::PPTX);
    return 0;
}

Problemas comunes y soluciones

Segfault o double-free en la destrucción de Presentation

Está almacenando una referencia o puntero a una diapositiva o forma después de que Presentation haya sido destruido. Todas las referencias devueltas por slides(), shapes(), etc. se invalidan cuando se ejecuta el destructor de Presentation. Mantenga Presentation activo durante todo el tiempo que utilice sus objetos secundarios.

SaveFormat::PPTX is not a function error del compilador

SaveFormat::PPTX es un valor de enumeración, no una función. Úselo como prs.save("file.pptx", asf::SaveFormat::PPTX).

Error de enlazador: referencia indefinida a Aspose::Slides::Foss::Presentation

Asegúrate de que tu CMakeLists.txt se enlace contra la biblioteca con target_link_libraries(my_app PRIVATE aspose_slides_foss).


Preguntas Frecuentes

¿Cuál es el tamaño de diapositiva predeterminado?

Un nuevo Presentation() crea diapositivas con el tamaño estándar de 10 × 7,5 pulgadas (720 × 540 puntos). Cambiar el tamaño de la diapositiva aún no es compatible en esta edición.

¿Puedo agregar más de una diapositiva?

Sí. Llame prs.slides().add_empty_slide(&prs.layout_slides()[0]) para añadir una diapositiva en blanco y acceder a ella por índice:

prs.slides().add_empty_slide(&prs.layout_slides()[0]);
auto& slide2 = prs.slides()[1];

¿Puedo abrir un archivo existente y añadir diapositivas?

Sí:

asf::Presentation prs("existing.pptx");
prs.slides().add_empty_slide(&prs.layout_slides()[0]);
prs.save("existing.pptx", asf::SaveFormat::PPTX);

¿Qué formatos puedo guardar?

Solo SaveFormat::PPTX es compatible. La exportación a PDF, HTML, SVG o imágenes no está disponible en esta edición.


Ver también

 Español