Как форматировать текст на C++

Как форматировать текст на C++

Aspose.Slides FOSS for C++ provides fine-grained text formatting through the PortionFormat класс. A Portion является наименьшей независимой единицей текста; она соответствует одному запуску форматирования внутри абзаца. Это руководство показывает, как применять полужирный, курсив, размер шрифта и цветовое форматирование к тексту в презентации.

Пошаговое руководство

Шаг 1: Сборка и привязка библиотеки

git clone https://github.com/aspose-slides-foss/Aspose.Slides-FOSS-for-Cpp.git
cd Aspose.Slides-FOSS-for-Cpp && mkdir build && cd build
cmake .. && cmake --build .

Шаг 2: Добавьте форму с текстовым фреймом

Перед форматированием текста добавьте форму и задайте её текстовое содержимое через shape.text_frame()->set_text().

#include <Aspose/Slides/Foss/presentation.h>

int main() {
    namespace asf = Aspose::Slides::Foss;

    asf::Presentation prs;
    auto& slide = prs.slides()[0];
    auto& shape = slide.shapes().add_auto_shape(
        asf::ShapeType::RECTANGLE, 50, 50, 500, 150);
    shape.text_frame()->set_text("Default text: will be formatted");
    prs.save("output.pptx", asf::SaveFormat::PPTX);
    return 0;
}

Шаг 3: Получите доступ к TextFrame

shape.text_frame() возвращает указатель на TextFrame. Используйте -> чтобы вызвать методы у него.

auto* tf = shape.text_frame();          // pointer to the shape's text frame
tf->set_text("your text here");

A TextFrame содержит Paragraph объекты (tf->paragraphs()). Каждый Paragraph содержит Portion объекты (paragraph.portions()).


Шаг 4: Примените полужирный и курсивный формат

Используйте portion_format().set_font_bold() и portion_format().set_font_italic(). Эти методы принимают NullableBool::TRUE, NullableBool::FALSE, или NullableBool::NOT_DEFINED (наследовать от master).

#include <Aspose/Slides/Foss/presentation.h>

int main() {
    namespace asf = Aspose::Slides::Foss;

    asf::Presentation prs;
    auto& slide = prs.slides()[0];
    auto& shape = slide.shapes().add_auto_shape(
        asf::ShapeType::RECTANGLE, 50, 50, 500, 150);
    shape.text_frame()->set_text("Bold and italic text");
    auto* tf = shape.text_frame();

    auto& fmt = tf->paragraphs()[0].portions()[0].portion_format();
    fmt.set_font_bold(asf::NullableBool::TRUE);
    fmt.set_font_italic(asf::NullableBool::TRUE);

    prs.save("bold-italic.pptx", asf::SaveFormat::PPTX);
    return 0;
}

Шаг 5: Установите размер шрифта и цвет

Установить portion_format().set_font_height() для размера (в пунктах) и использовать fill_format() для цвета.

#include <Aspose/Slides/Foss/presentation.h>

int main() {
    namespace asf = Aspose::Slides::Foss;

    asf::Presentation prs;
    auto& slide = prs.slides()[0];
    auto& shape = slide.shapes().add_auto_shape(
        asf::ShapeType::RECTANGLE, 50, 50, 500, 150);
    shape.text_frame()->set_text("Large corporate-blue heading");
    auto* tf = shape.text_frame();

    auto& fmt = tf->paragraphs()[0].portions()[0].portion_format();
    fmt.set_font_height(32);                               // 32pt font
    fmt.set_font_bold(asf::NullableBool::TRUE);
    fmt.fill_format().set_fill_type(asf::FillType::SOLID);
    fmt.fill_format().solid_fill_color().set_color(
        asf::Color::from_argb(255, 0, 70, 127));

    prs.save("colored-text.pptx", asf::SaveFormat::PPTX);
    return 0;
}

Color::from_argb(alpha, red, green, blue) принимает значения 0-255 для каждого канала.


Шаг 6: Несколько фрагментов в одном абзаце

Один абзац может содержать несколько частей с разным форматированием. Добавьте новую Portion к абзацу portions() коллекция:

#include <Aspose/Slides/Foss/presentation.h>

int main() {
    namespace asf = Aspose::Slides::Foss;

    asf::Presentation prs;
    auto& slide = prs.slides()[0];
    auto& shape = slide.shapes().add_auto_shape(
        asf::ShapeType::RECTANGLE, 50, 50, 600, 100);
    shape.text_frame()->set_text(""); // start with empty text
    auto* tf = shape.text_frame();

    auto& paragraph = tf->paragraphs()[0];

    // First portion: normal text
    auto& portion1 = paragraph.portions()[0];
    portion1.set_text("Normal text followed by ");
    portion1.portion_format().set_font_height(20);

    // Second portion: bold red text
    asf::Portion portion2;
    portion2.set_text("bold red text");
    portion2.portion_format().set_font_height(20);
    portion2.portion_format().set_font_bold(asf::NullableBool::TRUE);
    portion2.portion_format().fill_format().set_fill_type(asf::FillType::SOLID);
    portion2.portion_format().fill_format().solid_fill_color().set_color(
        asf::Color::from_argb(255, 200, 0, 0));
    paragraph.portions().add(portion2);

    prs.save("mixed-format.pptx", asf::SaveFormat::PPTX);
    return 0;
}

Распространённые проблемы и их решения

Текст остаётся чёрным даже после установки цвета

Убедитесь fill_format().set_fill_type(FillType::SOLID) установлен перед назначением цвета. Без установки типа заливки изменение цвета может не дать эффекта.

NullableBool::TRUE против true

portion_format().set_font_bold() ожидает NullableBool::TRUE, а не C++ true. Передача true напрямую не скомпилируется или будет иметь неопределённое поведение в зависимости от разрешения перегрузки.

Шрифт не отображается в сохранённом файле

Этот set_latin_font() метод задает семейство латинских шрифтов. Если не задано, используется шрифт темы презентации. Пользовательские шрифты должны быть встроены или доступны на машине просмотра.


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

Как изменить семейство шрифта?

Установить portion_format().set_latin_font():

fmt.set_latin_font(asf::FontData("Arial"));

FontData принимает название семейства шрифтов в виде строки.

Как задать выравнивание абзаца?

Использовать paragraph_format().set_alignment():

tf.paragraphs()[0].paragraph_format().set_alignment(asf::TextAlignment::CENTER);

Поддерживаемые значения: LEFT, CENTER, RIGHT, JUSTIFY.

Как задать межстрочный интервал?

Использовать paragraph_format().set_space_before() (точек перед абзацем) или paragraph_format().set_space_after() (точек после абзаца):

tf.paragraphs()[0].paragraph_format().set_space_before(12); // 12pt before
tf.paragraphs()[0].paragraph_format().set_space_after(6);   // 6pt after

См. также

 Русский