Управление абзацами текста PowerPoint в Python

Обзор

Aspose.Slides предоставляет классы, необходимые для работы с текстом PowerPoint в Python.

  • Aspose.Slides предоставляет класс TextFrame для создания объектов текстовых фреймов. Объект TextFrame может содержать один или несколько абзацев (каждый абзац разделяется возвратом каретки).
  • Aspose.Slides предоставляет класс Paragraph для создания объектов абзацев. Объект Paragraph может содержать один или несколько фрагментов текста.
  • Aspose.Slides предоставляет класс Portion для создания объектов фрагментов текста и указания их свойств форматирования.

Объект Paragraph может обрабатывать текст с различными свойствами форматирования через свои вложенные объекты Portion.

Добавление нескольких абзацев, содержащих несколько частей

Эти шаги показывают, как добавить текстовый фрейм, содержащий три абзаца, каждый из которых имеет три части:

  1. Создайте экземпляр класса Presentation.
  2. Получите ссылку на целевой слайд по его индексу.
  3. Добавьте прямоугольную AutoShape на слайд.
  4. Получите TextFrame, связанный с AutoShape.
  5. Создайте два объекта Paragraph и добавьте их в коллекцию абзацев TextFrame (вместе со стандартным абзацем это даст три абзаца).
  6. Для каждого абзаца создайте три объекта Portion и добавьте их в коллекцию фрагментов этого абзаца.
  7. Установите текст для каждого фрагмента.
  8. Примените необходимое форматирование к каждому фрагменту текста, используя свойства, доступные в Portion.
  9. Сохраните изменённую презентацию.

Следующий код Python реализует эти шаги:

import aspose.slides as slides
import aspose.pydrawing as draw

# Создать объект класса Presentation для создания нового файла PPTX.
with slides.Presentation() as presentation:

    # Доступ к первому слайду.
    slide = presentation.slides[0]

    # Добавить прямоугольный AutoShape.
    shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 50, 150, 300, 150)

    # Получить TextFrame AutoShape.
    text_frame = shape.text_frame

    # Создать абзацы и части; форматирование будет применено ниже.
    paragraph0 = text_frame.paragraphs[0]
    portion01 = slides.Portion()
    portion02 = slides.Portion()
    paragraph0.portions.add(portion01)
    paragraph0.portions.add(portion02)

    paragraph1 = slides.Paragraph()
    text_frame.paragraphs.add(paragraph1)
    portion10 = slides.Portion()
    portion11 = slides.Portion()
    portion12 = slides.Portion()
    paragraph1.portions.add(portion10)
    paragraph1.portions.add(portion11)
    paragraph1.portions.add(portion12)

    paragraph2 = slides.Paragraph()
    text_frame.paragraphs.add(paragraph2)
    portion20 = slides.Portion()
    portion21 = slides.Portion()
    portion22 = slides.Portion()
    paragraph2.portions.add(portion20)
    paragraph2.portions.add(portion21)
    paragraph2.portions.add(portion22)

    for i in range(3):
        for j in range(3):
            text_frame.paragraphs[i].portions[j].text = "Portion0" + str(j)
            if j == 0:
                text_frame.paragraphs[i].portions[j].portion_format.fill_format.fill_type = slides.FillType.SOLID
                text_frame.paragraphs[i].portions[j].portion_format.fill_format.solid_fill_color.color = draw.Color.red
                text_frame.paragraphs[i].portions[j].portion_format.font_bold = 1
                text_frame.paragraphs[i].portions[j].portion_format.font_height = 15
            elif j == 1:
                text_frame.paragraphs[i].portions[j].portion_format.fill_format.fill_type = slides.FillType.SOLID
                text_frame.paragraphs[i].portions[j].portion_format.fill_format.solid_fill_color.color = draw.Color.blue
                text_frame.paragraphs[i].portions[j].portion_format.font_italic = 1
                text_frame.paragraphs[i].portions[j].portion_format.font_height = 18

    # Сохранить PPTX на диск.
    presentation.save("paragraphs_and_portions_out.pptx", slides.export.SaveFormat.PPTX)

Управление маркированными абзацами

