Szövegdobozok kezelése prezentációkban C++ használatával
Bevezetés
Az Aspose.Slides for C++-ban a diák szövege szövegkeretekben tárolódik, amelyek alakzatokhoz tartoznak. A IAutoShape interfész a leggyakoribb szöveget tartalmazó alakzatot képviseli, és a szövegét a IAutoShape::get_TextFrame metódussal teszi elérhetővé.
Megjegyzés
Minden automatikus alakzat megvalósítja az IShape interfészt, de nem minden alakzat automatikus alakzat vagy támogat szövegkeretet. Egy meglévő prezentáció feldolgozásakor ellenőrizze, hogy az alakzat implementálja‑e az IAutoShape interfészt, mielőtt hozzáférne a szövegéhez.Szövegdoboz létrehozása egy dián
Egy szövegdoboz létrehozásához adjon egy automatikus alakzatot a diához, szöveget adjon a szövegkeretéhez, majd mentse a prezentációt. A következő példa egy téglalap alakú szövegdobozt hoz létre:
#include <DOM/IAutoShape.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <DOM/ShapeType.h>
#include <Export/SaveFormat.h>
#include <system/shared_ptr.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System;
auto presentation = MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);
auto textBox = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 150, 75, 300, 50);
textBox->AddTextFrame(u"Aspose TextBox");
presentation->Save(u"TextBox.pptx", SaveFormat::Pptx);
A IShapeCollection::AddAutoShape‑nek átadott koordinátákat és méreteket pontokban mérik. Az IAutoShape::AddTextFrame inicializálja a szövegkeretet a megadott szöveggel.
Szövegdoboz alakzat ellenőrzése
Használja az IAutoShape::get_IsTextBox metódust annak meghatározására, hogy egy automatikus alakzat szövegdobozként kezelhető‑e. Ez hasznos, ha egy prezentáció szöveget tartalmazó és kizárólag grafikus automatikus alakzatokat egyaránt tartalmaz.

