Administrar cuadros de texto en presentaciones usando C++

Los textos en diapositivas normalmente existen en cuadros de texto o formas. Por lo tanto, para añadir texto a una diapositiva, debes agregar un cuadro de texto y luego colocar algún texto dentro del cuadro. Aspose.Slides for C++ proporciona la interfaz IAutoShape que permite añadir una forma que contiene texto.

Crear un cuadro de texto en una diapositiva

Para crear un cuadro de texto en una diapositiva, sigue estos pasos:

  1. Crea una instancia de la clase Presentation.
  2. Obtén una referencia a la primera diapositiva de la presentación recién creada.
  3. Añade un objeto IAutoShape con ShapeType establecido como Rectangle en una posición especificada de la diapositiva y obtén la referencia al objeto IAutoShape recién añadido.
  4. Añade la propiedad TextFrame al objeto IAutoShape que contendrá un texto. En el ejemplo a continuación, añadimos este texto: Aspose TextBox
  5. Finalmente, escribe el archivo PPTX mediante el objeto Presentation.

Este código C++—una implementación de los pasos anteriores—muestra cómo añadir texto a una diapositiva:

// Instancia la presentación
auto pres = System::MakeObject<Presentation>();

// Obtiene la primera diapositiva de la presentación
auto sld = pres->get_Slides()->idx_get(0);

// Añade una AutoShape con tipo establecido como Rectángulo
auto ashp = sld->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 150.0f, 75.0f, 150.0f, 50.0f);

// Añade TextFrame al rectángulo
ashp->AddTextFrame(u" ");

// Accede al marco de texto
auto txtFrame = ashp->get_TextFrame();

// Crea el objeto Paragraph para el marco de texto
auto para = txtFrame->get_Paragraphs()->idx_get(0);

// Crea un objeto Portion para el párrafo
auto portion = para->get_Portions()->idx_get(0);

// Establece el texto
portion->set_Text(u"Aspose TextBox");

// Guarda la presentación en disco
pres->Save(u"TextBox_out.pptx", SaveFormat::Pptx);

Comprobar si una forma es un cuadro de texto

Aspose.Slides proporciona el método get_IsTextBox de la interfaz IAutoShape que permite examinar formas e identificar cuadros de texto.

Cuadro de texto y forma

Este código C++ muestra cómo comprobar si una forma se creó como cuadro de texto:

auto presentation = MakeObject<Presentation>(u"sample.pptx");
for (auto&& slide : presentation->get_Slides())
{
    for (auto&& shape : slide->get_Shapes())
    {
        if (ObjectExt::Is<IAutoShape>(shape))
        {
            auto autoShape = ExplicitCast<IAutoShape>(shape);
            Console::WriteLine(autoShape->get_IsTextBox() ? u"shape is a text box" : u"shape is not a text box");
        }
    }
}

presentation->Dispose();

Ten en cuenta que si simplemente añades una autoforma mediante el método AddAutoShape de la interfaz IShapeCollection, el método get_IsTextBox de la autoforma devolverá false. Sin embargo, después de añadir texto a la autoforma mediante el método AddTextFrame o el método set_Text, el método get_IsTextBox devolverá true.

auto presentation = MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);

auto shape1 = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 10, 10, 100, 40);
// shape1->get_IsTextBox() devuelve false
shape1->AddTextFrame(u"shape 1");
// shape1->get_IsTextBox() devuelve true

auto shape2 = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 10, 110, 100, 40);
// shape2->get_IsTextBox() devuelve false
shape2->get_TextFrame()->set_Text(u"shape 2");
// shape2->get_IsTextBox() devuelve true

auto shape3 = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 10, 210, 100, 40);
// shape3->get_IsTextBox() devuelve false
shape3->AddTextFrame(u"");
// shape3->get_IsTextBox() devuelve false

auto shape4 = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 10, 310, 100, 40);
// shape4->get_IsTextBox() devuelve false
shape4->get_TextFrame()->set_Text(u"");
// shape4->get_IsTextBox() devuelve false

Añadir columnas a un cuadro de texto

