Manage Text Boxes in Presentations Using C++

Wprowadzenie

Teksty na slajdach zazwyczaj istnieją w polach tekstowych lub kształtach. Dlatego, aby dodać tekst do slajdu, musisz dodać pole tekstowe i następnie umieścić w nim tekst. Aspose.Slides for C++ udostępnia interfejs IAutoShape, który pozwala dodać kształt zawierający tekst.

Utworzenie pola tekstowego na slajdzie

Aby utworzyć pole tekstowe na slajdzie, wykonaj następujące kroki:

  1. Utwórz instancję klasy Presentation.
  2. Uzyskaj referencję do pierwszego slajdu w nowo utworzonej prezentacji.
  3. Dodaj obiekt IAutoShape z ShapeType ustawionym na Rectangle w określonej pozycji na slajdzie i uzyskaj referencję do nowo dodanego obiektu IAutoShape.
  4. Dodaj właściwość TextFrame do obiektu IAutoShape, która będzie zawierać tekst. W poniższym przykładzie dodaliśmy tekst: Aspose TextBox
  5. Na koniec zapisz plik PPTX przy użyciu obiektu Presentation.

Ten kod C++ — implementacja powyższych kroków — pokazuje, jak dodać tekst do slajdu:

// Tworzy instancję Presentation
auto pres = System::MakeObject<Presentation>();

// Pobiera pierwszy slajd w prezentacji
auto sld = pres->get_Slides()->idx_get(0);

// Dodaje AutoShape z typem ustawionym na Rectangle
auto ashp = sld->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 150.0f, 75.0f, 150.0f, 50.0f);

// Dodaje TextFrame do Rectangle
ashp->AddTextFrame(u" ");

// Uzyskuje dostęp do ramki tekstowej
auto txtFrame = ashp->get_TextFrame();

// Tworzy obiekt Paragraph dla ramki tekstowej
auto para = txtFrame->get_Paragraphs()->idx_get(0);

// Tworzy obiekt Portion dla akapitu
auto portion = para->get_Portions()->idx_get(0);

// Ustawia tekst
portion->set_Text(u"Aspose TextBox");

// Zapisuje prezentację na dysk
pres->Save(u"TextBox_out.pptx", SaveFormat::Pptx);

Sprawdzenie, czy kształt jest polem tekstowym

Aspose.Slides udostępnia metodę get_IsTextBox z interfejsu IAutoShape, umożliwiającą badanie kształtów i identyfikację pól tekstowych.

Text box and shape

Ten kod C++ pokazuje, jak sprawdzić, czy kształt został utworzony jako pole tekstowe:

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();

Zauważ, że jeśli po prostu dodasz autokształt metodą AddAutoShape z interfejsu IShapeCollection, metoda get_IsTextBox tego autokształtu zwróci false. Jednak po dodaniu tekstu do autokształtu metodą AddTextFrame lub metodą set_Text, metoda get_IsTextBox zwróci 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() zwraca false
shape1->AddTextFrame(u"shape 1");
// shape1->get_IsTextBox() zwraca true

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

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

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

Dodawanie kolumn do pola tekstowego

Aspose.Slides udostępnia metody set_ColumnCount i set_ColumnSpacing (z interfejsu ITextFrameFormat oraz klasy TextFrameFormat), które pozwalają dodać kolumny do pól tekstowych. Możesz określić liczbę kolumn w polu tekstowym oraz ustawić odstęp w punktach między kolumnami.

Ten kod w C++ demonstruje opisaną operację:

auto presentation = System::MakeObject<Presentation>();
// Pobiera pierwszy slajd w prezentacji
auto slide = presentation->get_Slides()->idx_get(0);

// Dodaje AutoShape z typem ustawionym na Rectangle
auto aShape = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 100.0f, 100.0f, 300.0f, 300.0f);

// Dodaje TextFrame do prostokąta
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!");

// Pobiera format tekstu z TextFrame
auto format = aShape->get_TextFrame()->get_TextFrameFormat();

// Określa liczbę kolumn w TextFrame
format->set_ColumnCount(3);

// Określa odstęp między kolumnami
format->set_ColumnSpacing(10);

// Zapisuje prezentację
presentation->Save(u"ColumnCount.pptx", SaveFormat::Pptx);

Dodawanie kolumn do ramki tekstowej