A következő példa minden automatikus alakzatot vizsgál meg egy prezentációban:
#include <DOM/IAutoShape.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/ISlideCollection.h>
#include <DOM/Presentation.h>
#include <DOM/ShapeType.h>
#include <system/console.h>
#include <system/enumerator_adapter.h>
#include <system/object_ext.h>
#include <system/shared_ptr.h>
using namespace Aspose::Slides;
using namespace System;
auto presentation = MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);
auto textBox = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 10, 10, 120, 40);
textBox->AddTextFrame(u"Text box");
slide->get_Shapes()->AddAutoShape(ShapeType::Ellipse, 150, 10, 40, 40);
for (const auto& currentSlide : IterateOver(presentation->get_Slides()))
{
for (const auto& shape : IterateOver(currentSlide->get_Shapes()))
{
auto autoShape = AsCast<IAutoShape>(shape);
if (autoShape != nullptr)
{
Console::WriteLine(autoShape->get_IsTextBox() ? u"The shape is a text box." : u"The shape is not a text box.");
}
}
}
Egy újonnan hozzáadott automatikus alakzat nem tekinthető szövegdoboznak, amíg nem tartalmaz nem üres szöveget. Ezt a szöveget megadhatja az IAutoShape::AddTextFrame vagy az ITextFrame::set_Text segítségével. Üres karakterlánc hozzáadása vagy hozzárendelése azt eredményezi, hogy az IAutoShape::get_IsTextBox false értéket ad vissza:
#include <DOM/IAutoShape.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/ITextFrame.h>
#include <DOM/Presentation.h>
#include <DOM/ShapeType.h>
#include <system/console.h>
#include <system/shared_ptr.h>
using namespace Aspose::Slides;
using namespace System;
auto presentation = MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);
auto shape1 = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 10, 10, 100, 40);
shape1->AddTextFrame(u"Shape 1");
Console::WriteLine(shape1->get_IsTextBox());
auto shape2 = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 10, 70, 100, 40);
shape2->get_TextFrame()->set_Text(u"Shape 2");
Console::WriteLine(shape2->get_IsTextBox());
auto shape3 = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 10, 130, 100, 40);
shape3->AddTextFrame(u"");
Console::WriteLine(shape3->get_IsTextBox());
auto shape4 = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 10, 190, 100, 40);
shape4->get_TextFrame()->set_Text(u"");
Console::WriteLine(shape4->get_IsTextBox());
Az első két ellenőrzés true‑t ad vissza; az utolsó két false‑t.
Szövegkeretet birtokló alakzat megtalálása
Általános szövegfeldolgozó kód megkaphat egy ITextFrame-et anélkül, hogy tudná, melyik prezentációs objektum tartalmazza. Használja az ITextFrame::get_ParentShape metódust a tulajdonos IShape-hez való visszavezetéshez.
Ha a szövegkeret egy automatikus alakzat vagy más szöveget tartalmazó alakzat tulajdona, az ITextFrame::get_ParentShape visszaadja a tulajdonost, míg az ITextFrame::get_ParentCell nullptr‑t ad. Mindkét metódus csak olvasási célú navigációt biztosít. A visszaadott értéket ellenőrizze nullptr‑ra, mielőtt felhasználná. Az alakzat‑ és táblacella‑tulajdonosok egyidejű azonosításához, beleértve a SmartArt‑csomópontokhoz kapcsolódó alakzatokat, lásd a Keresés és csere szöveg oldalt.
Oszlopok hozzáadása egy szövegdobozhoz
Az ITextFrameFormat::set_ColumnCount metódus a szövegkeretet oszlopokra osztja, míg az ITextFrameFormat::set_ColumnSpacing beállítja az oszlopok közti távolságot pontokban. Mindkét metódus az ITextFrameFormat része, és egy meglévő szövegdoboz szövegkeretén keresztül hívható. A szöveg az oszlopok között ugyanazon alakzaton belül újraoszlik; nem folytatódik egy másik alakzatba.
A következő példa egy háromoszlopos szövegdobozt hoz létre, amelynek oszlopai között 10 pont távolság van, elmenti a prezentációt, és visszaolvassa a beállításokat a kimeneti fájlból:
#include <DOM/IAutoShape.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/ITextFrame.h>
#include <DOM/ITextFrameFormat.h>
#include <DOM/Presentation.h>
#include <DOM/ShapeType.h>
#include <Export/SaveFormat.h>
#include <system/console.h>
#include <system/object_ext.h>
#include <system/shared_ptr.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System;
auto presentation = MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);
auto textBox = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 100, 100, 300, 200);
textBox->AddTextFrame(u"This text is distributed automatically across all columns in the text box.");
auto textFrameFormat = textBox->get_TextFrame()->get_TextFrameFormat();
textFrameFormat->set_ColumnCount(3);
textFrameFormat->set_ColumnSpacing(10);
presentation->Save(u"TextBoxColumns.pptx", SaveFormat::Pptx);
auto savedPresentation = MakeObject<Presentation>(u"TextBoxColumns.pptx");
auto savedTextBox = ExplicitCast<IAutoShape>(savedPresentation->get_Slide(0)->get_Shape(0));
auto savedFormat = savedTextBox->get_TextFrame()->get_TextFrameFormat();
Console::WriteLine(u"Columns: {0}; spacing: {1} points", savedFormat->get_ColumnCount(), savedFormat->get_ColumnSpacing());
Szöveg kinyerése egyes oszlopokból
Használja az ITextFrame::SplitTextByColumns metódust, hogy visszanyerje az egyes vizuális oszlopokhoz rendelt szöveget egy meglévő szövegkeretben. A metódus minden oszlophoz egy karakterláncot ad vissza, oszlop‑alapú olvasási sorrendben. Egy egyoszlopos szövegkeret egy elemmel rendelkező tömböt eredményez, és egy üres oszlop egy üres karakterlánccal van reprezentálva. A karakterláncok csak egyszerű szöveget tartalmaznak; a részlet‑szintű formázás nem marad meg.
Ez akkor hasznos, ha:
- Szöveget kell kinyerni úgy, hogy megmaradjon az oszlop‑alapú olvasási sorrend.
- Többoszlopos diák tartalmát indexelni vagy összehasonlítani kívánja.
- Minden oszlopot külön fájlba, adatbázismezőbe vagy más célba szeretné exportálni.
- Szeretné ellenőrizni, hogyan oszlik újra a szöveg az oszlopszám [ITextFrameFormat::set_ColumnCount] vagy a távolság [ITextFrameFormat::set_ColumnSpacing] beállítása, illetve a betűtípus vagy a szövegkeret méretének módosítása után.
A metódus a jelenlegi ITextFrame‑ben elosztott szöveget jelenti; nem folyik automatikusan szöveg más alakzatok vagy szövegdobozok közé. Az oszlopeloszlás függhet a rendelkezésre álló betűtípusoktól és egyéb szöveg‑elrendezési beállításoktól, ezért győződjön meg róla, hogy a szükséges betűtípusok elérhetők, ha konzisztens eredményre van szükség.
#include <DOM/IAutoShape.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/ITextFrame.h>
#include <DOM/ITextFrameFormat.h>
#include <DOM/Presentation.h>
#include <system/array.h>
#include <system/console.h>
#include <system/enumerator_adapter.h>
#include <system/io/file.h>
#include <system/object_ext.h>
#include <system/shared_ptr.h>
#include <system/string.h>
using namespace Aspose::Slides;
using namespace System;
using namespace System::IO;
auto presentation = MakeObject<Presentation>(u"MultiColumnText.pptx");
SharedPtr<IAutoShape> textBox = nullptr;
for (const auto& shape : IterateOver(presentation->get_Slide(0)->get_Shapes()))
{
auto autoShape = AsCast<IAutoShape>(shape);
if (autoShape != nullptr && autoShape->get_TextFrame() != nullptr)
{
auto columnCount = autoShape->get_TextFrame()->get_TextFrameFormat()->get_ColumnCount();
if (columnCount > 1)
{
textBox = autoShape;
break;
}
}
}
if (textBox == nullptr)
{
Console::WriteLine(u"No multi-column text frame was found.");
}
else
{
auto textFrame = textBox->get_TextFrame();
auto configuredColumnCount = textFrame->get_TextFrameFormat()->get_ColumnCount();
auto columnTexts = textFrame->SplitTextByColumns();
Console::WriteLine(u"Configured columns: {0}", configuredColumnCount);
for (auto columnIndex = 0; columnIndex < columnTexts->get_Length(); columnIndex++)
{
auto columnNumber = columnIndex + 1;
auto columnText = columnTexts->idx_get(columnIndex);
Console::WriteLine(u"Column {0}: {1}", columnNumber, columnText);
auto fileName = String::Format(u"Column-{0}.txt", columnNumber);
File::WriteAllText(fileName, columnText);
}
}
Szöveg frissítése
A szöveg frissítéséhez egy prezentáción belül iteráljon a diákon és alakzatokon, válassza ki az automatikus alakzatokat, majd szerkessze a szövegrészeiket. A részlet‑szintű munkavégzés lehetővé teszi a szöveg és a karakterformázás együttes módosítását.
#include <DOM/IAutoShape.h>
#include <DOM/IParagraph.h>
#include <DOM/IParagraphCollection.h>
#include <DOM/IPortion.h>
#include <DOM/IPortionCollection.h>
#include <DOM/IPortionFormat.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/ISlideCollection.h>
#include <DOM/ITextFrame.h>
#include <DOM/NullableBool.h>
#include <DOM/Presentation.h>
#include <Export/SaveFormat.h>
#include <system/enumerator_adapter.h>
#include <system/object_ext.h>
#include <system/shared_ptr.h>
#include <system/string.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System;
auto presentation = MakeObject<Presentation>(u"Text.pptx");
for (const auto& slide : IterateOver(presentation->get_Slides()))
{
for (const auto& shape : IterateOver(slide->get_Shapes()))
{
auto autoShape = AsCast<IAutoShape>(shape);
if (autoShape == nullptr || autoShape->get_TextFrame() == nullptr)
{
continue;
}
for (const auto& paragraph : IterateOver(autoShape->get_TextFrame()->get_Paragraphs()))
{
for (const auto& portion : IterateOver(paragraph->get_Portions()))
{
auto text = portion->get_Text();
if (!String::IsNullOrEmpty(text) && text.Contains(u"years"))
{
portion->set_Text(text.Replace(u"years", u"months"));
portion->get_PortionFormat()->set_FontBold(NullableBool::True);
}
}
}
}
}
presentation->Save(u"TextChanged.pptx", SaveFormat::Pptx);
Ez a bejárás csak az automatikus alakzatok szövegét módosítja. A táblákban, diagramokban, SmartArt‑ban vagy csoportos alakzatokban tárolt szöveg módosításához azok gyűjteményeit kell bejárni.
Szövegdoboz hozzáadása hiperhivatkozással
Hiperhivatkozást hozzárendelhet egy adott szövegrészlethez, így csak ez a szöveg lesz kattintható link. Használja az IHyperlinkManager::SetExternalHyperlinkClick metódust a részlet külső URL‑hez való kapcsolásához.
#include <DOM/IAutoShape.h>
#include <DOM/IHyperlinkManager.h>
#include <DOM/IParagraph.h>
#include <DOM/IPortion.h>
#include <DOM/IPortionFormat.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/ITextFrame.h>
#include <DOM/Presentation.h>
#include <DOM/ShapeType.h>
#include <Export/SaveFormat.h>
#include <system/shared_ptr.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System;
auto presentation = MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);
auto textBox = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 150, 150, 200, 50);
textBox->AddTextFrame(u"Aspose.Slides");
auto textPortion = textBox->get_TextFrame()->get_Paragraph(0)->get_Portion(0);
textPortion->get_PortionFormat()->get_HyperlinkManager()->SetExternalHyperlinkClick(u"https://www.aspose.com/");
presentation->Save(u"Hyperlink.pptx", SaveFormat::Pptx);
GYIK
Mi a különbség egy szövegdoboz és egy szöveggelőtag között egy mester‑ vagy elrendezés‑dián?
A placeholder örökölheti a pozícióját és formázását egy master slide vagy layout slide‑ról. Egy szabályos szövegdoboz független alakzat a dián, ahol létrehozták, és nem kap placeholder‑szerű viselkedést, ha az elrendezés megváltozik.
Hogyan cserélhetem le a szöveget anélkül, hogy a diagramok, táblák vagy SmartArt szövegét megváltoztatnám?
Korlátozza a bejárást csak azokra az alakzatokra, amelyek implementálják az IAutoShape‑t, ahogyan az a Szöveg frissítése példában látható. A diagramok, táblák és SmartArt saját objektummodellekben tárolják a szöveget, ezért az a ciklus nem módosítja őket.