Маркированные списки помогают быстро и эффективно организовать и представить информацию. Абзацы с маркерами часто легче читать и понимать.

  1. Создайте экземпляр класса Presentation.
  2. Получите ссылку на целевой слайд по его индексу.
  3. Добавьте AutoShape на слайд.
  4. Получите TextFrame формы.
  5. Удалите стандартный абзац из TextFrame.
  6. Создайте первый абзац с помощью класса Paragraph.
  7. Установите тип маркера абзаца в SYMBOL и задайте символ маркера.
  8. Установите текст абзаца.
  9. Установите отступ маркера для абзаца.
  10. Установите цвет маркера.
  11. Установите размер (высоту) маркера.
  12. Добавьте абзац в коллекцию абзацев TextFrame.
  13. Добавьте второй абзац и повторите шаги 7–12.
  14. Сохраните презентацию.

Этот код Python показывает, как добавить маркированные абзацы:

import aspose.slides as slides
import aspose.pydrawing as draw

# Создать экземпляр презентации.
with slides.Presentation() as presentation:

    # Получить доступ к первому слайду.
    slide = presentation.slides[0]

    # Добавить и получить доступ к AutoShape.
    shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 200, 200, 400, 200)

    # Получить текстовый фрейм созданного AutoShape.
    text_frame = shape.text_frame

    # Удалить абзац по умолчанию.
    text_frame.paragraphs.remove_at(0)

    # Создать абзац.
    paragraph = slides.Paragraph()

    # Установить стиль маркера абзаца и символ.
    paragraph.paragraph_format.bullet.type = slides.BulletType.SYMBOL
    paragraph.paragraph_format.bullet.char = chr(8226)

    # Задать текст абзаца.
    paragraph.text = "Welcome to Aspose.Slides"

    # Установить отступ маркера.
    paragraph.paragraph_format.indent = 25

    # Установить цвет маркера.
    paragraph.paragraph_format.bullet.color.color_type = slides.ColorType.RGB
    paragraph.paragraph_format.bullet.color.color = draw.Color.black
    paragraph.paragraph_format.bullet.is_bullet_hard_color = 1 

    # Установить высоту маркера.
    paragraph.paragraph_format.bullet.height = 100

    # Добавить абзац в текстовый фрейм.
    text_frame.paragraphs.add(paragraph)

    # Создать второй абзац.
    paragraph2 = slides.Paragraph()

    # Установить тип и стиль маркера абзаца.
    paragraph2.paragraph_format.bullet.type = slides.BulletType.NUMBERED
    paragraph2.paragraph_format.bullet.numbered_bullet_style = slides.NumberedBulletStyle.BULLET_CIRCLE_NUM_WDBLACK_PLAIN

    # Задать текст абзаца.
    paragraph2.text = "This is numbered bullet"

    # Установить отступ маркера.
    paragraph2.paragraph_format.indent = 25

    # Установить цвет маркера.
    paragraph2.paragraph_format.bullet.color.color_type = slides.ColorType.RGB
    paragraph2.paragraph_format.bullet.color.color = draw.Color.black
    paragraph2.paragraph_format.bullet.is_bullet_hard_color = 1

    # Установить высоту маркера.
    paragraph2.paragraph_format.bullet.height = 100

    # Добавить абзац в текстовый фрейм.
    text_frame.paragraphs.add(paragraph2)

    # Сохранить презентацию в файл PPTX.
    presentation.save("bullets_out.pptx", slides.export.SaveFormat.PPTX)

Управление маркерами‑изображениями

Маркированные списки помогают быстро и эффективно организовать и представить информацию. Маркеры‑изображения легко читаются и понимаются.

  1. Создайте экземпляр класса Presentation.
  2. Получите ссылку на целевой слайд по его индексу.
  3. Добавьте AutoShape на слайд.
  4. Получите TextFrame формы.
  5. Удалите стандартный абзац из TextFrame.
  6. Создайте первый абзац с помощью класса Paragraph.
  7. Загрузите изображение в PPImage.
  8. Установите тип маркера в PPImage и задайте изображение.
  9. Установите текст абзаца.
  10. Установите отступ маркера для абзаца.
  11. Установите цвет маркера.
  12. Установите высоту маркера.
  13. Добавьте новый абзац в коллекцию абзацев TextFrame.
  14. Добавьте второй абзац и повторите шаги 8–12.
  15. Сохраните презентацию.

Этот код Python показывает, как добавить и управлять маркерами‑изображениями:

import aspose.slides as slides
import aspose.pydrawing as draw

