Управление абзацами текста PowerPoint в PHP
Aspose.Slides предоставляет все необходимые классы для работы с текстами, абзацами и фрагментами PowerPoint.
- Aspose.Slides предоставляет класс TextFrame , позволяющий добавлять объекты, представляющие абзац. Объект
TextFameможет содержать один или несколько абзацев (каждый абзац создаётся с помощью возврата каретки). - Aspose.Slides предоставляет класс Paragraph , позволяющий добавлять объекты, представляющие фрагменты. Объект
Paragraphможет содержать один или несколько фрагментов (коллекцию объектов Portion). - Aspose.Slides предоставляет класс Portion , позволяющий добавлять объекты, представляющие тексты и их свойства форматирования.
Объект Paragraph способен обрабатывать тексты с различными свойствами форматирования через свои вложенные объекты Portion.
Добавление нескольких абзацев, содержащих несколько фрагментов
Эти шаги показывают, как добавить текстовый кадр, содержащий 3 абзаца, каждый из которых содержит 3 фрагмента:
- Создайте экземпляр класса Presentation .
- Получите ссылку на нужный слайд по его индексу.
- Добавьте прямоугольный AutoShape на слайд.
- Получите объект ITextFrame, связанный с AutoShape .
- Создайте два объекта Paragraph и добавьте их в коллекцию абзацев TextFrame .
- Создайте три объекта Portion для каждого нового
Paragraph(два объекта Portion для абзаца по умолчанию) и добавьте каждый объектPortionв коллекцию фрагментов соответствующегоParagraph. - Задайте текст для каждого фрагмента.
- Примените желаемые свойства форматирования к каждому фрагменту, используя свойства форматирования, доступные в объекте
Portion. - Сохраните изменённую презентацию.
# Создать экземпляр класса Presentation, представляющего файл PPTX
$pres = new Presentation();
try {
# Доступ к первому слайду
$slide = $pres->getSlides()->get_Item(0);
# Добавить AutoShape типа Rectangle
$ashp = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 50, 150, 300, 150);
# Получить TextFrame AutoShape
$tf = $ashp->getTextFrame();
# Создать абзацы и фрагменты с различными форматами текста
$para0 = $tf->getParagraphs()->get_Item(0);
$port01 = new Portion();
$port02 = new Portion();
$para0->getPortions()->add($port01);
$para0->getPortions()->add($port02);
$para1 = new Paragraph();
$tf->getParagraphs()->add($para1);
$port10 = new Portion();
$port11 = new Portion();
$port12 = new Portion();
$para1->getPortions()->add($port10);
$para1->getPortions()->add($port11);
$para1->getPortions()->add($port12);
$para2 = new Paragraph();
$tf->getParagraphs()->add($para2);
$port20 = new Portion();
$port21 = new Portion();
$port22 = new Portion();
$para2->getPortions()->add($port20);
$para2->getPortions()->add($port21);
$para2->getPortions()->add($port22);
for($i = 0; $i < 3; $i++) {
for($j = 0; $j < 3; $j++) {
$portion = $tf->getParagraphs()->get_Item($i)->getPortions()->get_Item($j);
$portion->setText("Portion0" . $j);
if ($j == 0) {
$portion->getPortionFormat()->getFillFormat()->setFillType(FillType::Solid);
$portion->getPortionFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->RED);
$portion->getPortionFormat()->setFontBold(NullableBool::True);
$portion->getPortionFormat()->setFontHeight(15);
} else if ($j == 1) {
$portion->getPortionFormat()->getFillFormat()->setFillType(FillType::Solid);
$portion->getPortionFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->BLUE);
$portion->getPortionFormat()->setFontItalic(NullableBool::True);
$portion->getPortionFormat()->setFontHeight(18);
}
}
}
# Сохранить PPTX на диск
$pres->save("multiParaPort_out.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Управление маркерами абзацев
Маркованные списки помогают быстро и эффективно организовать и представить информацию. Абзацы с маркерами всегда легче читать и понимать.
- Создайте экземпляр класса Presentation .
- Получите ссылку на нужный слайд по его индексу.
- Добавьте AutoShape на выбранный слайд.
- Получите TextFrame автокаркаса.
- Удалите абзац по умолчанию в
TextFrame. - Создайте первый экземпляр абзаца, используя класс Paragraph .
- Установите для абзаца тип маркера
Typeв значениеSymbolи задайте символ маркера. - Задайте
Textабзаца. - Установите
Indentабзаца для маркера. - Задайте цвет маркера.
- Установите высоту маркера.
- Добавьте новый абзац в коллекцию абзацев
TextFrame. - Добавьте второй абзац и повторите процесс, описанный в шагах 7–13.
- Сохраните презентацию.
# Создаёт объект класса Presentation, представляющего файл PPTX
$pres = new Presentation();
try {
# Получает первый слайд
$slide = $pres->getSlides()->get_Item(0);
# Добавляет и получает AutoShape
$aShp = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 200, 200, 400, 200);
# Получает текстовый кадр автокаркаса
$txtFrm = $aShp->getTextFrame();
# Удаляет абзац по умолчанию
$txtFrm->getParagraphs()->removeAt(0);
# Создаёт абзац
$para = new Paragraph();
# Устанавливает стиль маркера абзаца и символ
$para->getParagraphFormat()->getBullet()->setType(BulletType::Symbol);
$para->getParagraphFormat()->getBullet()->setChar(8226);
# Устанавливает текст абзаца
$para->setText("Welcome to Aspose.Slides");
# Устанавливает отступ маркера
$para->getParagraphFormat()->setIndent(25);
# Устанавливает цвет маркера
$para->getParagraphFormat()->getBullet()->getColor()->setColorType(ColorType::RGB);
$para->getParagraphFormat()->getBullet()->getColor()->setColor(java("java.awt.Color")->BLACK);
$para->getParagraphFormat()->getBullet()->setBulletHardColor(NullableBool::True);// установить IsBulletHardColor в значение true для использования собственного цвета маркера
# Устанавливает высоту маркера
$para->getParagraphFormat()->getBullet()->setHeight(100);
# Добавляет абзац в текстовый кадр
$txtFrm->getParagraphs()->add($para);
# Создаёт второй абзац
$para2 = new Paragraph();
# Устанавливает тип и стиль маркера абзаца
$para2->getParagraphFormat()->getBullet()->setType(BulletType::Numbered);
$para2->getParagraphFormat()->getBullet()->setNumberedBulletStyle(NumberedBulletStyle->BulletCircleNumWDBlackPlain);
# Добавляет текст абзаца
$para2->setText("This is numbered bullet");
# Устанавливает отступ маркера
$para2->getParagraphFormat()->setIndent(25);
$para2->getParagraphFormat()->getBullet()->getColor()->setColorType(ColorType::RGB);
$para2->getParagraphFormat()->getBullet()->getColor()->setColor(java("java.awt.Color")->BLACK);
$para2->getParagraphFormat()->getBullet()->setBulletHardColor(NullableBool::True);// установить IsBulletHardColor в значение true для использования собственного цвета маркера
# Устанавливает высоту маркера
$para2->getParagraphFormat()->getBullet()->setHeight(100);
# Добавляет абзац в текстовый кадр
$txtFrm->getParagraphs()->add($para2);
# Сохраняет изменённую презентацию
$pres->save("Bullet_out.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Управление графическими маркерами
Маркованные списки помогают быстро и эффективно организовать и представить информацию. Абзацы с изображениями легко читать и понимать.
- Создайте экземпляр класса Presentation .
- Получите ссылку на нужный слайд по его индексу.
- Добавьте AutoShape на слайд.
- Получите TextFrame автокаркаса.
- Удалите абзац по умолчанию в
TextFrame. - Создайте первый абзац, используя класс Paragraph .
- Загрузите изображение в PPImage .
- Установите тип маркера в Picture и задайте изображение.
- Задайте
Textабзаца. - Установите
Indentабзаца для маркера. - Задайте цвет маркера.
- Установите высоту маркера.
- Добавьте новый абзац в коллекцию абзацев
TextFrame. - Добавьте второй абзац и повторите процесс, основываясь на предыдущих шагах.
- Сохраните изменённую презентацию.
# Создаёт объект класса Presentation, представляющего файл PPTX
$presentation = new Presentation();
try {
# Получает первый слайд
$slide = $presentation->getSlides()->get_Item(0);
# Создаёт изображение для маркеров
$picture;
$image = Images->fromFile("bullets.png");
try {
$picture = $presentation->getImages()->addImage($image);
} finally {
if (!java_is_null($image)) {
$image->dispose();
}
}
# Добавляет и получает AutoShape
$autoShape = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 200, 200, 400, 200);
# Получает текстовый кадр автокаркаса
$textFrame = $autoShape->getTextFrame();
# Удаляет абзац по умолчанию
$textFrame->getParagraphs()->removeAt(0);
# Создаёт новый абзац
$paragraph = new Paragraph();
$paragraph->setText("Welcome to Aspose.Slides");
# Устанавливает стиль маркера абзаца и изображение
$paragraph->getParagraphFormat()->getBullet()->setType(BulletType::Picture);
$paragraph->getParagraphFormat()->getBullet()->getPicture()->setImage($picture);
# Устанавливает высоту маркера
$paragraph->getParagraphFormat()->getBullet()->setHeight(100);
# Добавляет абзац в текстовый кадр
$textFrame->getParagraphs()->add($paragraph);
# Записывает презентацию в файл PPTX
$presentation->save("ParagraphPictureBulletsPPTX_out.pptx", SaveFormat::Pptx);
# Записывает презентацию в файл PPT
$presentation->save("ParagraphPictureBulletsPPT_out.ppt", SaveFormat::Ppt);
} catch (JavaException $e) {
} finally {
if (!java_is_null($presentation)) {
$presentation->dispose();
}
}
Управление многоуровневыми маркерами
Маркованные списки помогают быстро и эффективно организовать и представить информацию. Многоуровневые маркеры легко читать и понимать.
- Создайте экземпляр класса Presentation .
- Получите ссылку на нужный слайд по его индексу.
- Добавьте AutoShape на новый слайд.
- Получите TextFrame автокаркаса.
- Удалите абзац по умолчанию в
TextFrame. - Создайте первый абзац через класс Paragraph и задайте глубину 0.
- Создайте второй абзац через класс
Paragraphи задайте глубину 1. - Создайте третий абзац через класс
Paragraphи задайте глубину 2. - Создайте четвертый абзац через класс
Paragraphи задайте глубину 3. - Добавьте новые абзацы в коллекцию абзацев
TextFrame. - Сохраните изменённую презентацию.
# Создаёт объект класса Presentation, представляющего файл PPTX
$pres = new Presentation();
try {
# Получает первый слайд
$slide = $pres->getSlides()->get_Item(0);
# Добавляет и получает AutoShape
$aShp = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 200, 200, 400, 200);
# Получает текстовый кадр созданного AutoShape
$text = $aShp->addTextFrame("");
# Очищает абзац по умолчанию
$text->getParagraphs()->clear();
# Добавляет первый абзац
$para1 = new Paragraph();
$para1->setText("Content");
$para1->getParagraphFormat()->getBullet()->setType(BulletType::Symbol);
$para1->getParagraphFormat()->getBullet()->setChar(8226);
$para1->getParagraphFormat()->getDefaultPortionFormat()->getFillFormat()->setFillType(FillType::Solid);
$para1->getParagraphFormat()->getDefaultPortionFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->BLACK);
# Устанавливает уровень маркера
$para1->getParagraphFormat()->setDepth(0);
# Добавляет второй абзац
$para2 = new Paragraph();
$para2->setText("Second Level");
$para2->getParagraphFormat()->getBullet()->setType(BulletType::Symbol);
$para2->getParagraphFormat()->getBullet()->setChar('-');
$para2->getParagraphFormat()->getDefaultPortionFormat()->getFillFormat()->setFillType(FillType::Solid);
$para2->getParagraphFormat()->getDefaultPortionFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->BLACK);
# Устанавливает уровень маркера
$para2->getParagraphFormat()->setDepth(1);
# Добавляет третий абзац
$para3 = new Paragraph();
$para3->setText("Third Level");
$para3->getParagraphFormat()->getBullet()->setType(BulletType::Symbol);
$para3->getParagraphFormat()->getBullet()->setChar(8226);
$para3->getParagraphFormat()->getDefaultPortionFormat()->getFillFormat()->setFillType(FillType::Solid);
$para3->getParagraphFormat()->getDefaultPortionFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->BLACK);
# Устанавливает уровень маркера
$para3->getParagraphFormat()->setDepth(2);
# Добавляет четвёртый абзац
$para4 = new Paragraph();
$para4->setText("Fourth Level");
$para4->getParagraphFormat()->getBullet()->setType(BulletType::Symbol);
$para4->getParagraphFormat()->getBullet()->setChar('-');
$para4->getParagraphFormat()->getDefaultPortionFormat()->getFillFormat()->setFillType(FillType::Solid);
$para4->getParagraphFormat()->getDefaultPortionFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->BLACK);
# Устанавливает уровень маркера
$para4->getParagraphFormat()->setDepth(3);
# Добавляет абзацы в коллекцию
$text->getParagraphs()->add($para1);
$text->getParagraphs()->add($para2);
$text->getParagraphs()->add($para3);
$text->getParagraphs()->add($para4);
# Сохраняет презентацию в файл PPTX
$pres->save("MultilevelBullet.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Управление абзацем с пользовательским нумерованным списком
Класс BulletFormat предоставляет метод setNumberedBulletStartWith и другие, позволяющие управлять абзацами с пользовательской нумерацией или форматированием.
- Создайте экземпляр класса Presentation .
- Получите слайд, содержащий абзац.
- Добавьте AutoShape на слайд.
- Получите TextFrame автокаркаса.
- Удалите абзац по умолчанию в
TextFrame. - Создайте первый абзац через класс Paragraph и задайте NumberedBulletStartWith равным 2.
- Создайте второй абзац через класс
Paragraphи задайтеNumberedBulletStartWithравным 3. - Создайте третий абзац через класс
Paragraphи задайтеNumberedBulletStartWithравным 7. - Добавьте новые абзацы в коллекцию абзацев
TextFrame. - Сохраните изменённую презентацию.
$presentation = new Presentation();
try {
$shape = $presentation->getSlides()->get_Item(0)->getShapes()->addAutoShape(ShapeType::Rectangle, 200, 200, 400, 200);
# Получает текстовый кадр созданного автокаркаса
$textFrame = $shape->getTextFrame();
# Удаляет существующий абзац по умолчанию
$textFrame->getParagraphs()->removeAt(0);
# Первый список
$paragraph1 = new Paragraph();
$paragraph1->setText("bullet 2");
$paragraph1->getParagraphFormat()->setDepth(4);
$paragraph1->getParagraphFormat()->getBullet()->setNumberedBulletStartWith(2);
$paragraph1->getParagraphFormat()->getBullet()->setType(BulletType::Numbered);
$textFrame->getParagraphs()->add($paragraph1);
$paragraph2 = new Paragraph();
$paragraph2->setText("bullet 3");
$paragraph2->getParagraphFormat()->setDepth(4);
$paragraph2->getParagraphFormat()->getBullet()->setNumberedBulletStartWith(3);
$paragraph2->getParagraphFormat()->getBullet()->setType(BulletType::Numbered);
$textFrame->getParagraphs()->add($paragraph2);
$paragraph5 = new Paragraph();
$paragraph5->setText("bullet 7");
$paragraph5->getParagraphFormat()->setDepth(4);
$paragraph5->getParagraphFormat()->getBullet()->setNumberedBulletStartWith(7);
$paragraph5->getParagraphFormat()->getBullet()->setType(BulletType::Numbered);
$textFrame->getParagraphs()->add($paragraph5);
$presentation->save("SetCustomBulletsNumber-slides.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($presentation)) {
$presentation->dispose();
}
}
Установка отступа первой строки для абзаца
Используйте метод ParagraphFormat::setIndent для управления отступом первой строки абзаца. Этот метод перемещает только первую строку относительно левого поля абзаца. Положительное значение сдвигает первую строку вправо, остальные строки остаются выровненными по телу абзаца.
Используйте ParagraphFormat::setMarginLeft , когда необходимо переместить весь абзац. Используйте ParagraphFormat::setIndent , когда нужно переместить только первую строку.
Пример ниже создаёт несколько абзацев и применяет разные значения отступа, чтобы продемонстрировать, как отступ первой строки влияет на расположение абзаца.
- Создайте экземпляр класса Presentation .
- Получите целевой слайд.
- Добавьте прямоугольный AutoShape на слайд.
- Добавьте пустой TextFrame к фигуре и удалите абзац по умолчанию.
- Создайте несколько абзацев и задайте им разные значения Indent .
- Добавьте абзацы в текстовый кадр.
- Сохраните изменённую презентацию.
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$rectangleShape = $slide->getShapes()->addAutoShape(ShapeType::Rectangle,50,50,420,220);
$rectangleShape->getFillFormat()->setFillType(FillType::NoFill);
$rectangleShape->getLineFormat()->getFillFormat()->setFillType(FillType::Solid);
$rectangleShape->getLineFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->GRAY);
$textFrame = $rectangleShape->addTextFrame("");
$textFrame->getTextFrameFormat()->setAutofitType(TextAutofitType::Shape);
$textFrame->getParagraphs()->removeAt(0);
$firstParagraph = new Paragraph();
$firstParagraph->getParagraphFormat()->getDefaultPortionFormat()->getFillFormat()->setFillType(FillType::Solid);
$firstParagraph->getParagraphFormat()->getDefaultPortionFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->BLACK);
$firstParagraph->setText("No first-line indent. Wrapped lines start at the same position as the first line.");
$firstParagraph->getParagraphFormat()->setMarginLeft(20.0);
$firstParagraph->getParagraphFormat()->setIndent(0.0);
$secondParagraph = new Paragraph();
$secondParagraph->getParagraphFormat()->getDefaultPortionFormat()->getFillFormat()->setFillType(FillType::Solid);
$secondParagraph->getParagraphFormat()->getDefaultPortionFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->BLACK);
$secondParagraph->setText("First-line indent of 20 points. The first line moves to the right, while wrapped lines remain aligned to the paragraph body.");
$secondParagraph->getParagraphFormat()->setMarginLeft(20.0);
$secondParagraph->getParagraphFormat()->setIndent(20.0);
$thirdParagraph = new Paragraph();
$thirdParagraph->getParagraphFormat()->getDefaultPortionFormat()->getFillFormat()->setFillType(FillType::Solid);
$thirdParagraph->getParagraphFormat()->getDefaultPortionFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->BLACK);
$thirdParagraph->setText("First-line indent of 40 points. This paragraph shows a larger first-line offset to make the effect easier to see.");
$thirdParagraph->getParagraphFormat()->setMarginLeft(20.0);
$thirdParagraph->getParagraphFormat()->setIndent(40.0);
$textFrame->getParagraphs()->add($firstParagraph);
$textFrame->getParagraphs()->add($secondParagraph);
$textFrame->getParagraphs()->add($thirdParagraph);
$presentation->save("paragraph_indent.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
Результат:

Установка висячего отступа для абзаца
Висячий отступ — это макет абзаца, при котором первая строка начинается левее остальных строк. В Aspose.Slides вы создаёте этот эффект с помощью метода ParagraphFormat::setIndent . Установите отступ со значением меньше нуля, чтобы переместить первую строку влево относительно тела абзаца.
На практике ParagraphFormat::setMarginLeft определяет левую позицию тела абзаца, а ParagraphFormat::setIndent определяет позицию первой строки относительно этого поля. Чтобы создать висячий отступ, задайте положительное значение MarginLeft и отрицательное значение Indent .
Это форматирование полезно для библиографий, ссылок, глоссариев и других абзацев, где переносимые строки должны выравниваться под телом абзаца, а не под первой буквой первой строки.
- Создайте экземпляр класса Presentation .
- Получите целевой слайд.
- Добавьте прямоугольный AutoShape на слайд.
- Добавьте пустой TextFrame к фигуре и удалите абзац по умолчанию.
- Создайте абзацы и задайте положительное значение MarginLeft для каждого абзаца.
- Задайте отрицательное значение Indent для создания эффекта висячего отступа.
- Добавьте абзацы в текстовый кадр.
- Сохраните изменённую презентацию.
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$rectangleShape = $slide->getShapes()->addAutoShape(ShapeType::Rectangle,50,50,420,220);
$rectangleShape->getFillFormat()->setFillType(FillType::NoFill);
$rectangleShape->getLineFormat()->getFillFormat()->setFillType(FillType::Solid);
$rectangleShape->getLineFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->GRAY);
$textFrame = $rectangleShape->addTextFrame("");
$textFrame->getTextFrameFormat()->setAutofitType(TextAutofitType::Shape);
$textFrame->getParagraphs()->removeAt(0);
$firstParagraph = new Paragraph();
$firstParagraph->getParagraphFormat()->getDefaultPortionFormat()->getFillFormat()->setFillType(FillType::Solid);
$firstParagraph->getParagraphFormat()->getDefaultPortionFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->BLACK);
$firstParagraph->setText("A hanging indent is created by combining a positive left margin with a negative indent. The first line starts to the left, while wrapped lines align with the paragraph body.");
$firstParagraph->getParagraphFormat()->setMarginLeft(40.0);
$firstParagraph->getParagraphFormat()->setIndent(-20.0);
$secondParagraph = new Paragraph();
$secondParagraph->getParagraphFormat()->getDefaultPortionFormat()->getFillFormat()->setFillType(FillType::Solid);
$secondParagraph->getParagraphFormat()->getDefaultPortionFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->BLACK);
$secondParagraph->setText("This second example uses a deeper hanging indent so the difference between the first line and the wrapped lines is easier to compare.");
$secondParagraph->getParagraphFormat()->setMarginLeft(60.0);
$secondParagraph->getParagraphFormat()->setIndent(-30.0);
$textFrame->getParagraphs()->add($firstParagraph);
$textFrame->getParagraphs()->add($secondParagraph);
$presentation->save("hanging_indent.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
Результат:

Управление свойствами End для абзаца
- Создайте экземпляр класса Presentation .
- Получите ссылку на слайд, содержащий абзац, по его позиции.
- Добавьте прямоугольный AutoShape на слайд.
- Добавьте TextFrame с двумя абзацами к прямоугольнику.
- Задайте высоту шрифта и тип шрифта для абзацев.
- Задайте свойства End для абзацев.
- Сохраните изменённую презентацию в файл PPTX.
$pres = new Presentation();
try {
$shape = $pres->getSlides()->get_Item(0)->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 10, 200, 250);
$para1 = new Paragraph();
$para1->getPortions()->add(new Portion("Sample text"));
$para2 = new Paragraph();
$para2->getPortions()->add(new Portion("Sample text 2"));
$portionFormat = new PortionFormat();
$portionFormat::setFontHeight(48);
$portionFormat::setLatinFont(new FontData("Times New Roman"));
$para2->setEndParagraphPortionFormat($portionFormat);
$shape->getTextFrame()->getParagraphs()->add($para1);
$shape->getTextFrame()->getParagraphs()->add($para2);
$pres->save($resourcesOutputPath . "pres.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Импорт HTML‑текста в абзацы
Aspose.Slides предоставляет расширенную поддержку импорта HTML‑текста в абзацы.
- Создайте экземпляр класса Presentation .
- Получите ссылку на нужный слайд по его индексу.
- Добавьте AutoShape на слайд.
- Добавьте и получите доступ к TextFrame автокаркаса
AutoShape. - Удалите абзац по умолчанию в
TextFrame. - Прочитайте исходный HTML‑файл с помощью TextReader.
- Создайте первый абзац через класс Paragraph .
- Добавьте содержимое HTML‑файла, прочитанное TextReader, в ParagraphCollection текстового кадра.
- Сохраните изменённую презентацию.
# Создать пустой экземпляр презентации
$pres = new Presentation();
try {
# Получает первый слайд по умолчанию презентации
$slide = $pres->getSlides()->get_Item(0);
# Добавление AutoShape для размещения HTML‑контента
$ashape = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 10, 10, $pres->getSlideSize()->getSize()->getWidth() - 20, $pres->getSlideSize()->getSize()->getHeight() - 10);
$ashape->getFillFormat()->setFillType(FillType::NoFill);
# Добавление текстового кадра к фигуре
$ashape->addTextFrame("");
# Очистка всех абзацев в добавленном текстовом кадре
$ashape->getTextFrame()->getParagraphs()->clear();
# Загрузка HTML‑файла с помощью StreamReader
$tr = new StreamReader("file.html");
# Добавление текста из HTML‑потока в текстовый кадр
$ashape->getTextFrame()->getParagraphs()->addFromHtml($tr->readToEnd());
# Сохранение презентации
$pres->save("output_out.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Экспорт текста абзаца в HTML
Aspose.Slides предоставляет расширенную поддержку экспорта текстов (содержащихся в абзацах) в HTML.
- Создайте экземпляр класса Presentation и загрузите нужную презентацию.
- Получите ссылку на нужный слайд по его индексу.
- Получите фигуру, содержащую текст, который будет экспортирован в HTML.
- Получите TextFrame фигуры.
- Создайте экземпляр
StreamWriterи добавьте новый HTML‑файл. - Укажите начальный индекс для
StreamWriterи экспортируйте выбранные абзацы.
# Загрузить файл презентации
$pres = new Presentation("ExportingHTMLText.pptx");
try {
# Получить первый слайд по умолчанию презентации
$slide = $pres->getSlides()->get_Item(0);
# Желаемый индекс
$index = 0;
# Доступ к добавленной фигуре
$ashape = $slide->getShapes()->get_Item($index);
# Создание выходного HTML-файла
$os = new Java("java.io.FileOutputStream", "output.html");
$writer = new OutputStreamWriter($os, "UTF-8");
# Извлечение первого абзаца в формате HTML
# Запись данных абзацев в HTML с указанием начального индекса абзаца и общего количества копируемых абзацев
$writer->write($ashape->getTextFrame()->getParagraphs()->exportToHtml(0, $ashape->getTextFrame()->getParagraphs()->getCount(), null));
$writer->close();
} catch (JavaException $e) {
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Сохранение абзаца в виде изображения
В этом разделе мы рассмотрим два примера, демонстрирующие, как сохранить текстовый абзац, представленный классом Paragraph , в виде изображения. Оба примера включают получение изображения фигуры, содержащей абзац, с помощью методов getImage класса Shape , вычисление границ абзаца внутри фигуры и экспорт его в виде растрового изображения. Эти подходы позволяют извлекать определённые части текста из презентаций PowerPoint и сохранять их как отдельные изображения, что может быть полезно для дальнейшего использования в разных сценариях.
Предположим, что у нас есть файл презентации sample.pptx с одним слайдом, где первая фигура — текстовое поле, содержащее три абзаца.

Пример 1
В этом примере мы получаем второй абзац в виде изображения. Для этого мы извлекаем изображение фигуры с первого слайда презентации, затем вычисляем границы второго абзаца в текстовом кадре фигуры. Затем абзац перерисовывается на новом растровом изображении, которое сохраняется в формате PNG. Этот метод особенно полезен, когда необходимо сохранить конкретный абзац как отдельное изображение, сохранив точные размеры и форматирование текста.
$imageIO = new Java("javax.imageio.ImageIO");
$presentation = new Presentation("sample.pptx");
try {
$firstShape = $presentation->getSlides()->get_Item(0)->getShapes()->get_Item(0);
// Сохранить фигуру в памяти как растровое изображение.
$shapeImage = $firstShape->getImage();
$shapeImageStream = new Java("java.io.ByteArrayOutputStream");
$shapeImage->save($shapeImageStream, ImageFormat::Png);
$shapeImage->dispose();
// Создать растровое изображение фигуры из памяти.
$shapeImageInputStream = new Java("java.io.ByteArrayInputStream", $shapeImageStream->toByteArray());
$shapeBitmap = $imageIO->read($shapeImageInputStream);
// Рассчитать границы второго абзаца.
$secondParagraph = $firstShape->getTextFrame()->getParagraphs()->get_Item(1);
$paragraphRectangle = $secondParagraph->getRect();
// Рассчитать координаты и размер выходного изображения (минимальный размер - 1x1 пиксель).
$imageX = floor(java_values($paragraphRectangle->getX()));
$imageY = floor(java_values($paragraphRectangle->getY()));
$imageWidth = max(1, ceil(java_values($paragraphRectangle->getWidth())));
$imageHeight = max(1, ceil(java_values($paragraphRectangle->getHeight())));
// Обрезать растровое изображение фигуры, чтобы получить только растровое изображение абзаца.
$paragraphBitmap = $shapeBitmap->getSubimage($imageX, $imageY, $imageWidth, $imageHeight);
$imageIO->write($paragraphBitmap, "png", new Java("java.io.File", "paragraph.png"));
} finally {
if (!java_is_null($presentation)) {
$presentation->dispose();
}
}
Результат:

Пример 2
В этом примере мы расширяем предыдущий подход, добавляя коэффициенты масштабирования к изображению абзаца. Фигура извлекается из презентации и сохраняется как изображение с масштабом 2. Это позволяет получить изображение более высокого разрешения при экспорте абзаца. Затем границы абзаца рассчитываются с учётом масштаба. Масштабирование может быть особенно полезно, когда требуется более детальное изображение, например, для печатных материалов высокого качества.
$imageIO = new Java("javax.imageio.ImageIO");
$imageScaleX = 2;
$imageScaleY = $imageScaleX;
$presentation = new Presentation("sample.pptx");
try {
$firstShape = $presentation->getSlides()->get_Item(0)->getShapes()->get_Item(0);
// Сохранить фигуру в памяти как растровое изображение с масштабированием.
$shapeImage = $firstShape->getImage(ShapeThumbnailBounds::Shape, $imageScaleX, $imageScaleY);
$shapeImageStream = new Java("java.io.ByteArrayOutputStream");
$shapeImage->save($shapeImageStream, ImageFormat::Png);
$shapeImage->dispose();
// Создать растровое изображение фигуры из памяти.
$shapeImageInputStream = new Java("java.io.ByteArrayInputStream", $shapeImageStream->toByteArray());
$shapeBitmap = $imageIO->read($shapeImageInputStream);
// Рассчитать границы второго абзаца.
$secondParagraph = $firstShape->getTextFrame()->getParagraphs()->get_Item(1);
$paragraphRectangle = $secondParagraph->getRect();
$paragraphRectangle->setRect(
java_values($paragraphRectangle->getX()) * $imageScaleX,
java_values($paragraphRectangle->getY()) * $imageScaleY,
java_values($paragraphRectangle->getWidth()) * $imageScaleX,
java_values($paragraphRectangle->getHeight()) * $imageScaleY
);
// Рассчитать координаты и размер выходного изображения (минимальный размер - 1x1 пиксель).
$imageX = floor(java_values($paragraphRectangle->getX()));
$imageY = floor(java_values($paragraphRectangle->getY()));
$imageWidth = max(1, ceil(java_values($paragraphRectangle->getWidth())));
$imageHeight = max(1, ceil(java_values($paragraphRectangle->getHeight())));
// Обрезать растровое изображение фигуры, чтобы получить только растровое изображение абзаца.
$paragraphBitmap = $shapeBitmap->getSubimage($imageX, $imageY, $imageWidth, $imageHeight);
$imageIO->write($paragraphBitmap, "png", new Java("java.io.File", "paragraph.png"));
} finally {
if (!java_is_null($presentation)) {
$presentation->dispose();
}
}
FAQ
Могу ли я полностью отключить перенос строк внутри текстового кадра?
Да. Используйте настройку переноса текста в кадре (setWrapText), чтобы отключить перенос, так что строки не будут разбиваться по краям кадра.
Как получить точные границы конкретного абзаца на слайде?
Вы можете получить ограничивающий прямоугольник абзаца (и даже отдельного фрагмента), чтобы узнать его точное положение и размер на слайде.
Где управляется выравнивание абзаца (по левому, правому, центру, по ширине)?
Alignment — это настройка уровня абзаца в ParagraphFormat ; она применяется к всему абзацу независимо от форматирования отдельных фрагментов.
Могу ли я задать язык проверки правописания только для части абзаца (например, одного слова)?
Да. Язык задаётся на уровне фрагмента (PortionFormat::setLanguageId), поэтому в одном абзаце могут сосуществовать несколько языков.