Открытие презентаций в C++
Обзор
Помимо создания презентаций PowerPoint с нуля, Aspose.Slides также позволяет открывать существующие презентации. После загрузки презентации вы можете получать информацию о ней, редактировать содержимое слайдов, добавлять новые слайды, удалять существующие и многое другое.
Открытие презентаций
Чтобы открыть существующую презентацию, создайте экземпляр класса Presentation и передайте путь к файлу в его конструктор.
Следующий пример на C++ показывает, как открыть презентацию и получить количество слайдов:
// Создайте объект класса Presentation и передайте путь к файлу в его конструктор.
auto presentation = MakeObject<Presentation>(u"Sample.pptx");
// Выведите общее количество слайдов в презентации.
Console::WriteLine(presentation->get_Slides()->get_Count());
presentation->Dispose();
Открытие защищённых паролем презентаций
Когда необходимо открыть презентацию, защищённую паролем, передайте пароль через метод set_Password класса LoadOptions для расшифровки и загрузки. Ниже приведён код на C++, демонстрирующий эту операцию:
auto loadOptions = MakeObject<LoadOptions>();
loadOptions->set_Password(u"YOUR_PASSWORD");
auto presentation = MakeObject<Presentation>(u"Sample.pptx", loadOptions);
// Выполните операции над расшифрованной презентацией.
presentation->Dispose();
Открытие больших презентаций
Aspose.Slides предоставляет варианты — в частности метод get_BlobManagementOptions класса LoadOptions — для помощи при загрузке больших презентаций.
Следующий код на C++ демонстрирует загрузку большой презентации (например, 2 ГБ):
auto filePath = u"LargePresentation.pptx";
auto loadOptions = MakeObject<LoadOptions>();
// Выберите поведение KeepLocked — файл презентации останется заблокированным в течение всего времени жизни
// экземпляра Presentation, но его не требуется загружать в память или копировать во временный файл.
loadOptions->get_BlobManagementOptions()->set_PresentationLockingBehavior(PresentationLockingBehavior::KeepLocked);
loadOptions->get_BlobManagementOptions()->set_IsTemporaryFilesAllowed(true);
loadOptions->get_BlobManagementOptions()->set_MaxBlobsBytesInMemory(10 * 1024 * 1024); // 10 МБ
auto presentation = MakeObject<Presentation>(filePath, loadOptions);
// Большая презентация загружена и может использоваться, при этом потребление памяти остается низким.
// Внесите изменения в презентацию.
presentation->get_Slide(0)->set_Name(u"Large presentation");
// Сохраните презентацию в другой файл. Потребление памяти остаётся низким во время этой операции.
presentation->Save(u"LargePresentation-copy.pptx", SaveFormat::Pptx);
// Не делайте этого! Будет выброшено исключение ввода‑вывода, потому что файл заблокирован до тех пор, пока объект презентации не будет уничтожен.
File::Delete(filePath);
presentation->Dispose();
// Здесь это можно сделать. Исходный файл больше не заблокирован объектом презентации.
File::Delete(filePath);
Info
Чтобы обойти некоторые ограничения при работе с потоками, Aspose.Slides может копировать содержимое потока. Загрузка большой презентации из потока приводит к копированию презентации и может замедлить процесс загрузки. Поэтому, когда необходимо загрузить большую презентацию, настоятельно рекомендуется использовать путь к файлу презентации, а не поток.
При создании презентации, содержащей большие объекты (видео, аудио, изображения высокого разрешения и т.п.), можно использовать BLOB management для снижения потребления памяти.
Управление внешними ресурсами
Aspose.Slides предоставляет интерфейс IResourceLoadingCallback, позволяющий управлять внешними ресурсами. Ниже показан код на C++, демонстрирующий использование интерфейса IResourceLoadingCallback:
class ImageLoadingHandler : public IResourceLoadingCallback
{
public:
ResourceLoadingAction ResourceLoading(SharedPtr<IResourceLoadingArgs> args) override
{
if (args->get_OriginalUri().EndsWith(u".jpg"))
{
try
{
// Загрузить заменяющее изображение.
auto imageData = File::ReadAllBytes(u"aspose-logo.jpg");
args->SetData(imageData);
return ResourceLoadingAction::UserProvided;
}
catch (Exception&)
{
return ResourceLoadingAction::Skip;
}
}
else if (args->get_OriginalUri().EndsWith(u".png"))
{
// Установить заменяющий URL.
args->set_Uri(u"http://www.google.com/images/logos/ps_logo2.png");
return ResourceLoadingAction::Default;
}
// Пропустить все остальные изображения.
return ResourceLoadingAction::Skip;
}
};
auto loadOptions = MakeObject<LoadOptions>();
loadOptions->set_ResourceLoadingCallback(MakeObject<ImageLoadingHandler>());
auto presentation = MakeObject<Presentation>(u"Sample.pptx", loadOptions);
Загрузка презентаций без встроенных двоичных объектов
Презентация PowerPoint может содержать следующие типы встроенных двоичных объектов:
- VBA‑проект (доступно через IPresentation::get_VbaProject);
- Данные встроенного OLE‑объекта (доступно через IOleEmbeddedDataInfo::get_EmbeddedFileData);
- Двоичные данные ActiveX‑контроля (доступно через IControl::get_ActiveXControlBinary).
С помощью метода ILoadOptions::set_DeleteEmbeddedBinaryObjects можно загрузить презентацию без каких‑либо встроенных двоичных объектов.
Этот метод полезен для удаления потенциально вредоносного двоичного содержимого. Ниже показан код на C++, демонстрирующий загрузку презентации без встроенного двоичного контента:
auto loadOptions = MakeObject<LoadOptions>();
loadOptions->set_DeleteEmbeddedBinaryObjects(true);
auto presentation = MakeObject<Presentation>(u"malware.ppt", loadOptions);
// Выполните операции над презентацией.
presentation->Dispose();
FAQ
Как определить, что файл повреждён и его нельзя открыть?
При загрузке будет выброшено исключение, связанное с разбором или проверкой формата. Такие ошибки часто указывают на недопустимую структуру ZIP‑архива или повреждённые записи PowerPoint.
Что происходит, если при открытии отсутствуют необходимые шрифты?
Файл откроется, но дальнейшее rendering/export может заменить шрифты. Настройте подстановку шрифтов с помощью Configure font substitutions или добавьте требуемые шрифты через add the required fonts в среду выполнения.
Что происходит с встроенными медиа (видео/аудио) при открытии?
Они становятся доступными как ресурсы презентации. Если медиа ссылки указывают внешние пути, убедитесь, что эти пути доступны в вашей среде; иначе rendering/export может опустить медиа.