Szövegdobozok kezelése prezentációkban PHP segítségével
Bevezetés
Az Aspose.Slides for PHP via Java esetében a dia szövegét szövegkeretekben tárolják, amelyek alakzatokhoz tartoznak. Az AutoShape osztály a leggyakoribb szöveget tartalmazó alakzatot képviseli, és a szöveget a AutoShape::getTextFrame metóduson keresztül teszi elérhetővé.
Note
Minden automatikus alakzat a Shape osztályból származik, de nem minden alakzat automatikus alakzat, vagy támogatja a szövegkeretet. Egy meglévő prezentáció feldolgozásakor használja ajava_instanceof-t, hogy ellenőrizze, egy alakzat AutoShape típusú-e, mielőtt hozzáférne a szövegéhez.
Szövegdoboz létrehozása egy dián
Szövegdoboz létrehozásához adjon egy automatikus alakzatot a diára, szúrja be a szöveget a szövegkeretébe, és mentse a prezentációt. Az alábbi példa egy téglalap alakú szövegdobozt hoz létre:
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
use aspose\slides\ShapeType;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$textBox = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 150, 75, 300, 50);
$textBox->addTextFrame("Aspose TextBox");
$presentation->save("TextBox.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
A ShapeCollection::addAutoShape metódusnak átadott koordinátákat és méreteket pontban mérik. Az AutoShape::addTextFrame a szövegkeretet a megadott szöveggel inicializálja.
Ellenőrzés szövegdoboz alakzatra
Használja az AutoShape::isTextBox metódust annak meghatározására, hogy egy automatikus alakzat szövegdobozként van-e kezelve. Ez akkor hasznos, ha egy prezentáció szöveget tartalmazó és kizárólag grafikus automatikus alakzatokat is tartalmaz.

Az alábbi példa minden automatikus alakzatot vizsgál meg egy prezentációban:
use aspose\slides\Presentation;
use aspose\slides\ShapeType;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$textBox = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 10, 120, 40);
$textBox->addTextFrame("Text box");
$slide->getShapes()->addAutoShape(ShapeType::Ellipse, 150, 10, 40, 40);
$autoShapeClass = new JavaClass("com.aspose.slides.AutoShape");
for ($slideIndex = 0; $slideIndex < java_values($presentation->getSlides()->size()); $slideIndex++) {
$currentSlide = $presentation->getSlides()->get_Item($slideIndex);
for ($shapeIndex = 0; $shapeIndex < java_values($currentSlide->getShapes()->size()); $shapeIndex++) {
$shape = $currentSlide->getShapes()->get_Item($shapeIndex);
if (java_instanceof($shape, $autoShapeClass)) {
echo (java_is_true($shape->isTextBox()) ? "The shape is a text box." : "The shape is not a text box.") . PHP_EOL;
}
}
}
} finally {
$presentation->dispose();
}
Az újonnan hozzáadott automatikus alakzat nem tekinthető szövegdoboznak, amíg nem tartalmaz nem üres szöveget. A szöveget megadhatja az AutoShape::addTextFrame vagy a TextFrame::setText segítségével. Üres karakterlánc hozzáadása vagy hozzárendelése azt eredményezi, hogy az AutoShape::isTextBox false értékkel tér vissza:
use aspose\slides\Presentation;
use aspose\slides\ShapeType;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$shape1 = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 10, 100, 40);
$shape1->addTextFrame("Shape 1");
echo (java_is_true($shape1->isTextBox()) ? "true" : "false") . PHP_EOL;
$shape2 = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 70, 100, 40);
$shape2->getTextFrame()->setText("Shape 2");
echo (java_is_true($shape2->isTextBox()) ? "true" : "false") . PHP_EOL;
$shape3 = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 130, 100, 40);
$shape3->addTextFrame("");
echo (java_is_true($shape3->isTextBox()) ? "true" : "false") . PHP_EOL;
$shape4 = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 190, 100, 40);
$shape4->getTextFrame()->setText("");
echo (java_is_true($shape4->isTextBox()) ? "true" : "false") . PHP_EOL;
} finally {
$presentation->dispose();
}
Az első két hívás true-t, az utolsó két hívás false-t ír ki.
A szövegkeretet birtokló alakzat megtalálása
Általános szövegfeldolgozó kód kaphat egy TextFrame objektumot anélkül, hogy tudná, melyik prezentációs objektum tartalmazza. Használja az csak olvasható TextFrame::getParentShape metódust, hogy visszalépjen a tulajdonos Shape objektumra.
Egy automatikus alakzat vagy más szöveget tartalmazó alakzat által birtokolt szövegkeret esetén a TextFrame::getParentShape a tulajdonost adja vissza, míg a TextFrame::getParentCell null-t ad. A visszakapott értéket ellenőrizze a java_is_null használatával, mielőtt hozzáférne. A forma és táblacella tulajdonosok, beleértve a SmartArt csomópontokhoz kapcsolódó alakzatok azonosításához lásd a Search and Replace Text oldalt.
Oszlopok hozzáadása egy szövegdobozhoz
A TextFrameFormat::setColumnCount metódus oszlopokra osztja a szövegkeretet, míg a TextFrameFormat::setColumnSpacing a pontban megadott oszloptávolságot állítja be. Mindkét beállítás a TextFrameFormat része, és egy meglévő szövegdoboz szövegkeretén keresztül módosítható. A szöveg áramlik az oszlopok között ugyanazon alakzaton belül; nem folytatódik egy másik alakzatba.
Az alábbi példa egy háromoszlopos szövegdobozt hoz létre 10 pont oszloptávolsággal, menti a prezentációt, és visszaolvassa a tárolt beállításokat a kimeneti fájlból:
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
use aspose\slides\ShapeType;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$textBox = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, 300, 200);
$textBox->addTextFrame("This text is distributed automatically across all columns in the text box.");
$textFrameFormat = $textBox->getTextFrame()->getTextFrameFormat();
$textFrameFormat->setColumnCount(3);
$textFrameFormat->setColumnSpacing(10);
$presentation->save("TextBoxColumns.pptx", SaveFormat::Pptx);
$savedPresentation = new Presentation("TextBoxColumns.pptx");
try {
$savedTextBox = $savedPresentation->getSlides()->get_Item(0)->getShapes()->get_Item(0);
$savedFormat = $savedTextBox->getTextFrame()->getTextFrameFormat();
echo "Columns: " . java_values($savedFormat->getColumnCount()) . "; spacing: " . java_values($savedFormat->getColumnSpacing()) . " points" . PHP_EOL;
} finally {
$savedPresentation->dispose();
}
} finally {
$presentation->dispose();
}
Szöveg kinyerése egyes oszlopokból
Használja a TextFrame::splitTextByColumns metódust, hogy egy meglévő szövegkeretben minden vizuális oszlophoz hozzárendelt szöveget lekérje. 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 ad, egy üres oszlop pedig egy üres karakterlánc lesz. A karakterláncok csak egyszerű szöveget tartalmaznak; a részlet-szintű formázás nem marad meg.
Ez akkor hasznos, ha a következőkre van szükség:
- Szöveg kinyerése az oszloptáblázott olvasási sorrend megőrzésével.
- Többoszlopos diák tartalmának indexelése vagy összehasonlítása.
- Minden oszlop exportálása külön fájlba, adatbázismezőbe vagy más célhelyre.
- Ellenőrizze, hogyan oszlik újra a szöveg az oszlopszám (TextFrameFormat::setColumnCount), a távolság (TextFrameFormat::setColumnSpacing), a betűtípus vagy a szövegkeret méretének módosítása után.
A metódus a jelenlegi TextFrame keretben elosztott szöveget jelenti; nem automatikusan tölti át a szöveget különálló alakzatok vagy szövegdobozok között. Az oszlopeloszlás függhet a rendelkezésre álló betűtípusoktól és egyéb szövegelrendezési beállításoktól, ezért ügyeljen arra, hogy a szükséges betűtípusok elérhetők legyenek, ha konzisztens eredmények fontosak.
Az alábbi példa betölt egy prezentációt, megtalálja az első többoszlopos automatikus alakzatot szövegkerettel, kiolvassa a beállított oszlopszámot, és minden oszlop szövegét külön fájlba írja. Azok az alakzatok, amelyek nem rendelkeznek szövegkerettel, átugorásra kerülnek.
use aspose\slides\Presentation;
$presentation = new Presentation("MultiColumnText.pptx");
try {
$textBox = null;
$autoShapeClass = new JavaClass("com.aspose.slides.AutoShape");
$shapes = $presentation->getSlides()->get_Item(0)->getShapes();
for ($shapeIndex = 0; $shapeIndex < java_values($shapes->size()); $shapeIndex++) {
$shape = $shapes->get_Item($shapeIndex);
if (java_instanceof($shape, $autoShapeClass)) {
$textFrame = $shape->getTextFrame();
if (!java_is_null($textFrame)) {
$columnCount = java_values($textFrame->getTextFrameFormat()->getColumnCount());
if ($columnCount > 1) {
$textBox = $shape;
break;
}
}
}
}
if ($textBox === null) {
echo "No multi-column text frame was found." . PHP_EOL;
} else {
$textFrame = $textBox->getTextFrame();
$configuredColumnCount = java_values($textFrame->getTextFrameFormat()->getColumnCount());
$columnTexts = java_values($textFrame->splitTextByColumns());
echo "Configured columns: " . $configuredColumnCount . PHP_EOL;
foreach ($columnTexts as $columnIndex => $columnText) {
$columnNumber = $columnIndex + 1;
echo "Column " . $columnNumber . ": " . $columnText . PHP_EOL;
$outputPath = "Column-" . $columnNumber . ".txt";
$bytesWritten = file_put_contents($outputPath, $columnText);
if ($bytesWritten === false) {
echo "Could not write column " . $columnNumber . " to " . $outputPath . PHP_EOL;
}
}
}
} finally {
$presentation->dispose();
}
Szöveg frissítése
A szöveg frissítéséhez egy prezentációban járja végig a diák és alakzatok sorozatát, válassza ki az automatikus alakzatokat, majd szerkessze azok szövegrétegeit. A részlet-szintű munka lehetővé teszi a szöveg és a karakterformázás egyidejű módosítását.
Az alábbi példa minden years előfordulást months-re cserél az automatikus alakzatok szövegében, és minden érintett részt félkövérre állít:
use aspose\slides\NullableBool;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation("Text.pptx");
try {
$autoShapeClass = new JavaClass("com.aspose.slides.AutoShape");
for ($slideIndex = 0; $slideIndex < java_values($presentation->getSlides()->size()); $slideIndex++) {
$slide = $presentation->getSlides()->get_Item($slideIndex);
for ($shapeIndex = 0; $shapeIndex < java_values($slide->getShapes()->size()); $shapeIndex++) {
$shape = $slide->getShapes()->get_Item($shapeIndex);
if (!java_instanceof($shape, $autoShapeClass)) {
continue;
}
$textFrame = $shape->getTextFrame();
if (java_is_null($textFrame)) {
continue;
}
for ($paragraphIndex = 0; $paragraphIndex < java_values($textFrame->getParagraphs()->getCount()); $paragraphIndex++) {
$paragraph = $textFrame->getParagraphs()->get_Item($paragraphIndex);
for ($portionIndex = 0; $portionIndex < java_values($paragraph->getPortions()->getCount()); $portionIndex++) {
$portion = $paragraph->getPortions()->get_Item($portionIndex);
$text = java_values($portion->getText());
if ($text !== null && strpos($text, "years") !== false) {
$updatedText = str_replace("years", "months", $text);
$portion->setText($updatedText);
$portion->getPortionFormat()->setFontBold(NullableBool::True);
}
}
}
}
}
$presentation->save("TextChanged.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
Ez az átfutás csak az automatikus alakzatok szövegét frissíti. A táblákban, diagramokban, SmartArt-ban vagy csoportosított alakzatokban tárolt szöveg az adott objektumok saját gyűjteményének bejárását igényli.
Szövegdoboz hozzáadása hiperhivatkozással
A hiperhivatkozás egy adott szövegrétegre rendeltethető, így csak az a szöveg lesz kattintható link. Használja a HyperlinkManager::setExternalHyperlinkClick metódust, hogy a részt egy külső URL-re kapcsolja.
Az alábbi példa linkelt szöveget hoz létre és elmenti egy prezentációba:
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
use aspose\slides\ShapeType;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$textBox = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 150, 150, 200, 50);
$textBox->addTextFrame("Aspose.Slides");
$textPortion = $textBox->getTextFrame()->getParagraphs()->get_Item(0)->getPortions()->get_Item(0);
$textPortion->getPortionFormat()->getHyperlinkManager()->setExternalHyperlinkClick("https://www.aspose.com/");
$presentation->save("Hyperlink.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
GYIK
Mi a különbség egy szövegdoboz és egy szöveghelyőrző között egy fő- vagy elrendezési dián?
Egy placeholder örökölheti pozícióját és formázását egy master slide vagy layout slide részéről. Egy szabályos szövegdoboz egy önálló alakzat a dián, ahol létrejött, és nem kap helyőrző viselkedést, amikor az elrendezés változik.
Hogyan cserélhetem ki a szöveget anélkül, hogy a diagramok, táblák vagy SmartArt szövegét módosítanám?
Szűkítse a bejárást csak az AutoShape objektumokra, ahogyan az a Szöveg frissítése példában látható. A diagramok, táblák és a SmartArt saját objektummodelljeikben tárolják a szöveget, ezért az a ciklus nem módosítja őket.