Получить границы абзаца из презентаций в Python

Обзор

Эта статья объясняет, как получить границы, размер и координаты абзацев в Aspose.Slides. В ней показано, как извлечь прямоугольник абзаца из TextFrame с помощью Paragraph.get_rect, как получить координаты абзаца внутри текстового кадра ячейки таблицы и выделены важные детали, такие как единицы измерения, влияние переноса текста на границы, преобразование в пиксели и эффективные параметры форматирования абзаца.

Получение прямоугольных координат абзаца

Используйте Paragraph.get_rect для получения ограничивающего прямоугольника абзаца.

import aspose.slides as slides

with slides.Presentation("Shapes.pptx") as presentation:
    slide = presentation.slides[0]
    shape = slide.shapes[0]
    paragraph = shape.text_frame.paragraphs[0]
    rectangle = paragraph.get_rect()

Получение размера абзаца внутри текстового кадра ячейки таблицы

Чтобы получить размер и координаты Paragraph в текстовом кадре ячейки таблицы, используйте Paragraph.get_rect. Возвращаемый прямоугольник задаётся относительно текстового кадра ячейки таблицы, поэтому при необходимости координат уровня слайда добавьте позицию таблицы и смещение ячейки.

Следующий пример получает границы абзаца внутри ячейки таблицы и рисует прямоугольники на слайде для визуализации этих границ:

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

with slides.Presentation("source.pptx") as presentation:
    slide = presentation.slides[0]
    table = slide.shapes[0]
    cell = table.rows[1][1]

    cell_x = table.x + cell.offset_x
    cell_y = table.y + cell.offset_y

    for paragraph in cell.text_frame.paragraphs:
        if paragraph.text == "":
            continue

        paragraph_rectangle = paragraph.get_rect()
        paragraph_rectangle_x = paragraph_rectangle.x + cell_x
        paragraph_rectangle_y = paragraph_rectangle.y + cell_y

        paragraph_bounds_shape = slide.shapes.add_auto_shape(
            slides.ShapeType.RECTANGLE,
            paragraph_rectangle_x,
            paragraph_rectangle_y,
            paragraph_rectangle.width,
            paragraph_rectangle.height)

        paragraph_bounds_shape.fill_format.fill_type = slides.FillType.NO_FILL
        paragraph_bounds_shape.line_format.fill_format.solid_fill_color.color = draw.Color.yellow
        paragraph_bounds_shape.line_format.fill_format.fill_type = slides.FillType.SOLID

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

FAQ

В каких единицах измеряются координаты абзаца?

Они измеряются в пунктах, где 1 дюйм равен 72 пунктам. Это относится ко всем координатам и размерам на слайде.

Влияет ли перенос слов на границы абзаца?

Да. Если для TextFrame включён TextFrameFormat.wrap_text, текст переносится, чтобы поместиться в ширину области, что изменяет фактические границы абзаца.

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

Да. Преобразуйте пункты в пиксели по формуле: пиксели = пункты × (DPI / 72). Результат зависит от выбранного DPI для рендеринга или экспорта.

Как получить «эффективные» параметры форматирования абзаца с учётом наследования стилей?

Используйте effective paragraph formatting data structure; он возвращает окончательные консолидированные значения отступов, интервалов, переноса, RTL и т. д.