with slides.Presentation() as presentation:

    # Доступ к первому слайду.
    slide = presentation.slides[0]

    # Загрузить изображение маркера.
    image = draw.Bitmap("bullets.png")
    pp_image = presentation.images.add_image(image)

    # Добавить и получить доступ к AutoShape.
    auto_shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 200, 200, 400, 200)

    # Доступ к TextFrame созданного AutoShape.
    text_frame = auto_shape.text_frame

    # Удалить абзац по умолчанию.
    text_frame.paragraphs.remove_at(0)

    # Создать новый абзац.
    paragraph = slides.Paragraph()
    paragraph.text = "Welcome to Aspose.Slides"

    # Установить тип маркера абзаца как Picture и назначить изображение.
    paragraph.paragraph_format.bullet.type = slides.BulletType.PICTURE
    paragraph.paragraph_format.bullet.picture.image = pp_image

    # Установить высоту маркера.
    paragraph.paragraph_format.bullet.height = 100

    # Добавить абзац в TextFrame.
    text_frame.paragraphs.add(paragraph)

    # Сохранить презентацию в файл PPTX.
    presentation.save("picture_bullets_out.pptx", slides.export.SaveFormat.PPTX)
    # Сохранить презентацию в файл PPT.
    presentation.save("picture_bullets_out.ppt", slides.export.SaveFormat.PPT)

Управление многоуровневыми маркерами

Маркированные списки помогают быстро и эффективно организовать и представить информацию. Многоуровневые маркеры легко читаются и понимаются.

  1. Создайте экземпляр класса Presentation.
  2. Получите ссылку на целевой слайд по его индексу.
  3. Добавьте AutoShape на слайд.
  4. Получите TextFrame у AutoShape.
  5. Удалите стандартный абзац из TextFrame.
  6. Создайте первый абзац с помощью класса Paragraph и задайте его глубину 0.
  7. Создайте второй абзац с помощью класса Paragraph и задайте его глубину 1.
  8. Создайте третий абзац с помощью класса Paragraph и задайте его глубину 2.
  9. Создайте четвертый абзац с помощью класса Paragraph и задайте его глубину 3.
  10. Добавьте новые абзацы в коллекцию абзацев TextFrame.
  11. Сохраните презентацию.

Следующий код Python показывает, как добавить и управлять многоуровневыми маркерами:

import aspose.slides as slides
import aspose.pydrawing as draw

# Создать экземпляр презентации.
with slides.Presentation() as presentation:

    # Получить доступ к первому слайду.
    slide = presentation.slides[0]
    
    # Добавить AutoShape.
    shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 200, 200, 400, 200)

    # Получить TextFrame созданного AutoShape.
    text_frame = auto_shape.text_frame
    
    # Очистить абзац по умолчанию.
    text_frame.paragraphs.clear()

    # Добавить первый абзац.
    paragraph1 = slides.Paragraph()
    paragraph1.text = "Content"
    paragraph1.paragraph_format.bullet.type = slides.BulletType.SYMBOL
    paragraph1.paragraph_format.bullet.char = chr(8226)
    paragraph1.paragraph_format.default_portion_format.fill_format.fill_type = slides.FillType.SOLID
    paragraph1.paragraph_format.default_portion_format.fill_format.solid_fill_color.color = draw.Color.black
    # Установить уровень маркера.
    paragraph1.paragraph_format.depth = 0

    # Добавить второй абзац.
    paragraph2 = slides.Paragraph()
    paragraph2.text = "Second Level"
    paragraph2.paragraph_format.bullet.type = slides.BulletType.SYMBOL
    paragraph2.paragraph_format.bullet.char = '-'
    paragraph2.paragraph_format.default_portion_format.fill_format.fill_type = slides.FillType.SOLID
    paragraph2.paragraph_format.default_portion_format.fill_format.solid_fill_color.color = draw.Color.black
    # Установить уровень маркера.
    paragraph2.paragraph_format.depth = 1

    # Добавить третий абзац.
    paragraph3 = slides.Paragraph()
    paragraph3.text = "Third Level"
    paragraph3.paragraph_format.bullet.type = slides.BulletType.SYMBOL
    paragraph3.paragraph_format.bullet.char = chr(8226)
    paragraph3.paragraph_format.default_portion_format.fill_format.fill_type = slides.FillType.SOLID
    paragraph3.paragraph_format.default_portion_format.fill_format.solid_fill_color.color = draw.Color.black
    # Установить уровень маркера.
    paragraph3.paragraph_format.depth = 2

    # Добавить четвертый абзац.
    paragraph4 = slides.Paragraph()
    paragraph4.text = "Fourth Level"
    paragraph4.paragraph_format.bullet.type = slides.BulletType.SYMBOL
    paragraph4.paragraph_format.bullet.char = '-'
    paragraph4.paragraph_format.default_portion_format.fill_format.fill_type = slides.FillType.SOLID
    paragraph4.paragraph_format.default_portion_format.fill_format.solid_fill_color.color = draw.Color.black
    # Установить уровень маркера.
    paragraph4.paragraph_format.depth = 3

    # Добавить абзацы в коллекцию.
    text_frame.paragraphs.add(paragraph1)
    text_frame.paragraphs.add(paragraph2)
    text_frame.paragraphs.add(paragraph3)
    text_frame.paragraphs.add(paragraph4)

    # Сохранить презентацию в файл PPTX.
    presentation.save("multilevel_bullets_out.pptx", slides.export.SaveFormat.PPTX)

