Управление текстовыми полями в презентациях с использованием PHP

Текст на слайдах обычно находится в текстовых полях или фигурах. Поэтому, чтобы добавить текст на слайд, необходимо добавить текстовое поле, а затем поместить в него текст. Aspose.Slides for PHP via Java предоставляет интерфейс IAutoShape, который позволяет добавить фигуру с текстом.

Создание текстового поля на слайде

Для создания текстового поля на слайде выполните следующие шаги:

  1. Создайте экземпляр класса Presentation.
  2. Получите ссылку на первый слайд в только что созданной презентации.
  3. Добавьте объект IAutoShape с типом ShapeType, установленным как Rectangle, в указанном положении на слайде и получите ссылку на только что добавленный объект IAutoShape.
  4. Добавьте свойство TextFrame к объекту IAutoShape, которое будет содержать текст. В примере ниже мы добавили этот текст: Aspose TextBox
  5. Наконец, запишите файл 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 к Rectangle
    $ashp->addTextFrame(" ");
    # Получает доступ к TextFrame
    $txtFrame = $ashp->getTextFrame();
    # Создает объект Paragraph для TextFrame
    $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, позволяющий проверять фигуры и определять текстовые поля.

Text box and shape

Этот 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 предоставляет свойства ColumnCount и ColumnSpacing (из интерфейса ITextFrameFormat и класса TextFrameFormat), позволяющие добавить колонки в текстовые поля. Вы можете указать количество колонок и задать расстояние между колонками в пунктах.

Этот код демонстрирует описанную операцию:

  $pres = new Presentation();
  try {
    # Получает первый слайд в презентации
    $slide = $pres->getSlides()->get_Item(0);
    # Добавляет AutoShape с типом Rectangle
    $aShape = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, 300, 300);
    # Добавляет TextFrame к Rectangle
    $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 предоставляет свойство ColumnCount (из интерфейса ITextFrameFormat), которое позволяет добавить колонки в текстовые кадры. С помощью этого свойства можно задать желаемое количество колонок в текстовом кадре.

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

Добавление текстового поля со ссылкой

Вы можете вставить ссылку внутрь текстового поля. При щелчке по полю пользователь будет перенаправлен к открытию ссылки.

Чтобы добавить текстовое поле, содержащее ссылку, выполните следующие шаги:

  1. Создайте экземпляр класса Presentation.
  2. Получите ссылку на первый слайд в только что созданной презентации.
  3. Добавьте объект AutoShape с типом ShapeType, установленным как Rectangle, в указанном положении на слайде и получите ссылку на только что добавленный объект AutoShape.
  4. Добавьте TextFrame к объекту AutoShape, содержащий Aspose TextBox в качестве текста по умолчанию.
  5. Создайте объект класса IHyperlinkManager.
  6. Присвойте объект IHyperlinkManager свойству HyperlinkClick у выбранного фрагмента TextFrame.
  7. Наконец, запишите файл 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

В чём разница между текстовым полем и заполнителем текста при работе с мастер‑слайдами?

placeholder наследует стиль/позицию от master и может быть переопределён на layouts, тогда как обычное текстовое поле — это независимый объект на конкретном слайде и не меняется при переключении макетов.

Как выполнить массовую замену текста во всей презентации, не затрагивая текст внутри диаграмм, таблиц и SmartArt?

Ограничьте итерацию авто‑фигурами, имеющими текстовые кадры, и исключите встроенные объекты (charts, tables, SmartArt), обходя их коллекции отдельно или пропуская эти типы объектов.