Управление абзацами текста PowerPoint в Java
Обзор
Aspose.Slides for Java представляет текст как иерархию текстовых рамок, абзацев и фрагментов:
- ITextFrame представляет контейнер текста в фигуре и предоставляет доступ к её коллекции абзацев.
- IParagraph представляет один абзац в текстовой рамке и предоставляет доступ к её фрагментам и форматированию уровня абзаца.
- IPortion представляет участок текста внутри абзаца. Каждый фрагмент может иметь собственный текст и форматирование символов.
Таким образом, абзац может содержать текст с разными шрифтами, цветами, размерами и другим форматированием, используя несколько фрагментов.
Создание и форматирование абзацев
Создание абзацев с несколькими фрагментами
Следующие шаги создают текстовую рамку с тремя абзацами, каждый из которых содержит три фрагмента:
- Создайте экземпляр класса Presentation.
- Получите нужный слайд по его индексу.
- Добавьте прямоугольную IAutoShape на слайд.
- Получите ITextFrame фигуры.
- Используйте абзац по умолчанию и добавьте ещё два объекта IParagraph в текстовую рамку.
- Добавьте достаточное количество объектов IPortion для каждого абзаца, чтобы получить по три фрагмента. Абзац по умолчанию уже содержит один пустой фрагмент.
- Установите текст каждого фрагмента.
- Примените форматирование уровня символов через IPortion.getPortionFormat.
- Сохраните изменённую презентацию.
Этот пример на Java реализует указанные шаги:
import com.aspose.slides.*;
import java.awt.Color;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 50, 150, 300, 150);
ITextFrame textFrame = shape.getTextFrame();
IParagraph firstParagraph = textFrame.getParagraphs().get_Item(0);
firstParagraph.getPortions().add(new Portion());
firstParagraph.getPortions().add(new Portion());
IParagraph secondParagraph = new Paragraph();
secondParagraph.getPortions().add(new Portion());
secondParagraph.getPortions().add(new Portion());
secondParagraph.getPortions().add(new Portion());
textFrame.getParagraphs().add(secondParagraph);
IParagraph thirdParagraph = new Paragraph();
thirdParagraph.getPortions().add(new Portion());
thirdParagraph.getPortions().add(new Portion());
thirdParagraph.getPortions().add(new Portion());
textFrame.getParagraphs().add(thirdParagraph);
int paragraphCount = textFrame.getParagraphs().getCount();
for (int paragraphIndex = 0; paragraphIndex < paragraphCount; paragraphIndex++) {
IParagraph paragraph = textFrame.getParagraphs().get_Item(paragraphIndex);
int portionCount = paragraph.getPortions().getCount();
for (int portionIndex = 0; portionIndex < portionCount; portionIndex++) {
IPortion portion = paragraph.getPortions().get_Item(portionIndex);
portion.setText("Portion " + (paragraphIndex + 1) + "." + (portionIndex + 1));
if (portionIndex == 0) {
portion.getPortionFormat().getFillFormat().setFillType(FillType.Solid);
portion.getPortionFormat().getFillFormat().getSolidFillColor().setColor(Color.RED);
portion.getPortionFormat().setFontBold(NullableBool.True);
portion.getPortionFormat().setFontHeight(15);
} else if (portionIndex == 1) {
portion.getPortionFormat().getFillFormat().setFillType(FillType.Solid);
portion.getPortionFormat().getFillFormat().getSolidFillColor().setColor(Color.BLUE);
portion.getPortionFormat().setFontItalic(NullableBool.True);
portion.getPortionFormat().setFontHeight(18);
}
}
}
presentation.save("paragraphs_with_portions.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Создание маркированных и нумерованных списков
Создание маркированного или нумерованного списка
Марки и нумерация упрощают восприятие связанных элементов. В Aspose.Slides настройки списка определяются через IBulletFormat.
- Создайте экземпляр класса Presentation.
- Получите нужный слайд по его индексу.
- Добавьте IAutoShape на выбранный слайд.
- Получите ITextFrame фигуры.
- Удалите абзац по умолчанию из текстовой рамки.
- Создайте объект Paragraph для символической марки.
- Установите IBulletFormat.setType в значение BulletType.Symbol и задайте символ марки.
- Установите текст абзаца, отступ, цвет марки и высоту марки.
- Добавьте абзац в текстовую рамку.
- Создайте второй абзац и установите IBulletFormat.setType в значение BulletType.Numbered.
- Настройте стиль нумерованной марки и добавьте абзац в текстовую рамку.
- Сохраните презентацию.
Этот пример на Java создает символическую и нумерованную марки:
import com.aspose.slides.*;
import java.awt.Color;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 200, 200, 400, 200);
ITextFrame textFrame = shape.getTextFrame();
textFrame.getParagraphs().clear();
Paragraph symbolParagraph = new Paragraph();
symbolParagraph.setText("Welcome to Aspose.Slides");
symbolParagraph.getParagraphFormat().getBullet().setType(BulletType.Symbol);
symbolParagraph.getParagraphFormat().getBullet().setChar((char) 0x2022);
symbolParagraph.getParagraphFormat().setIndent(25);
symbolParagraph.getParagraphFormat().getBullet().getColor().setColorType(ColorType.RGB);
symbolParagraph.getParagraphFormat().getBullet().getColor().setColor(Color.BLACK);
symbolParagraph.getParagraphFormat().getBullet().setBulletHardColor(NullableBool.True);
symbolParagraph.getParagraphFormat().getBullet().setHeight(100);
textFrame.getParagraphs().add(symbolParagraph);
Paragraph numberedParagraph = new Paragraph();
numberedParagraph.setText("This is a numbered item");
numberedParagraph.getParagraphFormat().getBullet().setType(BulletType.Numbered);
numberedParagraph.getParagraphFormat().getBullet().setNumberedBulletStyle(NumberedBulletStyle.BulletCircleNumWDBlackPlain);
numberedParagraph.getParagraphFormat().setIndent(25);
numberedParagraph.getParagraphFormat().getBullet().getColor().setColorType(ColorType.RGB);
numberedParagraph.getParagraphFormat().getBullet().getColor().setColor(Color.BLACK);
numberedParagraph.getParagraphFormat().getBullet().setBulletHardColor(NullableBool.True);
numberedParagraph.getParagraphFormat().getBullet().setHeight(100);
textFrame.getParagraphs().add(numberedParagraph);
presentation.save("bulleted_and_numbered_list.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Использование изображений в качестве марок
Изображения‑марки позволяют использовать собственный рисунок вместо символа или числа.
- Создайте экземпляр класса Presentation.
- Получите нужный слайд по его индексу.
- Добавьте IAutoShape и получайте её ITextFrame.
- Удалите абзац по умолчанию из текстовой рамки.
- Загрузите изображение марки и добавьте его в коллекцию изображений презентации как IPPImage.
- Создайте объект Paragraph и задайте его текст.
- Установите IBulletFormat.setType в значение BulletType.Picture.
- Присвойте изображение через IBulletFormat.getPicture и задайте высоту марки.
- Добавьте абзац в текстовую рамку.
- Сохраните изменённую презентацию.
Этот пример на Java создаёт марку‑изображение:
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IImage bulletImage = Images.fromFile("bullets.png");
IPPImage presentationImage;
try {
presentationImage = presentation.getImages().addImage(bulletImage);
} finally {
bulletImage.dispose();
}
IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 200, 200, 400, 200);
ITextFrame textFrame = shape.getTextFrame();
textFrame.getParagraphs().clear();
Paragraph paragraph = new Paragraph();
paragraph.setText("Welcome to Aspose.Slides");
paragraph.getParagraphFormat().getBullet().setType(BulletType.Picture);
paragraph.getParagraphFormat().getBullet().getPicture().setImage(presentationImage);
paragraph.getParagraphFormat().getBullet().setHeight(100);
textFrame.getParagraphs().add(paragraph);
presentation.save("picture_bullet.pptx", SaveFormat.Pptx);
presentation.save("picture_bullet.ppt", SaveFormat.Ppt);
} finally {
presentation.dispose();
}
Создание многоуровневого списка
Установите IParagraphFormat.setDepth для размещения абзацев на разных уровнях списка. Верхний уровень имеет глубину 0.
- Создайте объект Presentation и получите слайд.
- Добавьте IAutoShape и очистите абзац по умолчанию из её текстовой рамки.
- Создайте четыре абзаца и настройте их символы марок.
- Установите их значения IParagraphFormat.setDepth в
0,1,2и3. - Добавьте абзацы в текстовую рамку и сохраните презентацию.
Этот пример на Java создаёт четырёхуровневый маркированный список:
import com.aspose.slides.*;
import java.awt.Color;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 200, 200, 400, 200);
ITextFrame textFrame = shape.getTextFrame();
textFrame.getParagraphs().clear();
IParagraph firstParagraph = new Paragraph();
firstParagraph.setText("Content");
firstParagraph.getParagraphFormat().getBullet().setType(BulletType.Symbol);
firstParagraph.getParagraphFormat().getBullet().setChar((char) 0x2022);
firstParagraph.getParagraphFormat().getDefaultPortionFormat().getFillFormat().setFillType(FillType.Solid);
firstParagraph.getParagraphFormat().getDefaultPortionFormat().getFillFormat().getSolidFillColor().setColor(Color.BLACK);
firstParagraph.getParagraphFormat().setDepth((short) 0);
IParagraph secondParagraph = new Paragraph();
secondParagraph.setText("Second level");
secondParagraph.getParagraphFormat().getBullet().setType(BulletType.Symbol);
secondParagraph.getParagraphFormat().getBullet().setChar('-');
secondParagraph.getParagraphFormat().getDefaultPortionFormat().getFillFormat().setFillType(FillType.Solid);
secondParagraph.getParagraphFormat().getDefaultPortionFormat().getFillFormat().getSolidFillColor().setColor(Color.BLACK);
secondParagraph.getParagraphFormat().setDepth((short) 1);
IParagraph thirdParagraph = new Paragraph();
thirdParagraph.setText("Third level");
thirdParagraph.getParagraphFormat().getBullet().setType(BulletType.Symbol);
thirdParagraph.getParagraphFormat().getBullet().setChar((char) 0x2022);
thirdParagraph.getParagraphFormat().getDefaultPortionFormat().getFillFormat().setFillType(FillType.Solid);
thirdParagraph.getParagraphFormat().getDefaultPortionFormat().getFillFormat().getSolidFillColor().setColor(Color.BLACK);
thirdParagraph.getParagraphFormat().setDepth((short) 2);
IParagraph fourthParagraph = new Paragraph();
fourthParagraph.setText("Fourth level");
fourthParagraph.getParagraphFormat().getBullet().setType(BulletType.Symbol);
fourthParagraph.getParagraphFormat().getBullet().setChar('-');
fourthParagraph.getParagraphFormat().getDefaultPortionFormat().getFillFormat().setFillType(FillType.Solid);
fourthParagraph.getParagraphFormat().getDefaultPortionFormat().getFillFormat().getSolidFillColor().setColor(Color.BLACK);
fourthParagraph.getParagraphFormat().setDepth((short) 3);
textFrame.getParagraphs().add(firstParagraph);
textFrame.getParagraphs().add(secondParagraph);
textFrame.getParagraphs().add(thirdParagraph);
textFrame.getParagraphs().add(fourthParagraph);
presentation.save("multilevel_list.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Задание пользовательского начального значения для нумерованного списка
Используйте IBulletFormat.setNumberedBulletStartWith для указания начального номера нумерованного абзаца.
- Создайте объект Presentation и добавьте IAutoShape на слайд.
- Очистите абзац по умолчанию из текстовой рамки фигуры.
- Создайте три нумерованных абзаца.
- Установите IBulletFormat.setNumberedBulletStartWith в
2,3и7для соответствующих абзацев. - Добавьте абзацы в текстовую рамку и сохраните презентацию.
Этот пример на Java задаёт пользовательский стартовый номер каждому абзацу:
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 200, 200, 400, 200);
ITextFrame textFrame = shape.getTextFrame();
textFrame.getParagraphs().clear();
Paragraph firstParagraph = new Paragraph();
firstParagraph.setText("Start at 2");
firstParagraph.getParagraphFormat().getBullet().setType(BulletType.Numbered);
firstParagraph.getParagraphFormat().getBullet().setNumberedBulletStartWith((short) 2);
textFrame.getParagraphs().add(firstParagraph);
Paragraph secondParagraph = new Paragraph();
secondParagraph.setText("Start at 3");
secondParagraph.getParagraphFormat().getBullet().setType(BulletType.Numbered);
secondParagraph.getParagraphFormat().getBullet().setNumberedBulletStartWith((short) 3);
textFrame.getParagraphs().add(secondParagraph);
Paragraph thirdParagraph = new Paragraph();
thirdParagraph.setText("Start at 7");
thirdParagraph.getParagraphFormat().getBullet().setType(BulletType.Numbered);
thirdParagraph.getParagraphFormat().getBullet().setNumberedBulletStartWith((short) 7);
textFrame.getParagraphs().add(thirdParagraph);
presentation.save("custom_numbered_list.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Управление разметкой абзаца и свойствами завершения
Установка отступа первой строки
Используйте IParagraphFormat.setIndent для управления отступом первой строки абзаца. Этот метод смещает только первую строку относительно левого поля абзаца. Положительное значение сдвигает первую строку вправо, остальные строки остаются выровненными по телу абзаца.
Используйте IParagraphFormat.setMarginLeft, когда нужно переместить весь абзац. Применяйте IParagraphFormat.setIndent, когда необходимо сместить только первую строку.
Пример ниже создаёт несколько абзацев и применяет разные значения IParagraphFormat.setIndent для демонстрации влияния отступа первой строки на разметку абзаца.
- Создайте экземпляр класса Presentation.
- Получите целевой слайд.
- Добавьте прямоугольную IAutoShape на слайд.
- Получите ITextFrame фигуры и удалите абзац по умолчанию.
- Создайте несколько абзацев и задайте для них разные значения IParagraphFormat.setIndent.
- Добавьте абзацы в текстовую рамку.
- Сохраните изменённую презентацию.
Этот код показывает, как задать отступ абзаца:
import com.aspose.slides.*;
import java.awt.Color;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 50, 50, 420, 220);
shape.getFillFormat().setFillType(FillType.NoFill);
shape.getLineFormat().getFillFormat().setFillType(FillType.Solid);
shape.getLineFormat().getFillFormat().getSolidFillColor().setColor(Color.GRAY);
ITextFrame textFrame = shape.getTextFrame();
textFrame.getTextFrameFormat().setAutofitType(TextAutofitType.Shape);
textFrame.getParagraphs().clear();
Paragraph firstParagraph = new Paragraph();
firstParagraph.setText("No first-line indent. Wrapped lines start at the same position as the first line.");
firstParagraph.getParagraphFormat().getDefaultPortionFormat().getFillFormat().setFillType(FillType.Solid);
firstParagraph.getParagraphFormat().getDefaultPortionFormat().getFillFormat().getSolidFillColor().setColor(Color.BLACK);
firstParagraph.getParagraphFormat().setMarginLeft(20f);
firstParagraph.getParagraphFormat().setIndent(0f);
Paragraph secondParagraph = new Paragraph();
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().getDefaultPortionFormat().getFillFormat().setFillType(FillType.Solid);
secondParagraph.getParagraphFormat().getDefaultPortionFormat().getFillFormat().getSolidFillColor().setColor(Color.BLACK);
secondParagraph.getParagraphFormat().setMarginLeft(20f);
secondParagraph.getParagraphFormat().setIndent(20f);
Paragraph thirdParagraph = new Paragraph();
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().getDefaultPortionFormat().getFillFormat().setFillType(FillType.Solid);
thirdParagraph.getParagraphFormat().getDefaultPortionFormat().getFillFormat().getSolidFillColor().setColor(Color.BLACK);
thirdParagraph.getParagraphFormat().setMarginLeft(20f);
thirdParagraph.getParagraphFormat().setIndent(40f);
textFrame.getParagraphs().add(firstParagraph);
textFrame.getParagraphs().add(secondParagraph);
textFrame.getParagraphs().add(thirdParagraph);
presentation.save("paragraph_indent.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Результат:

Установка висячего отступа
Висячий отступ — это разметка абзаца, при которой первая строка начинается левее остальных строк. В Aspose.Slides такой эффект создаётся с помощью IParagraphFormat.setIndent. Передайте отрицательное значение, чтобы переместить первую строку влево относительно тела абзаца.
На практике IParagraphFormat.setMarginLeft задаёт левую позицию тела абзаца, а IParagraphFormat.setIndent определяет позицию первой строки относительно этого поля. Чтобы создать висячий отступ, задайте положительное значение для setMarginLeft и отрицательное значение для setIndent.
Такое форматирование удобно для библиографий, ссылок, глоссариев и других абзацев, где строки‑переносы должны выравниваться под телом абзаца, а не под первым символом первой строки.
- Создайте экземпляр класса Presentation.
- Получите целевой слайд.
- Добавьте прямоугольную IAutoShape на слайд.
- Получите ITextFrame фигуры и удалите абзац по умолчанию.
- Создайте абзацы и задайте положительное значение IParagraphFormat.setMarginLeft для каждого.
- Передайте отрицательное значение IParagraphFormat.setIndent для создания эффекта висячего отступа.
- Добавьте абзацы в текстовую рамку.
- Сохраните изменённую презентацию.
Этот код показывает, как задать висячий отступ для абзаца:
import com.aspose.slides.*;
import java.awt.Color;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 50, 50, 420, 220);
shape.getFillFormat().setFillType(FillType.NoFill);
shape.getLineFormat().getFillFormat().setFillType(FillType.Solid);
shape.getLineFormat().getFillFormat().getSolidFillColor().setColor(Color.GRAY);
ITextFrame textFrame = shape.getTextFrame();
textFrame.getTextFrameFormat().setAutofitType(TextAutofitType.Shape);
textFrame.getParagraphs().clear();
Paragraph firstParagraph = new Paragraph();
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().getDefaultPortionFormat().getFillFormat().setFillType(FillType.Solid);
firstParagraph.getParagraphFormat().getDefaultPortionFormat().getFillFormat().getSolidFillColor().setColor(Color.BLACK);
firstParagraph.getParagraphFormat().setMarginLeft(40f);
firstParagraph.getParagraphFormat().setIndent(-20f);
Paragraph secondParagraph = new Paragraph();
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().getDefaultPortionFormat().getFillFormat().setFillType(FillType.Solid);
secondParagraph.getParagraphFormat().getDefaultPortionFormat().getFillFormat().getSolidFillColor().setColor(Color.BLACK);
secondParagraph.getParagraphFormat().setMarginLeft(60f);
secondParagraph.getParagraphFormat().setIndent(-30f);
textFrame.getParagraphs().add(firstParagraph);
textFrame.getParagraphs().add(secondParagraph);
presentation.save("hanging_indent.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Результат:

Установка свойств конца абзаца
IParagraph.setEndParagraphPortionFormat управляет форматированием символа конца абзаца. В следующем примере задаётся размер шрифта и латинский шрифт для конца второго абзаца:
- Загрузите объект Presentation и получите слайд.
- Добавьте IAutoShape и очистите его абзац по умолчанию.
- Создайте два абзаца и добавьте к ним текстовые фрагменты.
- Создайте объект PortionFormat для символа конца второго абзаца.
- Установите IBasePortionFormat.setFontHeight и IBasePortionFormat.setLatinFont.
- Примените формат с помощью IParagraph.setEndParagraphPortionFormat и сохраните презентацию.
import com.aspose.slides.*;
Presentation presentation = new Presentation("Test.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 10, 200, 250);
ITextFrame textFrame = shape.getTextFrame();
textFrame.getParagraphs().clear();
Paragraph firstParagraph = new Paragraph();
firstParagraph.getPortions().add(new Portion("Sample text"));
Paragraph secondParagraph = new Paragraph();
secondParagraph.getPortions().add(new Portion("Sample text 2"));
PortionFormat endParagraphFormat = new PortionFormat();
endParagraphFormat.setFontHeight(48);
endParagraphFormat.setLatinFont(new FontData("Times New Roman"));
secondParagraph.setEndParagraphPortionFormat(endParagraphFormat);
textFrame.getParagraphs().add(firstParagraph);
textFrame.getParagraphs().add(secondParagraph);
presentation.save("end_paragraph_format.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Импорт и экспорт содержимого абзацев
Импорт HTML‑текста в абзацы
Используйте ParagraphCollection.addFromHtml для преобразования HTML‑разметки в абзацы и фрагменты внутри текстовой рамки.
- Создайте экземпляр класса Presentation.
- Получите слайд и добавьте IAutoShape.
- Получите ITextFrame фигуры и очистите абзац по умолчанию.
- Считайте исходный HTML‑файл.
- Передайте строку HTML в ParagraphCollection.addFromHtml.
- Сохраните изменённую презентацию.
Этот пример на Java импортирует HTML в текстовую рамку:
import com.aspose.slides.*;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
float shapeWidth = (float) presentation.getSlideSize().getSize().getWidth() - 20;
float shapeHeight = (float) presentation.getSlideSize().getSize().getHeight() - 20;
IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 10, shapeWidth, shapeHeight);
shape.getFillFormat().setFillType(FillType.NoFill);
shape.getTextFrame().getParagraphs().clear();
try {
byte[] htmlBytes = Files.readAllBytes(Paths.get("file.html"));
String html = new String(htmlBytes, StandardCharsets.UTF_8);
shape.getTextFrame().getParagraphs().addFromHtml(html);
presentation.save("html_text.pptx", SaveFormat.Pptx);
} catch (IOException exception) {
System.out.println("The HTML file could not be read: " + exception.getMessage());
}
} finally {
presentation.dispose();
}
Экспорт текста абзаца в HTML
Используйте ParagraphCollection.exportToHtml для экспорта выбранного диапазона абзацев в HTML.
- Создайте объект Presentation и загрузите нужную презентацию.
- Получите слайд и найдите IAutoShape, содержащий текст.
- Получите ITextFrame.
- Вызовите ParagraphCollection.exportToHtml с индексом начального абзаца и количеством абзацев для экспорта.
- Запишите полученную строку HTML в файл.
Этот пример на Java экспортирует все абзацы из первой текстовой фигуры:
import com.aspose.slides.*;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
Presentation presentation = new Presentation("ExportingHTMLText.pptx");
try {
IShape shape = presentation.getSlides().get_Item(0).getShapes().get_Item(0);
if (shape instanceof IAutoShape) {
IAutoShape textShape = (IAutoShape) shape;
ITextFrame textFrame = textShape.getTextFrame();
if (textFrame != null) {
IParagraphCollection paragraphs = textFrame.getParagraphs();
String html = paragraphs.exportToHtml(0, paragraphs.getCount(), null);
try {
Files.write(Paths.get("paragraphs.html"), html.getBytes(StandardCharsets.UTF_8));
} catch (IOException exception) {
System.out.println("The HTML file could not be written: " + exception.getMessage());
}
} else {
System.out.println("The first shape does not contain a text frame.");
}
} else {
System.out.println("The first shape is not a text shape.");
}
} finally {
presentation.dispose();
}
Отображение абзаца в виде изображения
IParagraph.getImage непосредственно рендерит отдельный абзац и возвращает объект IImage. Сохраните результат в файл или поток с помощью IImage.save. Нет необходимости рендерить всю содержащую фигуру или вручную обрезать bitmap.
IParagraph.getImage может вернуть null, если абзац не найден в родительской коллекции, не имеет корректных границ рендеринга или не может быть отрисован. Проверьте результат перед сохранением и освободите полученное изображение после использования.
Рендеринг абзаца в масштабе по умолчанию
Предположим, у нас есть файл презентации sample.pptx с одним слайдом, где первая фигура — текстовое поле, содержащее три абзаца.

Следующий пример рендерит второй абзац в обычной текстовой фигуре в масштабе по умолчанию и сохраняет полученное изображение в формате PNG. Блок finally гарантирует корректное освобождение изображения.
import com.aspose.slides.*;
Presentation presentation = new Presentation("sample.pptx");
try {
IShape shape = presentation.getSlides().get_Item(0).getShapes().get_Item(0);
if (shape instanceof IAutoShape) {
IAutoShape textShape = (IAutoShape) shape;
ITextFrame textFrame = textShape.getTextFrame();
if (textFrame != null && textFrame.getParagraphs().getCount() > 1) {
IParagraph paragraph = textFrame.getParagraphs().get_Item(1);
IImage paragraphImage = paragraph.getImage();
if (paragraphImage != null) {
try {
paragraphImage.save("paragraph.png", ImageFormat.Png);
} finally {
paragraphImage.dispose();
}
} else {
System.out.println("The paragraph could not be rendered.");
}
} else {
System.out.println("The expected paragraph was not found.");
}
} else {
System.out.println("The first shape is not a text shape.");
}
} finally {
presentation.dispose();
}
Результат:

Рендеринг абзаца в ячейке таблицы с масштабированием
Используйте перегруженный метод IParagraph.getImage, принимающий параметры float scaleX и float scaleY для задания горизонтального и вертикального коэффициентов масштабирования. Пример ниже создает таблицу, рендерит абзац в её первой ячейке с двойным масштабом по ширине и высоте и сохраняет результат как PNG‑изображение.
import com.aspose.slides.*;
float scaleX = 2f;
float scaleY = 2f;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
ITable table = slide.getShapes().addTable(50, 50, new double[] { 300 }, new double[] { 80 });
IParagraph paragraph = table.get_Item(0, 0).getTextFrame().getParagraphs().get_Item(0);
paragraph.setText("Text in a table cell");
IImage paragraphImage = paragraph.getImage(scaleX, scaleY);
if (paragraphImage != null) {
try {
paragraphImage.save("table_paragraph.png", ImageFormat.Png);
} finally {
paragraphImage.dispose();
}
} else {
System.out.println("The paragraph could not be rendered.");
}
} finally {
presentation.dispose();
}
Коэффициент масштаба 1 сохраняет размер оси в пикселях по умолчанию. Например, 2 для обеих осей даёт изображение, ширина и высота которого примерно в два раза больше исходных, а количество пикселей увеличивается в четыре раза. Более крупные коэффициенты обычно обеспечивают более чёткий текст при увеличении или выводе в высоком разрешении, но также увеличивают потребление памяти и размер файла. Коэффициенты меньше 1 дают меньшие изображения с меньшей детализацией. Используйте одинаковые коэффициенты, чтобы сохранить пропорции абзаца; разные горизонтальный и вертикальный коэффициенты растягивают вывод независимо.
Рендеринг всей фигуры с помощью IShape.getImage остаётся полезным, когда требуется включить заливку, границу или иной визуальный контекст фигуры. Для изображения только абзаца используйте IParagraph.getImage.
FAQ
Можно ли полностью отключить перенос строк внутри текстовой рамки?
Да. Установите ITextFrameFormat.setWrapText для отключения переноса, чтобы строки не разрывались у краёв рамки.
Как получить точные границы конкретного абзаца на слайде?
Вызовите IParagraph.getRect для получения ограничивающего прямоугольника абзаца. IPortion.getRect возвращает границы отдельного фрагмента.
Где управляется выравнивание абзаца (по левому, правому краю, по центру или по ширине)?
IParagraphFormat.setAlignment — настройка уровня абзаца, применяющаяся ко всему абзацу независимо от форматирования отдельных фрагментов.
Можно ли задать язык проверки орфографии для части абзаца?
Да. Установите IBasePortionFormat.setLanguageId для отдельных фрагментов, чтобы один абзац мог содержать текст на нескольких языках.