Получить границы текстового фрагмента из презентаций в PHP

Обзор

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

В этой статье показано, как получить ограничивающий прямоугольник фрагмента, используя Portion::getRect. Также показано, как получить координаты начала фрагмента, используя Portion::getCoordinates. Кроме того, рассматриваются типичные сценарии, связанные с фрагментами, такие как применение гиперссылки к отдельному текстовому отрывку, понимание того, как форматирование разрешается через уровень фрагмента, абзаца, текстового кадра и наследование темы, а также обработка случаев, когда указанный шрифт недоступен.

Получить границы текстового фрагмента

Используйте Portion::getRect для получения ограничивающего прямоугольника текстового фрагмента:

$presentation = new Presentation("Shapes.pptx");
try {
    $slide = $presentation->getSlides()->get_Item(0);
    $shape = $slide->getShapes()->get_Item(0);

    foreach ($shape->getTextFrame()->getParagraphs() as $paragraph) {
        foreach ($paragraph->getPortions() as $portion) {
            $rectangle = $portion->getRect();
            $rectangleX = java_values($rectangle->getX());
            $rectangleY = java_values($rectangle->getY());
            $rectangleWidth = java_values($rectangle->getWidth());
            $rectangleHeight = java_values($rectangle->getHeight());

            echo("X = " . $rectangleX . "; Y = " . $rectangleY . "; Width = " . $rectangleWidth . "; Height = " . $rectangleHeight);
        }
    }
} finally {
    $presentation->dispose();
}

Получить координаты текстового фрагмента

Используйте Portion::getCoordinates для получения координат начала текстового фрагмента:

$presentation = new Presentation("Shapes.pptx");
try {
    $slide = $presentation->getSlides()->get_Item(0);
    $shape = $slide->getShapes()->get_Item(0);

    foreach ($shape->getTextFrame()->getParagraphs() as $paragraph) {
        foreach ($paragraph->getPortions() as $portion) {
            $point = $portion->getCoordinates();
            $pointX = java_values($point->getX());
            $pointY = java_values($point->getY());

            echo("X = " . $pointX . "; Y = " . $pointY);
        }
    }
} finally {
    $presentation->dispose();
}

Вопросы и ответы

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

Да, вы можете присвоить гиперссылку отдельному фрагменту; только этот отрывок будет кликабельным, а не весь абзац.

Как работает наследование стилей: что переопределяет фрагмент, а что берётся из абзаца или текстового кадра?

Свойства уровня фрагмента имеют наивысший приоритет. Если свойство не задано у Portion, Aspose.Slides берёт его из Paragraph. Если оно не задано и там, Aspose.Slides использует стиль из TextFrame или theme.

Что происходит, если указанный для фрагмента шрифт отсутствует на целевой машине или сервере?

Правила подстановки шрифтов применяются. Текст может перераспределиться: метрики, переносы и ширина могут измениться, что важно для точного позиционирования.

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

Да, цвет текста, заливка и прозрачность на уровне Portion могут отличаться от соседних фрагментов.