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

Обзор

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

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

Получение границ текстовой части

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

auto presentation = System::MakeObject<Presentation>(u"Shapes.pptx");
auto slide = presentation->get_Slide(0);
auto shape = System::ExplicitCast<IAutoShape>(slide->get_Shape(0));
auto paragraphs = shape->get_TextFrame()->get_Paragraphs();

for (const auto& paragraph : paragraphs)
{
    auto portions = paragraph->get_Portions();
    for (const auto& portion : portions)
    {
        auto rectangle = portion->GetRect();
        auto rectangleX = rectangle.get_X();
        auto rectangleY = rectangle.get_Y();
        auto rectangleWidth = rectangle.get_Width();
        auto rectangleHeight = rectangle.get_Height();

        Console::WriteLine(u"X = {0}; Y = {1}; Width = {2}; Height = {3}", rectangleX, rectangleY, rectangleWidth, rectangleHeight);
    }
}

presentation->Dispose();

Получение координат текстовой части

Используйте IPortion::GetCoordinates для получения координат начала текстовой части:

auto presentation = System::MakeObject<Presentation>(u"Shapes.pptx");
auto slide = presentation->get_Slide(0);
auto shape = System::ExplicitCast<IAutoShape>(slide->get_Shape(0));
auto paragraphs = shape->get_TextFrame()->get_Paragraphs();

for (const auto& paragraph : paragraphs)
{
    auto portions = paragraph->get_Portions();
    for (const auto& portion : portions)
    {
        auto point = portion->GetCoordinates();
        auto pointX = point.get_X();
        auto pointY = point.get_Y();

        Console::WriteLine(u"X = {0}; Y = {1}", pointX, pointY);
    }
}

presentation->Dispose();

FAQ

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

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

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

Свойства уровня части имеют наивысший приоритет. Если свойство не задано в IPortion, Aspose.Slides берёт его из IParagraph. Если оно не задано и там, Aspose.Slides использует стиль ITextFrame или theme.

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

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

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

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