Як створювати презентації на C++

Як створювати презентації на C++

Aspose.Slides FOSS for C++ дозволяє створювати презентації PowerPoint повністю на C++ без залежності від Microsoft Office. У цьому посібнику показано, як створити нову презентацію, додати слайди та фігури, форматувати текст і зберегти результат.

Покроковий посібник

Крок 1: Додайте бібліотеку до вашого CMake‑проекту

Використовуйте CMake FetchContent, щоб інтегрувати бібліотеку безпосередньо з GitHub. Потрібен C++20 або новіша версія.

cmake_minimum_required(VERSION 3.20)
project(my_slides_app LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

include(FetchContent)
FetchContent_Declare(
    aspose_slides_foss
    GIT_REPOSITORY https://github.com/aspose-slides-foss/Aspose.Slides-FOSS-for-Cpp.git
    GIT_TAG main
)
FetchContent_MakeAvailable(aspose_slides_foss)

add_executable(my_app main.cpp)
target_link_libraries(my_app PRIVATE aspose_slides_foss)

Інші системні пакети не потрібні.


Крок 2: Додайте необхідні заголовки

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

Усі типи знаходяться в просторі імен Aspose::Slides::Foss. Для стислості приклади нижче використовують псевдонім простору імен:

namespace asf = Aspose::Slides::Foss;

Крок 3: Створити презентацію

Створіть Presentation у стеку. Нова презентація починається з одного порожнього слайду.

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

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

    asf::Presentation prs;
    std::cout << "Slides in new presentation: " << prs.slides().size() << "\n";
    prs.save("output.pptx", asf::SaveFormat::PPTX);
    return 0;
}

Важливо: Використовуйте розміщення в стеку або std::unique_ptr, щоб деструктор автоматично звільняв внутрішні ресурси.


Крок 4: Доступ до слайду

Перший слайд має індекс 0. Порожня презентація містить саме один слайд.

namespace asf = Aspose::Slides::Foss;

asf::Presentation prs;
auto& slide = prs.slides()[0]; // zero-based index
prs.save("output.pptx", asf::SaveFormat::PPTX);

Крок 5: Додати форму

Використайте slide.shapes().add_auto_shape(), щоб додати AutoShape. Параметри – (shape_type, x, y, width, height), всі в пунктах (1 пункт = 1/72 дюйма; стандартний слайд – 720 × 540 пунктів).

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

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

    asf::Presentation prs;
    auto& slide = prs.slides()[0];

    // Rectangle at (50, 50) with 400 wide and 120 tall
    auto& shape = slide.shapes().add_auto_shape(
        asf::ShapeType::RECTANGLE, 50, 50, 400, 120);

    // Set text on the shape's text frame
    shape.text_frame()->set_text("Hello from Aspose.Slides FOSS!");

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

Крок 6: Зберегти презентацію

Викличте prs.save(path, SaveFormat::PPTX) до того, як Presentation вийде за межі області видимості. PPTX — єдиний підтримуваний формат виводу.

prs.save("result.pptx", asf::SaveFormat::PPTX);

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


Повний робочий приклад

Наступна програма створює презентацію з двома слайдами: на першому слайді розташовано заголовок, а на другому — таблицю.

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

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

    asf::Presentation prs;

    // --- Slide 1: title shape ---
    auto& slide1 = prs.slides()[0];
    auto& title = slide1.shapes().add_auto_shape(
        asf::ShapeType::RECTANGLE, 40, 40, 640, 80);
    title.text_frame()->set_text("Q1 Results: Executive Summary");
    auto& fmt = title.text_frame()->paragraphs()[0].portions()[0].portion_format();
    fmt.set_font_height(32);
    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));

    // --- Slide 2: table ---
    prs.slides().add_empty_slide(&prs.layout_slides()[0]);
    auto& slide2 = prs.slides()[1];
    std::vector<double> col_w = {200.0, 120.0, 120.0};
    std::vector<double> row_h = {40.0, 40.0, 40.0};
    auto& table = slide2.shapes().add_table(40, 40, col_w, row_h);

    std::vector<std::string> headers = {"Region", "Revenue", "Growth"};
    std::vector<std::vector<std::string>> data = {
        {"North", "$1.2M", "+8%"},
        {"South", "$0.9M", "+4%"},
    };
    for (size_t col = 0; col < headers.size(); ++col) {
        table.rows()[0][col].text_frame()->set_text(headers[col]);
    }
    for (size_t r = 0; r < data.size(); ++r) {
        for (size_t c = 0; c < data[r].size(); ++c) {
            table.rows()[r + 1][c].text_frame()->set_text(data[r][c]);
        }
    }

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

Поширені проблеми та виправлення

Segfault або double-free під час знищення Presentation

Ви зберігаєте посилання або вказівник на слайд або форму після того, як Presentation був знищений. Усі посилання, що повертаються slides(), shapes() тощо, стають недійсними, коли виконується деструктор Presentation. Тримайте Presentation живим протягом усього часу, коли ви використовуєте його дочірні об’єкти.

SaveFormat::PPTX is not a function помилка компілятора

SaveFormat::PPTX — це значення enum, а не функція. Використовуйте його як prs.save("file.pptx", asf::SaveFormat::PPTX).

Помилка компоновщика: невизначене посилання на Aspose::Slides::Foss::Presentation

Переконайтеся, що ваш CMakeLists.txt посилається на бібліотеку за допомогою target_link_libraries(my_app PRIVATE aspose_slides_foss).


Поширені запитання

Який розмір слайду за замовчуванням?

Новий Presentation() створює слайди стандартного розміру 10 × 7,5 дюйма (720 × 540 пунктів). Зміна розміру слайдів ще не підтримується в цьому випуску.

Чи можу я додати більше ніж один слайд?

Так. Викличте prs.slides().add_empty_slide(&prs.layout_slides()[0]), щоб додати порожній слайд і отримати доступ до нього за індексом:

prs.slides().add_empty_slide(&prs.layout_slides()[0]);
auto& slide2 = prs.slides()[1];

Чи можу я відкрити існуючий файл і додати слайди?

Так:

asf::Presentation prs("existing.pptx");
prs.slides().add_empty_slide(&prs.layout_slides()[0]);
prs.save("existing.pptx", asf::SaveFormat::PPTX);

Які формати я можу зберегти?

Підтримується лише SaveFormat::PPTX. Експорт у PDF, HTML, SVG або зображення недоступний у цій редакції.


Дивіться також

 Українська