Aspose.Slides proporciona los métodos set_ColumnCount y set_ColumnSpacing (de la interfaz ITextFrameFormat y la clase TextFrameFormat) que permiten añadir columnas a los cuadros de texto. Puedes especificar el número de columnas en un cuadro de texto y definir el espaciado en puntos entre columnas.

Este código C++ demuestra la operación descrita:

auto presentation = System::MakeObject<Presentation>();
// Obtiene la primera diapositiva de la presentación
auto slide = presentation->get_Slides()->idx_get(0);

// Añade una AutoShape con el tipo establecido como Rectángulo
auto aShape = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 100.0f, 100.0f, 300.0f, 300.0f);

// Añade TextFrame al rectángulo
aShape->AddTextFrame(String(u"All these columns are limited to be within a single text container -- ") 
    + u"you can add or delete text and the new or remaining text automatically adjusts " 
    + u"itself to flow within the container. You cannot have text flow from one container " 
    + u"to other though -- we told you PowerPoint's column options for text are limited!");

// Obtiene el formato de texto del TextFrame
auto format = aShape->get_TextFrame()->get_TextFrameFormat();

// Especifica el número de columnas en el TextFrame
format->set_ColumnCount(3);

// Especifica el espaciado entre columnas
format->set_ColumnSpacing(10);

// Guarda la presentación
presentation->Save(u"ColumnCount.pptx", SaveFormat::Pptx);

Añadir columnas a un marco de texto

Aspose.Slides for C++ proporciona el método set_ColumnCount (de la interfaz ITextFrameFormat) que permite añadir columnas en marcos de texto. Mediante este método, puedes especificar el número de columnas que deseas en un marco de texto.

Este código C++ muestra cómo añadir una columna dentro de un marco de texto:

String outPptxFileName = u"ColumnsTest.pptx";
    
auto pres = System::MakeObject<Presentation>();
auto shape = pres->get_Slides()->idx_get(0)->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 100.0f, 100.0f, 300.0f, 300.0f);
auto format = System::ExplicitCast<TextFrameFormat>(shape->get_TextFrame()->get_TextFrameFormat());

format->set_ColumnCount(2);
shape->get_TextFrame()->set_Text(String(u"All these columns are forced to stay within a single text container -- ") 
    + u"you can add or delete text - and the new or remaining text automatically adjusts " 
    + u"itself to stay within the container. You cannot have text spill over from one container " 
    + u"to other, though -- because PowerPoint's column options for text are limited!");
pres->Save(outPptxFileName, SaveFormat::Pptx);

{
    auto test = System::MakeObject<Presentation>(outPptxFileName);
    auto format1 = System::ExplicitCast<AutoShape>(test->get_Slides()->idx_get(0)->get_Shapes()->idx_get(0))->get_TextFrame()->get_TextFrameFormat();
    CODEPORTING_DEBUG_ASSERT1(2 == format1->get_ColumnCount());
    CODEPORTING_DEBUG_ASSERT1(std::numeric_limits<double>::quiet_NaN() == format1->get_ColumnSpacing());
}

format->set_ColumnSpacing(20);
pres->Save(outPptxFileName, SaveFormat::Pptx);

{
    auto test = System::MakeObject<Presentation>(outPptxFileName);
    auto format2 = System::ExplicitCast<AutoShape>(test->get_Slides()->idx_get(0)->get_Shapes()->idx_get(0))->get_TextFrame()->get_TextFrameFormat();
    CODEPORTING_DEBUG_ASSERT1(2 == format2->get_ColumnCount());
    CODEPORTING_DEBUG_ASSERT1(20 == format2->get_ColumnSpacing());
}

format->set_ColumnCount(3);
format->set_ColumnSpacing(15);
pres->Save(outPptxFileName, SaveFormat::Pptx);

{
    auto test = System::MakeObject<Presentation>(outPptxFileName);
    auto format3 = System::ExplicitCast<AutoShape>(test->get_Slides()->idx_get(0)->get_Shapes()->idx_get(0))->get_TextFrame()->get_TextFrameFormat();
    CODEPORTING_DEBUG_ASSERT1(3 == format3->get_ColumnCount());
    CODEPORTING_DEBUG_ASSERT1(15 == format3->get_ColumnSpacing());
}