Управление абзацами с пользовательскими нумерованными списками

Класс BulletFormat предоставляет свойство numbered_bullet_start_with (и другие) для контроля пользовательской нумерации и форматирования абзацев.

  1. Создайте экземпляр класса Presentation.
  2. Получите слайд, который будет содержать абзацы.
  3. Добавьте AutoShape на слайд.
  4. Получите TextFrame формы.
  5. Удалите стандартный абзац из TextFrame.
  6. Создайте первый Paragraph и установите numbered_bullet_start_with в 2.
  7. Создайте второй Paragraph и установите numbered_bullet_start_with в 3.
  8. Создайте третий Paragraph и установите numbered_bullet_start_with в 7.
  9. Добавьте абзацы в коллекцию TextFrame.
  10. Сохраните презентацию.

Следующий код Python демонстрирует, как добавить и управлять абзацами с пользовательской нумерацией и форматированием.

import aspose.slides as slides

with slides.Presentation() as presentation:

    # Добавить и получить доступ к AutoShape.
    shape = presentation.slides[0].shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 200, 200, 400, 200)

    # Получить доступ к TextFrame созданного AutoShape.
    text_frame = shape.text_frame

    # Удалить существующий абзац по умолчанию.
    text_frame.paragraphs.remove_at(0)

    # Создать первый нумерованный элемент (начинается с 2, уровень глубины 4).
    paragraph1 = slides.Paragraph()
    paragraph1.text = "bullet 2"
    paragraph1.paragraph_format.depth = 4 
    paragraph1.paragraph_format.bullet.numbered_bullet_start_with = 2
    paragraph1.paragraph_format.bullet.type = slides.BulletType.NUMBERED
    text_frame.paragraphs.add(paragraph1)

    # Создать второй нумерованный элемент (начинается с 3, уровень глубины 4).
    paragraph2 = slides.Paragraph()
    paragraph2.text = "bullet 3"
    paragraph2.paragraph_format.depth = 4
    paragraph2.paragraph_format.bullet.numbered_bullet_start_with = 3 
    paragraph2.paragraph_format.bullet.type = slides.BulletType.NUMBERED  
    text_frame.paragraphs.add(paragraph2)

    # Создать третий нумерованный элемент (начинается с 7, уровень глубины 4).
    paragraph5 = slides.Paragraph()
    paragraph5.text = "bullet 7"
    paragraph5.paragraph_format.depth = 4
    paragraph5.paragraph_format.bullet.numbered_bullet_start_with = 7
    paragraph5.paragraph_format.bullet.type = slides.BulletType.NUMBERED
    text_frame.paragraphs.add(paragraph5)

    presentation.save("custom_bullets_out.pptx", slides.export.SaveFormat.PPTX)

Установка отступа абзаца

Отступы абзацев помогают установить чёткую иерархию чтения на слайде и точно настроить выравнивание текста. Пример ниже показывает, как установить как общий, так и первый‑строчный отступ в Aspose.Slides для Python через свойства ParagraphFormat.

  1. Создайте экземпляр класса Presentation.
  2. Получите целевой слайд по его индексу.
  3. Добавьте прямоугольную AutoShape на слайд.
  4. Добавьте TextFrame с тремя абзацами к AutoShape.
  5. Скрыть контур прямоугольника.
  6. Установите отступ для каждого Paragraph с помощью свойства paragraph_format.
  7. Сохраните изменённую презентацию в виде файла PPT.

