Cách tạo bài thuyết trình bằng C++

Cách tạo bài thuyết trình bằng C++

Aspose.Slides FOSS for C++ lets you create PowerPoint presentations entirely in C++ with no dependency on Microsoft Office. This guide shows how to create a new presentation, add slides and shapes, format text, and save the result.

Hướng Dẫn Từng Bước

Bước 1: Thêm Thư viện vào Dự án CMake của bạn

Sử dụng CMake FetchContent để tích hợp thư viện trực tiếp từ GitHub. Yêu cầu C++20 trở lên.

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)

Không cần bất kỳ gói hệ thống nào khác.


Bước 2: Bao gồm các Header cần thiết

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

Tất cả các kiểu đều nằm trong Aspose::Slides::Foss namespace. Để ngắn gọn, các ví dụ dưới đây sử dụng một bí danh namespace:

namespace asf = Aspose::Slides::Foss;

Bước 3: Tạo một Bản trình chiếu

Khởi tạo một Presentation trên stack. Một bản trình bày mới bắt đầu với một slide trống.

#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;
}

Quan trọng: Sử dụng cấp phát trên stack hoặc std::unique_ptr để bộ hủy giải phóng tài nguyên nội bộ một cách tự động.


Bước 4: Truy cập một Slide

Slide đầu tiên có chỉ số 0. Một bản trình chiếu trống có đúng một slide.

namespace asf = Aspose::Slides::Foss;

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

Bước 5: Thêm một Hình dạng

Sử dụng slide.shapes().add_auto_shape() để thêm một AutoShape. Các tham số là (shape_type, x, y, width, height) tất cả tính bằng điểm (1 điểm = 1/72 inch; slide tiêu chuẩn là 720 x 540 pt).

#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;
}

Bước 6: Lưu Bản trình chiếu

Gọi prs.save(path, SaveFormat::PPTX) trước khi Presentation ra khỏi phạm vi. PPTX là định dạng đầu ra duy nhất được hỗ trợ.

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

Tệp được ghi một cách nguyên tử; nếu có lỗi xảy ra trước lời gọi này, sẽ không tạo ra tệp đầu ra.


Ví dụ Hoạt động Đầy đủ

Chương trình sau tạo một bản trình bày gồm hai slide, với một hình dạng tiêu đề trên slide đầu tiên và một bảng trên slide thứ hai.

#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;
}

Các Vấn Đề Thường Gặp và Cách Khắc Phục

Segfault hoặc double‑free trên Presentation khi hủy

Bạn đang lưu trữ một tham chiếu hoặc con trỏ tới một slide hoặc hình dạng sau khi Presentation đã bị phá hủy. Tất cả các tham chiếu được trả về bởi slides(), shapes(), v.v. sẽ bị vô hiệu hoá khi Presentation hàm hủy được chạy. Giữ Presentation đối tượng này còn sống trong suốt thời gian bạn sử dụng các đối tượng con của nó.

SaveFormat::PPTX is not a function lỗi biên dịch

SaveFormat::PPTX là một giá trị enum, không phải hàm. Hãy dùng nó như prs.save("file.pptx", asf::SaveFormat::PPTX).

lỗi liên kết: tham chiếu không xác định tới Aspose::Slides::Foss::Presentation

Đảm bảo rằng CMakeLists.txt liên kết với thư viện bằng target_link_libraries(my_app PRIVATE aspose_slides_foss).


Câu hỏi thường gặp

Kích thước slide mặc định là gì?

Một Presentation() tạo các slide với kích thước tiêu chuẩn 10 x 7,5 inch (720 x 540 điểm). Việc thay đổi kích thước slide chưa được hỗ trợ trong phiên bản này.

Tôi có thể thêm hơn một slide không?

Có. Gọi prs.slides().add_empty_slide(&prs.layout_slides()[0]) để thêm một slide trống và truy cập nó theo chỉ mục:

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

Tôi có thể mở một tệp hiện có và thêm slide không?

Có:

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

Tôi có thể lưu dưới định dạng nào?

Chỉ SaveFormat::PPTX được hỗ trợ. Xuất ra PDF, HTML, SVG, hoặc hình ảnh không khả dụng trong phiên bản này.


Xem thêm

 Tiếng Việt