Actualizar texto

Aspose.Slides permite cambiar o actualizar el texto contenido en un cuadro de texto o todo el texto contenido en una presentación.

Este código C++ demuestra una operación en la que todo el texto de una presentación se actualiza o cambia:

auto pres = System::MakeObject<Presentation>(u"text.pptx");
for (const auto& slide : pres->get_Slides())
{
    for (const auto& shape : slide->get_Shapes())
    {
        if (ObjectExt::Is<IAutoShape>(shape))
        {
            auto autoShape = System::AsCast<IAutoShape>(shape);
            for (const auto& paragraph : autoShape->get_TextFrame()->get_Paragraphs())
            {
                for (const auto& portion : paragraph->get_Portions())
                {
                    // Cambia el texto
                    portion->set_Text(portion->get_Text().Replace(u"years", u"months"));
                    // Cambia el formato
                    portion->get_PortionFormat()->set_FontBold(NullableBool::True);
                }
            }
        }
    }
}

// Guarda la presentación modificada
pres->Save(u"text-changed.pptx", SaveFormat::Pptx);

Añadir un cuadro de texto con hipervínculo

Puedes insertar un enlace dentro de un cuadro de texto. Cuando se hace clic en el cuadro de texto, los usuarios son dirigidos a abrir el enlace.

Para añadir un cuadro de texto que contenga un enlace, sigue estos pasos:

  1. Crea una instancia de la clase Presentation.
  2. Obtén una referencia a la primera diapositiva de la presentación recién creada.
  3. Añade un objeto AutoShape con ShapeType establecido como Rectangle en una posición especificada de la diapositiva y obtén una referencia al objeto AutoShape recién añadido.
  4. Añade un TextFrame al objeto AutoShape que contenga Aspose TextBox como texto predeterminado.
  5. Instancia la clase IHyperlinkManager.
  6. Asigna el objeto IHyperlinkManager al método set_HyperlinkClick asociado con la porción preferida del TextFrame.
  7. Finalmente, escribe el archivo PPTX mediante el objeto Presentation.

Este código C++—una implementación de los pasos anteriores—muestra cómo añadir un cuadro de texto con hipervínculo a una diapositiva:

// Instancia una clase Presentation que representa un PPTX
// Obtiene la primera diapositiva de la presentación
// Añade un objeto AutoShape con el tipo establecido como Rectangle
// Convierte la forma a AutoShape
// Accede a la propiedad ITextFrame asociada con el AutoShape
// Añade algo de texto al marco
// Establece el hipervínculo para el texto de la porción
// Guarda la presentación PPTX
auto presentation = System::MakeObject<Presentation>();

auto slide = presentation->get_Slides()->idx_get(0);

auto shape = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 150.0f, 150.0f, 150.0f, 50.0f);

auto autoShape = System::ExplicitCast<IAutoShape>(shape);

autoShape->AddTextFrame(u"");

auto textFrame = autoShape->get_TextFrame();

textFrame->get_Paragraphs()->idx_get(0)->get_Portions()->idx_get(0)->set_Text(u"Aspose.Slides");

auto linkManager = textFrame->get_Paragraphs()->idx_get(0)->get_Portions()->idx_get(0)->get_PortionFormat()->get_HyperlinkManager();
linkManager->SetExternalHyperlinkClick(u"http://www.aspose.com");

presentation->Save(u"hLinkPPTX_out.pptx", SaveFormat::Pptx);

FAQ

¿Cuál es la diferencia entre un cuadro de texto y un marcador de posición de texto al trabajar con diapositivas maestras?

Un placeholder hereda estilo/posición de la master y puede sobrescribirse en los layouts, mientras que un cuadro de texto normal es un objeto independiente en una diapositiva específica y no cambia al cambiar de layout.

¿Cómo puedo realizar un reemplazo masivo de texto en toda la presentación sin afectar el texto dentro de gráficos, tablas y SmartArt?

Limita tu iteración a autoformas que tengan marcos de texto y excluye los objetos incrustados (charts, tables, SmartArt) recorriendo sus colecciones por separado o omitiendo esos tipos de objetos.