Следующий код Python показывает, как установить отступы абзацев:

import aspose.slides as slides

# Создать экземпляр класса Presentation.
with slides.Presentation() as presentation:

    # Доступ к первому слайду.
    slide = presentation.slides[0]

    # Добавить прямоугольную форму.
    shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 100, 100, 500, 150)

    # Добавить TextFrame к прямоугольнику.
    text_frame = shape.add_text_frame("This is first line \rThis is second line \rThis is third line")

    # Установить автоматическое размещение текста по форме.
    text_frame.text_frame_format.autofit_type = slides.TextAutofitType.SHAPE

    # Установить сплошную обводку для прямоугольника.
    shape.line_format.fill_format.fill_type = slides.FillType.SOLID

    # Получить первый абзац в TextFrame и установить его маркер и отступ.
    paragraph1 = text_frame.paragraphs[0]
    # Установить стиль маркера абзаца и символ.
    paragraph1.paragraph_format.bullet.type = slides.BulletType.SYMBOL
    paragraph1.paragraph_format.bullet.char = chr(8226)
    paragraph1.paragraph_format.alignment = slides.TextAlignment.LEFT

    paragraph1.paragraph_format.depth = 2
    paragraph1.paragraph_format.indent = 30

    # Получить второй абзац в TextFrame и установить его маркер и отступ.
    paragraph2 = text_frame.paragraphs[1]
    paragraph2.paragraph_format.bullet.type = slides.BulletType.SYMBOL
    paragraph2.paragraph_format.bullet.char = chr(8226)
    paragraph2.paragraph_format.alignment = slides.TextAlignment.LEFT
    paragraph2.paragraph_format.depth = 2
    paragraph2.paragraph_format.indent = 40

    # Получить третий абзац в TextFrame и установить его маркер и отступ.
    paragraph3 = text_frame.paragraphs[2]
    paragraph3.paragraph_format.bullet.type = slides.BulletType.SYMBOL
    paragraph3.paragraph_format.bullet.char = chr(8226)
    paragraph3.paragraph_format.alignment = slides.TextAlignment.LEFT
    paragraph3.paragraph_format.depth = 2
    paragraph3.paragraph_format.indent = 50

    # Записать презентацию на диск.
    presentation.save("indent_out.pptx", slides.export.SaveFormat.PPTX)

Установка висячего отступа для абзацев

Этот код Python показывает, как установить висячий отступ для абзаца:

import aspose.slides as slides

with slides.Presentation() as presentation:
    auto_shape = presentation.slides[0].shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 50, 250, 550, 150)

    paragraph1 = slides.Paragraph()
    paragraph1.text = "Example"
    paragraph2 = slides.Paragraph()
    paragraph2.text = "Set Hanging Indent for Paragraphs"
    paragraph3 = slides.Paragraph()
    paragraph3.text = "This Python code shows how to set a hanging indent for a paragraph: "

    paragraph2.paragraph_format.margin_left = 10
    paragraph3.paragraph_format.margin_left = 20

    paragraphs = auto_shape.text_frame.paragraphs
    paragraphs.add(paragraph1)
    paragraphs.add(paragraph2)
    paragraphs.add(paragraph3)

    presentation.save("presentation.pptx", slides.export.SaveFormat.PPTX)

Управление форматом конечного фрагмента абзаца

Когда необходимо контролировать оформление «конца» абзаца (форматирование, применяемое после последнего фрагмента текста), используйте свойство end_paragraph_portion_format. Пример ниже применяет более крупный шрифт Times New Roman к концу второго абзаца.

  1. Создайте или откройте файл Presentation.
  2. Получите целевой слайд по индексу.
  3. Добавьте прямоугольный AutoShape на слайд.
  4. Используйте TextFrame формы и создайте два абзаца.
  5. Создайте PortionFormat со шрифтом Times New Roman 48 pt и примените его как формат конечного фрагмента абзаца.
  6. Присвойте его свойству end_paragraph_portion_format абзаца (применяется к окончанию второго абзаца).
  7. Запишите изменённую презентацию в файл PPTX.

Этот код Python показывает, как установить формат конечного фрагмента для второго абзаца:

import aspose.slides as slides