Aspose.Slides for C++ udostępnia metodę set_ColumnCount (z interfejsu ITextFrameFormat), która pozwala dodać kolumny w ramkach tekstowych. Dzięki tej metodzie możesz określić preferowaną liczbę kolumn w ramce tekstowej.

Ten kod C++ pokazuje, jak dodać kolumnę wewnątrz ramki tekstowej:

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());
}

Aktualizacja tekstu

Aspose.Slides pozwala zmienić lub zaktualizować tekst zawarty w polu tekstowym lub wszystkie teksty w prezentacji.

Ten kod C++ demonstruje operację, w której wszystkie teksty w prezentacji są aktualizowane lub zmieniane:

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())
                {
                    //Modyfikuje tekst
                    portion->set_Text(portion->get_Text().Replace(u"years", u"months"));
                    //Modyfikuje formatowanie
                    portion->get_PortionFormat()->set_FontBold(NullableBool::True);
                }
            }
        }
    }
}

//Zapisuje zmodyfikowaną prezentację
pres->Save(u"text-changed.pptx", SaveFormat::Pptx);

Dodanie pola tekstowego z hiperłączem

Możesz wstawić link wewnątrz pola tekstowego. Po kliknięciu pola tekstowego użytkownicy są kierowani do otwarcia linku.

Aby dodać pole tekstowe zawierające link, wykonaj następujące kroki:

  1. Utwórz instancję klasy Presentation.
  2. Uzyskaj referencję do pierwszego slajdu w nowo utworzonej prezentacji.
  3. Dodaj obiekt AutoShape z ShapeType ustawionym na Rectangle w określonej pozycji na slajdzie i uzyskaj referencję do nowo dodanego obiektu AutoShape.
  4. Dodaj TextFrame do obiektu AutoShape, który zawiera Aspose TextBox jako domyślny tekst.
  5. Zainstaluj klasę IHyperlinkManager.
  6. Przypisz obiekt IHyperlinkManager do metody set_HyperlinkClick powiązanej z wybraną częścią TextFrame.
  7. Na koniec zapisz plik PPTX przy użyciu obiektu Presentation.

Ten kod C++ — implementacja powyższych kroków — pokazuje, jak dodać pole tekstowe z hiperłączem do slajdu:

// Tworzy instancję klasy Presentation, która reprezentuje plik PPTX
auto presentation = System::MakeObject<Presentation>();

// Pobiera pierwszy slajd w prezentacji
auto slide = presentation->get_Slides()->idx_get(0);

// Dodaje obiekt AutoShape z typem ustawionym na Rectangle
auto shape = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 150.0f, 150.0f, 150.0f, 50.0f);

// Rzutuje kształt na AutoShape
auto autoShape = System::ExplicitCast<IAutoShape>(shape);

// Uzyskuje dostęp do własności ITextFrame powiązanej z AutoShape
autoShape->AddTextFrame(u"");

auto textFrame = autoShape->get_TextFrame();

// Dodaje tekst do ramki
textFrame->get_Paragraphs()->idx_get(0)->get_Portions()->idx_get(0)->set_Text(u"Aspose.Slides");

// Ustawia hiperłącze dla tekstu części
auto linkManager = textFrame->get_Paragraphs()->idx_get(0)->get_Portions()->idx_get(0)->get_PortionFormat()->get_HyperlinkManager();
linkManager->SetExternalHyperlinkClick(u"http://www.aspose.com");

// Zapisuje prezentację PPTX
presentation->Save(u"hLinkPPTX_out.pptx", SaveFormat::Pptx);

FAQ

Jaka jest różnica między polem tekstowym a symbolem zastępczym tekstu podczas pracy z master slajdami?

placeholder dziedziczy styl/pozycję z master i może być nadpisany na layouts, podczas gdy zwykłe pole tekstowe jest niezależnym obiektem na konkretnym slajdzie i nie zmienia się przy przełączaniu układów.

Jak mogę wykonać masową zamianę tekstu w całej prezentacji bez modyfikacji tekstu wewnątrz wykresów, tabel i SmartArt?

Ogranicz iterację do autokształtów, które mają ramki tekstowe, i wyklucz osadzone obiekty (charts, tables, SmartArt) poprzez przeglądanie ich kolekcji osobno lub pomijanie tych typów obiektów.