Как сохранять презентации на C++

Как сохранять презентации на C++

Aspose.Slides FOSS for C++ saves presentations exclusively to .pptx формат, используя prs.save(path, SaveFormat::PPTX). Это руководство охватывает правильный шаблон сохранения, сохранение в другой путь и распространённые ошибки, связанные с сохранением.

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

Шаг 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: Открыть или создать презентацию

Используйте стековую аллокацию, чтобы деструктор очищал автоматически. Вызовите save() до того, как объект выйдет из области видимости.

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

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

    // Create new
    {
        asf::Presentation prs;
        prs.save("new.pptx", asf::SaveFormat::PPTX);
    }

    // Open existing
    {
        asf::Presentation prs("input.pptx");
        prs.save("output.pptx", asf::SaveFormat::PPTX);
    }

    return 0;
}

Шаг 3: Сохранить после всех изменений

Разместите save() вызов после завершения всех модификаций, но до того, как Presentation выйдет из области видимости.

#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, 300, 100);
    shape.text_frame()->set_text("Hello, World!");
    prs.save("output.pptx", asf::SaveFormat::PPTX);
    return 0;
}

Шаг 4: Сохранить в другой путь

Укажите другой путь вывода, чтобы создать новый файл без изменения оригинала:

asf::Presentation prs("template.pptx");
// modify ...
prs.save("customized.pptx", asf::SaveFormat::PPTX);

Этот template.pptx файл не изменён; customized.pptx создаётся (или перезаписывается, если уже существует).


Шаг 5: Проверить результат

После сохранения проверьте, что файл существует:

#include <filesystem>
#include <iostream>

auto output = std::filesystem::path("output.pptx");
std::cout << "Saved: " << std::filesystem::exists(output)
          << ", size: " << std::filesystem::file_size(output) << " bytes\n";

Поддерживаемый формат сохранения

ФорматЗначение перечисленияПоддерживается
PPTX (Office Open XML)SaveFormat::PPTXДа
PDFN/AНет
HTMLN/AНет
SVGN/AНет
PNG / JPEGN/AНет
ODP (OpenDocument)N/AНет

Поддерживается только PPTX. Попытка сохранить в любом другом формате вызовет исключение.


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

Ошибка «Отказано в доступе» при записи

Выходной файл открыт в другом приложении (например, PowerPoint держит файл открытым). Закройте файл в других приложениях перед сохранением.

Файл создан, но выглядит пустым или повреждённым

Убедитесь prs.save() вызывается до Presentation объект уничтожен. После уничтожения внутреннее состояние освобождается, и последующие вызовы завершатся неудачей или приведут к некорректному выводу.

Исключение при сохранении

Это происходит при попытке сохранить в формате, отличном от PPTX, или при использовании неподдерживаемой функции (например, диаграмм или анимаций) во время сохранения.


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

Можно ли сохранять в тот же файл, который я открыл?

Да. Сохранение в тот же путь перезаписывает оригинальный файл:

asf::Presentation prs("deck.pptx");
// modify ...
prs.save("deck.pptx", asf::SaveFormat::PPTX); // overwrites original

Можно ли сохранять в буфер памяти вместо файла?

Сохранение напрямую в std::vector<uint8_t> или std::ostream не поддерживается в текущем API. Сохраните во временный файл и прочитайте байты:

#include <filesystem>
#include <fstream>
#include <vector>

auto tmp = std::filesystem::temp_directory_path() / "temp.pptx";
prs.save(tmp.string(), asf::SaveFormat::PPTX);

std::ifstream in(tmp, std::ios::binary);
std::vector<uint8_t> bytes((std::istreambuf_iterator<char>(in)),
                            std::istreambuf_iterator<char>());
std::filesystem::remove(tmp);

Сохраняет ли процесс сохранения содержимое, которое я не изменял?

Да. Неизвестные XML‑части из оригинального файла сохраняются дословно. Библиотека сериализует только те части модели документа, которые она понимает, а любые неизвестные ей XML‑данные пропускает без изменений.


См. также

 Русский