with slides.Presentation("presentation.pptx") as presentation:
	shape = presentation.slides[0].shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 10, 10, 200, 250)

	paragraph1 = slides.Paragraph()
	paragraph1.portions.add(slides.Portion("Sample text"))

	end_paragraph_portion_format = slides.PortionFormat()
	end_paragraph_portion_format.font_height = 48
	end_paragraph_portion_format.latin_font = slides.FontData("Times New Roman")

	paragraph2 = slides.Paragraph()
	paragraph2.portions.add(slides.Portion("Sample text 2"))
	paragraph2.end_paragraph_portion_format = end_paragraph_portion_format

	shape.text_frame.paragraphs.add(paragraph1)
	shape.text_frame.paragraphs.add(paragraph2)

	presentation.save("presentation.pptx", slides.export.SaveFormat.PPTX)

Импорт HTML‑текста в абзацы

Aspose.Slides предоставляет расширенную поддержку импорта HTML‑текста в абзацы.

  1. Создайте экземпляр класса Presentation.
  2. Получите целевой слайд по его индексу.
  3. Добавьте AutoShape на слайд.
  4. Получите TextFrame у AutoShape.
  5. Удалите стандартный абзац из TextFrame.
  6. Прочитайте исходный HTML‑файл.
  7. Создайте первый абзац с помощью класса Paragraph.
  8. Добавьте HTML‑содержимое в коллекцию абзацев TextFrame.
  9. Сохраните изменённую презентацию.

Следующий код Python реализует эти шаги для импорта HTML‑текста в абзацы.

import aspose.slides as slides

# Создать пустой экземпляр Presentation.
with slides.Presentation() as presentation:

    # Получить доступ к первому слайду презентации.
    slide = presentation.slides[0]

    slide_width = presentation.slide_size.size.width
    slide_height = presentation.slide_size.size.height

    # Добавить AutoShape для размещения HTML содержимого.
    shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 10, 10, slide_width - 20, slide_height - 10)

    # Очистить все абзацы в добавленном текстовом фрейме.
    shape.text_frame.paragraphs.clear()

    # Загрузить HTML файл.
    with open("file.html", "rt") as html_stream:
        # Добавить текст из HTML файла в текстовый фрейм.
        shape.text_frame.paragraphs.add_from_html(html_stream.read())

    # Сохранить презентацию.
    presentation.save("output.pptx", slides.export.SaveFormat.PPTX)

Экспорт текста абзаца в HTML

Aspose.Slides предоставляет расширенную поддержку экспорта текста в HTML.

  1. Создайте экземпляр класса Presentation и загрузите целевую презентацию.
  2. Получите нужный слайд по его индексу.
  3. Выберите форму, содержащую текст для экспорта.
  4. Получите TextFrame формы.
  5. Откройте файловый поток для записи вывода HTML.
  6. Укажите начальный индекс и экспортируйте требуемые абзацы.

Этот пример Python показывает, как экспортировать текст абзаца в HTML.

import aspose.slides as slides

# Загрузить файл презентации.
with slides.Presentation("exporting_HTML_text.pptx") as presentation:
    # Получить доступ к первому слайду презентации.
    slide = presentation.slides[0]

    # Индекс целевой фигуры.
    index = 0

    # Получить фигуру по индексу.
    shape = slide.shapes[index]

    with open("output.html", "w") as html_stream:
        # Записать данные абзацев в HTML, указав начальный индекс абзаца и общее количество экспортируемых абзацев.
        html_stream.write(shape.text_frame.paragraphs.export_to_html(0, shape.text_frame.paragraphs.count, None))

Сохранение абзаца в виде изображения

В этом разделе мы рассмотрим два примера, демонстрирующие, как сохранить текстовый абзац, представленный классом Paragraph, в виде изображения. Оба примера включают получение изображения формы, содержащей абзац, с помощью методов get_image класса Shape, вычисление границ абзаца внутри формы и экспорт его в виде растрового изображения. Эти подходы позволяют извлекать отдельные части текста из презентаций PowerPoint и сохранять их как отдельные изображения, что может быть полезно в различных сценариях.

Предположим, что у нас есть файл презентации sample.pptx с одним слайдом, где первая форма — это текстовое поле, содержащее три абзаца.

Текстовое поле с тремя абзацами

Пример 1

В этом примере мы получаем второй абзац в виде изображения. Для этого извлекаем изображение формы с первого слайда презентации, затем вычисляем границы второго абзаца в текстовом фрейме формы. Затем абзац перерисовывается на новом растровом изображении, которое сохраняется в формате PNG. Этот метод особенно полезен, когда нужно сохранить конкретный абзац как отдельное изображение, сохранив точные размеры и форматирование текста.

