Управление текстовыми полями в презентациях с использованием PHP
Тексты на слайдах обычно находятся в текстовых полях или фигурах. Поэтому, чтобы добавить текст на слайд, нужно добавить текстовое поле и затем поместить в него текст. Aspose.Slides for PHP via Java предоставляет класс AutoShape, позволяющий добавить фигуру, содержащую текст.
Информация
Aspose.Slides также предоставляет класс Shape, позволяющий добавлять фигуры на слайды. Однако не все фигуры, добавленные через классShape, могут содержать текст. Фигуры, добавленные через класс AutoShape, могут содержать текст.
Примечание
Поэтому, работая с фигурой, к которой вы хотите добавить текст, рекомендуется проверить и убедиться, что она была приведена к классуAutoShape. Только в этом случае вы сможете работать с TextFrame, который является свойством AutoShape. Смотрите раздел Update Text на этой странице.
Создание текстового поля на слайде
Чтобы создать текстовое поле на слайде, выполните следующие шаги:
- Создайте экземпляр класса Presentation.
- Получите ссылку на первый слайд в только что созданной презентации.
- Добавьте объект AutoShape с типом фигуры, установленным как Rectangle, в указанной позиции на слайде и получите ссылку на только что добавленный объект
AutoShape. - Добавьте
TextFrameк объектуAutoShape, который будет содержать текст. В примере ниже мы добавили текст: Aspose TextBox - Наконец, запишите файл PPTX через объект
Presentation.
Этот PHP‑код — реализация описанных выше шагов — показывает, как добавить текст на слайд:
# Создаёт объект Presentation
$pres = new Presentation();
try {
# Получает первый слайд в презентации
$sld = $pres->getSlides()->get_Item(0);
# Добавляет AutoShape с типом Rectangle
$ashp = $sld->getShapes()->addAutoShape(ShapeType::Rectangle, 150, 75, 150, 50);
# Добавляет TextFrame к прямоугольнику
$ashp->addTextFrame(" ");
# Получает доступ к текстовому кадру
$txtFrame = $ashp->getTextFrame();
# Создаёт объект Paragraph для текстового кадра
$para = $txtFrame->getParagraphs()->get_Item(0);
# Создаёт объект Portion для абзаца
$portion = $para->getPortions()->get_Item(0);
# Устанавливает текст
$portion->setText("Aspose TextBox");
# Сохраняет презентацию на диск
$pres->save("TextBox_out.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Проверка наличия фигуры‑текстового поля
Aspose.Slides предоставляет метод isTextBox из класса AutoShape, позволяющий проверять фигуры и определять текстовые поля.

Этот PHP‑код показывает, как проверить, создана ли фигура как текстовое поле:
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();
}
Обратите внимание, что если вы просто добавите автофигуру с помощью метода addAutoShape из класса ShapeCollection, метод isTextBox у этой автофигуры вернёт false. Однако после добавления текста к автофигуре с помощью метода addTextFrame или setText свойство isTextBox вернёт true.
$presentation = new Presentation();
$slide = $presentation->getSlides()->get_Item(0);
$shape1 = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 10, 100, 40);
// shape1->isTextBox() возвращает false
$shape1->addTextFrame("shape 1");
// shape1->isTextBox() возвращает true
$shape2 = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 110, 100, 40);
// shape2->isTextBox() возвращает false
$shape2->getTextFrame()->setText("shape 2");
// shape2->isTextBox() возвращает true
$shape3 = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 210, 100, 40);
// shape3->isTextBox() возвращает false
$shape3->addTextFrame("");
// shape3->isTextBox() возвращает false
$shape4 = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 310, 100, 40);
// shape4->isTextBox() возвращает false
$shape4->getTextFrame()->setText("");
// shape4->isTextBox() возвращает false
Добавление колонок в текстовое поле
Aspose.Slides предоставляет методы setColumnCount и setColumnSpacing из класса TextFrameFormat, позволяющие добавлять колонки в текстовые поля. Вы можете указать количество колонок в текстовом поле и задать расстояние между колонками в пунктах.
Этот код демонстрирует описанную операцию:
$pres = new Presentation();
try {
# Получает первый слайд в презентации
$slide = $pres->getSlides()->get_Item(0);
# Добавляет AutoShape с типом Rectangle
$aShape = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, 300, 300);
# Добавляет TextFrame к прямоугольнику
$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!");
# Получает формат текста TextFrame
$format = $aShape->getTextFrame()->getTextFrameFormat();
# Задает количество колонок в TextFrame
$format->setColumnCount(3);
# Задает расстояние между колонками
$format->setColumnSpacing(10);
# Сохраняет презентацию
$pres->save("ColumnCount.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Добавление колонок в текстовый кадр
Aspose.Slides for PHP via Java предоставляет метод setColumnCount из класса TextFrameFormat, позволяющий добавить колонки в текстовые кадры. С помощью этого свойства вы можете задать желаемое количество колонок в текстовом кадре.
Этот PHP‑код показывает, как добавить колонку в текстовый кадр:
$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();
}
}
Обновление текста
Aspose.Slides позволяет изменять или обновлять текст, содержащийся в текстовом поле, а также все тексты в презентации.
Этот PHP‑код демонстрирует операцию, при которой обновляются все тексты в презентации:
$pres = new Presentation("text.pptx");
try {
foreach($pres->getSlides() as $slide) {
foreach($slide->getShapes() as $shape) {
# Проверяет, поддерживает ли фигура текстовый кадр (IAutoShape).
if (java_instanceof($shape, new JavaClass("com.aspose.slides.AutoShape"))) {
$autoShape = $shape;
# Итерируется по абзацам в текстовом кадре
foreach($autoShape->getTextFrame()->getParagraphs() as $paragraph) {
# Итерируется по каждому фрагменту в абзаце
foreach($paragraph->getPortions() as $portion) {
$portion->setText($portion->getText()->replace("years", "months"));// Изменяет текст
$portion->getPortionFormat()->setFontBold(NullableBool::True);// Изменяет форматирование
}
}
}
}
}
# Сохраняет изменённую презентацию
$pres->save("text-changed.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Добавление текстового поля с гиперссылкой
Можно вставить ссылку внутрь текстового поля. При щелчке по полю пользователь будет перенаправлен по этой ссылке.
Чтобы добавить текстовое поле с ссылкой, выполните следующие шаги:
- Создайте экземпляр класса
Presentation. - Получите ссылку на первый слайд в только что созданной презентации.
- Добавьте объект
AutoShapeсShapeType, установленным какRectangle, в указанной позиции на слайде и получите ссылку на только что добавленный объектAutoShape. - Добавьте
TextFrameк объектуAutoShape, содержащий Aspose TextBox в качестве текста по умолчанию. - Создайте экземпляр класса
HyperlinkManager. - Присвойте гиперссылку, используя метод setExternalHyperlinkClick, привязанный к выбранной части
TextFrame. - Наконец, запишите файл PPTX через объект
Presentation.
Этот PHP‑код — реализация описанных выше шагов — показывает, как добавить текстовое поле с гиперссылкой на слайд:
# Создает объект класса Presentation, представляющий PPTX
$pres = new Presentation();
try {
# Получает первый слайд в презентации
$slide = $pres->getSlides()->get_Item(0);
# Добавляет объект AutoShape с типом Rectangle
$shape = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 150, 150, 150, 50);
# Приводит фигуру к типу AutoShape
$pptxAutoShape = $shape;
# Получает доступ к свойству ITextFrame, связанному с AutoShape
$pptxAutoShape->addTextFrame("");
$textFrame = $pptxAutoShape->getTextFrame();
# Добавляет текст в кадр
$textFrame->getParagraphs()->get_Item(0)->getPortions()->get_Item(0)->setText("Aspose.Slides");
# Устанавливает гиперссылку для текста фрагмента
$hyperlinkManager = $textFrame->getParagraphs()->get_Item(0)->getPortions()->get_Item(0)->getPortionFormat()->getHyperlinkManager();
$hyperlinkManager->setExternalHyperlinkClick("http://www.aspose.com");
# Сохраняет презентацию PPTX
$pres->save("hLink_out.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
FAQ
В чём разница между текстовым полем и заполнителем текста при работе с мастер‑слайдами?
Заполнитель наследует стиль/позицию от мастера и может быть переопределён на макетах, тогда как обычное текстовое поле является независимым объектом на конкретном слайде и не меняется при переключении макетов.
Как выполнить массовую замену текста во всей презентации, не затрагивая текст внутри диаграмм, таблиц и SmartArt?
Ограничьте итерацию автофигурами, которые имеют текстовые кадры, и исключите встроенные объекты (диаграммы, таблицы, SmartArt), проходя их коллекции отдельно или пропуская эти типы объектов.