Beheer tekstvakken in presentaties met PHP
Inleiding
Teksten op dia’s staan doorgaans in tekstvakken of vormen. Daarom moet je, om tekst aan een dia toe te voegen, een tekstvak toevoegen en vervolgens tekst in dat vak plaatsen. Aspose.Slides for PHP via Java biedt de AutoShape‑klasse waarmee je een vorm met tekst kunt toevoegen.
Info
Aspose.Slides biedt ook de Shape‑klasse waarmee je vormen aan dia’s kunt toevoegen. Niet alle vormen die via deShape‑klasse worden toegevoegd, kunnen echter tekst bevatten. Vormen die via de AutoShape‑klasse worden toegevoegd, kunnen tekst bevatten.
Opmerking
Wanneer je met een vorm werkt waaraan je tekst wilt toevoegen, moet je controleren of deze is aangemaakt via deAutoShape‑klasse. Alleen dan kun je werken met TextFrame, een eigenschap van AutoShape. Zie de sectie Update Text op deze pagina.
Een tekstvak op een dia maken
Volg deze stappen om een tekstvak op een dia te maken:
- Maak een instantie van de Presentation‑klasse.
- Verkrijg een verwijzing naar de eerste dia in de nieuw aangemaakte presentatie.
- Voeg een AutoShape‑object toe met als
ShapeTypeRectangle op een opgegeven positie op de dia en krijg de referentie naar het zojuist toegevoegdeAutoShape‑object. - Voeg een
TextFrametoe aan hetAutoShape‑object dat de tekst zal bevatten. In het voorbeeld hieronder hebben we de tekst Aspose TextBox toegevoegd. - Schrijf ten slotte het PPTX‑bestand via het
Presentation‑object.
Deze PHP‑code – een implementatie van de bovenstaande stappen – laat zien hoe je tekst aan een dia kunt toevoegen:
# Maakt een instantie van Presentation
$pres = new Presentation();
try {
# Haalt de eerste dia in de presentatie op
$sld = $pres->getSlides()->get_Item(0);
# Voegt een AutoShape toe met type ingesteld op Rectangle
$ashp = $sld->getShapes()->addAutoShape(ShapeType::Rectangle, 150, 75, 150, 50);
# Voegt TextFrame toe aan de rechthoek
$ashp->addTextFrame(" ");
# Toegang tot het tekstframe
$txtFrame = $ashp->getTextFrame();
# Maakt het Paragraph‑object voor het tekstframe
$para = $txtFrame->getParagraphs()->get_Item(0);
# Maakt een Portion‑object voor de alinea
$portion = $para->getPortions()->get_Item(0);
# Stelt tekst in
$portion->setText("Aspose TextBox");
# Slaat de presentatie op naar schijf
$pres->save("TextBox_out.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Controleren of een vorm een tekstvak is
Aspose.Slides biedt de isTextBox‑methode van de AutoShape‑klasse, waarmee je vormen kunt onderzoeken en tekstvakken kunt identificeren.

Deze PHP‑code laat zien hoe je controleert of een vorm als tekstvak is aangemaakt:
class ShapeCallback {
function invoke($shape, $slide, $index) {
if (java_instanceof($shape, new JavaClass("com.aspose.slides.AutoShape"))) {
$autoShape = $shape;
echo(java_is_true($autoShape->isTextBox()) ? "shape is a text box" : "shape is not a text box");
}
}
}
$presentation = new Presentation("sample.pptx");
try {
$forEachShapeCallback = java_closure(new ShapeCallback(), null, java("com.aspose.slides.ForEachSlideCallback"));
ForEach::shape($presentation, $forEachShapeCallback);
} finally {
$presentation->dispose();
}
Let op: als je simpelweg een autoshape toevoegt met de addAutoShape‑methode van de ShapeCollection‑klasse, geeft de isTextBox‑methode van die autoshape false terug. Nadat je echter tekst aan de autoshape hebt toegevoegd via de addTextFrame‑methode of de setText‑methode, geeft de isTextBox‑eigenschap true terug.
$presentation = new Presentation();
$slide = $presentation->getSlides()->get_Item(0);
$shape1 = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 10, 100, 40);
// shape1->isTextBox() geeft false terug
$shape1->addTextFrame("shape 1");
// shape1->isTextBox() geeft true terug
$shape2 = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 110, 100, 40);
// shape2->isTextBox() geeft false terug
$shape2->getTextFrame()->setText("shape 2");
// shape2->isTextBox() geeft true terug
$shape3 = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 210, 100, 40);
// shape3->isTextBox() geeft false terug
$shape3->addTextFrame("");
// shape3->isTextBox() geeft false terug
$shape4 = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 310, 100, 40);
// shape4->isTextBox() geeft false terug
$shape4->getTextFrame()->setText("");
// shape4->isTextBox() geeft false terug
Kolommen aan een tekstvak toevoegen
Aspose.Slides biedt de setColumnCount‑ en setColumnSpacing‑methoden van de TextFrameFormat‑klasse, waarmee je kolommen aan tekstvakken kunt toevoegen. Je kunt het aantal kolommen in een tekstvak opgeven en de afstand tussen kolommen (in points) instellen.
Deze code demonstreert de beschreven bewerking:
$pres = new Presentation();
try {
# Krijgt de eerste dia in de presentatie
$slide = $pres->getSlides()->get_Item(0);
# Voegt een AutoShape toe met type ingesteld op Rectangle
$aShape = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, 300, 300);
# Voegt TextFrame toe aan de rechthoek
$aShape->addTextFrame("All these columns are limited to be within a single text container -- " . "you can add or delete text and the new or remaining text automatically adjusts " . "itself to flow within the container. You cannot have text flow from one container " . "to other though -- we told you PowerPoint's column options for text are limited!");
# Haalt het tekstformaat van TextFrame op
$format = $aShape->getTextFrame()->getTextFrameFormat();
# Specificeert het aantal kolommen in TextFrame
$format->setColumnCount(3);
# Specificeert de afstand tussen kolommen
$format->setColumnSpacing(10);
# Slaat de presentatie op
$pres->save("ColumnCount.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Kolommen aan een tekstframe toevoegen
Aspose.Slides for PHP via Java biedt de setColumnCount‑methode van de TextFrameFormat‑klasse, waarmee je kolommen in tekstframes kunt toevoegen. Met deze eigenschap kun je het gewenste aantal kolommen in een tekstframe opgeven.
Deze PHP‑code laat zien hoe je een kolom toevoegt aan een tekstframe:
$outPptxFileName = "ColumnsTest.pptx";
$pres = new Presentation();
try {
$shape1 = $pres->getSlides()->get_Item(0)->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, 300, 300);
$format = $shape1->getTextFrame()->getTextFrameFormat();
$format->setColumnCount(2);
$shape1->getTextFrame()->setText("All these columns are forced to stay within a single text container -- " . "you can add or delete text - and the new or remaining text automatically adjusts " . "itself to stay within the container. You cannot have text spill over from one container " . "to other, though -- because PowerPoint's column options for text are limited!");
$pres->save($outPptxFileName, SaveFormat::Pptx);
$test = new Presentation($outPptxFileName);
try {
$autoShape = $test->getSlides()->get_Item(0)->getShapes()->get_Item(0);
Assert->assertTrue(2 == $autoShape->getTextFrame()->getTextFrameFormat()->getColumnCount());
Assert->assertTrue(Double->NaN == $autoShape->getTextFrame()->getTextFrameFormat()->getColumnSpacing());
} finally {
if (!java_is_null($test)) {
$test->dispose();
}
}
$format->setColumnSpacing(20);
$pres->save($outPptxFileName, SaveFormat::Pptx);
$test1 = new Presentation($outPptxFileName);
try {
$autoShape = $test1->getSlides()->get_Item(0)->getShapes()->get_Item(0);
Assert->assertTrue(2 == $autoShape->getTextFrame()->getTextFrameFormat()->getColumnCount());
Assert->assertTrue(20 == $autoShape->getTextFrame()->getTextFrameFormat()->getColumnSpacing());
} finally {
if (!java_is_null($test1)) {
$test1->dispose();
}
}
$format->setColumnCount(3);
$format->setColumnSpacing(15);
$pres->save($outPptxFileName, SaveFormat::Pptx);
$test2 = new Presentation($outPptxFileName);
try {
$autoShape = $test2->getSlides()->get_Item(0)->getShapes()->get_Item(0);
Assert->assertTrue(3 == $autoShape->getTextFrame()->getTextFrameFormat()->getColumnCount());
Assert->assertTrue(15 == $autoShape->getTextFrame()->getTextFrameFormat()->getColumnSpacing());
} finally {
if (!java_is_null($test2)) {
$test2->dispose();
}
}
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Tekst bijwerken
Aspose.Slides stelt je in staat de tekst in een tekstvak of alle teksten in een presentatie te wijzigen of bij te werken.
Deze PHP‑code demonstreert een bewerking waarbij alle teksten in een presentatie worden bijgewerkt:
$pres = new Presentation("text.pptx");
try {
foreach($pres->getSlides() as $slide) {
foreach($slide->getShapes() as $shape) {
# Controleert of de vorm een tekstframe ondersteunt (IAutoShape).
if (java_instanceof($shape, new JavaClass("com.aspose.slides.AutoShape"))) {
$autoShape = $shape;
# Doorloopt de alinea's in het tekstframe
foreach($autoShape->getTextFrame()->getParagraphs() as $paragraph) {
# Doorloopt elk deel (portion) in de alinea
foreach($paragraph->getPortions() as $portion) {
$portion->setText($portion->getText()->replace("years", "months"));// Wijzigt de tekst
$portion->getPortionFormat()->setFontBold(NullableBool::True);// Wijzigt de opmaak
}
}
}
}
}
# Slaat de gewijzigde presentatie op
$pres->save("text-changed.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Een tekstvak met hyperlink toevoegen
Je kunt een koppeling in een tekstvak invoegen. Wanneer op het tekstvak wordt geklikt, wordt de link geopend.
Om een tekstvak met een koppeling toe te voegen, doorloop je de volgende stappen:
- Maak een instantie van de
Presentation‑klasse. - Verkrijg een verwijzing naar de eerste dia in de nieuw aangemaakte presentatie.
- Voeg een
AutoShape‑object toe metShapeTypeRectangleop een opgegeven positie op de dia en krijg een referentie naar het zojuist toegevoegdeAutoShape‑object. - Voeg een
TextFrametoe aan hetAutoShape‑object met Aspose TextBox als standaardtekst. - Instantieer de
HyperlinkManager‑klasse. - Wijs een hyperlink toe met de setExternalHyperlinkClick‑methode voor het gewenste gedeelte van het
TextFrame. - Schrijf ten slotte het PPTX‑bestand via het
Presentation‑object.
Deze PHP‑code – een implementatie van de bovenstaande stappen – laat zien hoe je een tekstvak met hyperlink aan een dia toevoegt:
# Instantieert een Presentation‑klasse die een PPTX representeert
$pres = new Presentation();
try {
# Haalt de eerste dia in de presentatie op
$slide = $pres->getSlides()->get_Item(0);
# Voegt een AutoShape‑object toe met type ingesteld op Rectangle
$shape = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 150, 150, 150, 50);
# Cast de vorm naar AutoShape
$pptxAutoShape = $shape;
# Benadert de ITextFrame‑eigenschap die bij de AutoShape hoort
$pptxAutoShape->addTextFrame("");
$textFrame = $pptxAutoShape->getTextFrame();
# Voegt tekst toe aan het frame
$textFrame->getParagraphs()->get_Item(0)->getPortions()->get_Item(0)->setText("Aspose.Slides");
# Stelt de hyperlink in voor de portion‑tekst
$hyperlinkManager = $textFrame->getParagraphs()->get_Item(0)->getPortions()->get_Item(0)->getPortionFormat()->getHyperlinkManager();
$hyperlinkManager->setExternalHyperlinkClick("http://www.aspose.com");
# Slaat de PPTX‑presentatie op
$pres->save("hLink_out.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
FAQ
Wat is het verschil tussen een tekstvak en een tekst‑placeholder bij het werken met masterslides?
Een placeholder erft stijl/positie van de master en kan worden overschreven op lay-outs, terwijl een regulier tekstvak een onafhankelijk object op een specifieke dia is en niet verandert wanneer je van lay‑out wisselt.
Hoe kan ik een bulk‑tekstvervanging uitvoeren in de hele presentatie zonder tekst in diagrammen, tabellen en SmartArt aan te passen?
Beperk je iteratie tot auto‑shapes die tekstframes bevatten en sluit ingesloten objecten (charts, tables, SmartArt) uit door hun collecties apart te doorlopen of deze objecttypen over te slaan.