import aspose.slides as slides
import math
import io
from PIL import Image

with slides.Presentation("sample.pptx") as presentation:
    first_shape = presentation.slides[0].shapes[0]

    # Сохранить форму в памяти как битмап.
    with first_shape.get_image() as shape_image:
        shape_image_stream = io.BytesIO()
        shape_image.save(shape_image_stream, slides.ImageFormat.PNG)

    # Создать битмап формы из памяти.
    shape_image_stream.seek(0)
    shape_bitmap = Image.open(shape_image_stream)

    # Вычислить границы второго абзаца.
    second_paragraph = first_shape.text_frame.paragraphs[1]
    paragraph_rectangle = second_paragraph.get_rect()

    # Вычислить координаты и размер выходного изображения (минимальный размер - 1x1 пиксель).
    image_left = math.floor(paragraph_rectangle.x)
    image_top = math.floor(paragraph_rectangle.y)
    image_right = image_left + max(1, math.ceil(paragraph_rectangle.width))
    image_bottom = image_top + max(1, math.ceil(paragraph_rectangle.height))

    # Обрезать битмап формы, чтобы получить только битмап абзаца.
    paragraph_bitmap = shape_bitmap.crop((image_left, image_top, image_right, image_bottom))

    paragraph_bitmap.save("paragraph.png")

Результат:

Изображение абзаца

Пример 2

В этом примере мы расширяем предыдущий подход, добавляя коэффициенты масштабирования к изображению абзаца. Форма извлекается из презентации и сохраняется как изображение с коэффициентом масштабирования 2. Это обеспечивает более высокое разрешение при экспорте абзаца. Затем границы абзаца рассчитываются с учётом масштаба. Масштабирование особенно полезно, когда требуется более детальное изображение, например, для печати высокого качества.

import aspose.slides as slides
import math
import io
from PIL import Image

image_scale_x = 2
image_scale_y = image_scale_x

with slides.Presentation("sample.pptx") as presentation:
    first_shape = presentation.slides[0].shapes[0]

    # Сохранить форму в памяти как битмап.
    with first_shape.get_image(slides.ShapeThumbnailBounds.SHAPE, image_scale_x, image_scale_y) as shape_image:
        shape_image_stream = io.BytesIO()
        shape_image.save(shape_image_stream, slides.ImageFormat.PNG)

    # Создать битмап формы из памяти.
    shape_image_stream.seek(0)
    shape_bitmap = Image.open(shape_image_stream)

    # Вычислить границы второго абзаца.
    second_paragraph = first_shape.text_frame.paragraphs[1]
    paragraph_rectangle = second_paragraph.get_rect()
    paragraph_rectangle.x *= image_scale_x
    paragraph_rectangle.y *= image_scale_y
    paragraph_rectangle.width *= image_scale_x
    paragraph_rectangle.height *= image_scale_y

    # Вычислить координаты и размер выходного изображения (минимальный размер - 1x1 пиксель).
    image_left = math.floor(paragraph_rectangle.x)
    image_top = math.floor(paragraph_rectangle.y)
    image_right = image_left + max(1, math.ceil(paragraph_rectangle.width))
    image_bottom = image_top + max(1, math.ceil(paragraph_rectangle.height))

    # Обрезать битмап формы, чтобы получить только битмап абзаца.
    paragraph_bitmap = shape_bitmap.crop((image_left, image_top, image_right, image_bottom))

    paragraph_bitmap.save("paragraph.png")

Часто задаваемые вопросы

Можно ли полностью отключить перенос строк внутри текстового фрейма?

Да. Используйте параметр переноса текста у текстового фрейма (wrap_text), чтобы выключить перенос, и строки не будут разрываться по краям фрейма.

Как получить точные границы конкретного абзаца на слайде?

Можно получить прямоугольник, ограничивающий абзац (и даже отдельный фрагмент), чтобы узнать его точное положение и размер на слайде.

Где управляется выравнивание абзаца (лево/право/центр/по ширине)?

Alignment — это параметр уровня абзаца в ParagraphFormat; он применяется ко всему абзацу независимо от форматирования отдельных фрагментов.

Можно ли задать язык проверки орфографии только для части абзаца (например, одного слова)?

Да. Язык задаётся на уровне фрагмента (PortionFormat.language_id), поэтому в одном абзаце могут сосуществовать несколько языков.