Конвертировать презентации PowerPoint в Markdown на C++
Обзор
Aspose.Slides for C++ может конвертировать презентации PPT и PPTX в Markdown для документации, статических сайтов, миграции контента и рабочих процессов контроля версий. Вы можете выбрать вариант Markdown, управлять тем, как отображается содержимое слайдов, и решать, где хранить экспортированные изображения и как генерируемый Markdown будет на них ссылаться.
По умолчанию экспорт в Markdown использует только текстовый вывод. Чтобы экспортировать визуальное содержимое, установите метод MarkdownSaveOptions::set_ExportType в значение Sequential или Visual из перечисления MarkdownExportType. Sequential выводит элементы слайда отдельно и в порядке их следования, тогда как Visual сохраняет сгруппированные элементы вместе, чтобы сохранить их визуальные отношения. Значение TextOnly не генерирует ресурсы изображений, поэтому события сохранения изображений не вызываются в этом режиме.
Конвертировать презентацию в Markdown
Загрузите исходный файл с помощью класса Presentation и затем вызовите метод Presentation::Save с параметром Md из перечисления SaveFormat.
#include <DOM/Presentation.h>
#include <Export/SaveFormat.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
auto presentation = System::MakeObject<Presentation>(u"presentation.pptx");
presentation->Save(u"presentation.md", SaveFormat::Md);
Выбор варианта Markdown
Метод MarkdownSaveOptions::set_Flavor управляет спецификацией Markdown, используемой для вывода. Перечисление Flavor включает CommonMark, GitHub Flavored Markdown и другие поддерживаемые варианты.
Ниже приведён пример экспорта презентации в CommonMark:
#include <DOM/Presentation.h>
#include <Export/Markdown/SaveOptions/Flavor.h>
#include <Export/Markdown/SaveOptions/MarkdownSaveOptions.h>
#include <Export/SaveFormat.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
auto presentation = System::MakeObject<Presentation>(u"presentation.pptx");
auto options = System::MakeObject<MarkdownSaveOptions>();
options->set_Flavor(Flavor::CommonMark);
presentation->Save(u"presentation.md", SaveFormat::Md, options);
Экспорт изображений с поведением сохранения по умолчанию
Класс MarkdownSaveOptions предоставляет два метода для настройки локального сохранения изображений:
- set_BasePath задаёт базовый каталог для документа Markdown и его ресурсов.
- set_ImagesSaveFolderName задаёт подпапку для изображений. Значением по умолчанию является
Images.
В следующем примере визуальное содержимое рендерится, изображения записываются в output/assets, а в документе Markdown создаются относительные ссылки на изображения:
#include <DOM/Presentation.h>
#include <Export/Markdown/SaveOptions/MarkdownExportType.h>
#include <Export/Markdown/SaveOptions/MarkdownSaveOptions.h>
#include <Export/SaveFormat.h>
#include <system/io/directory.h>
#include <system/io/path.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System::IO;
const System::String outputDirectory = u"output";
Directory::CreateDirectory_(outputDirectory);
auto presentation = System::MakeObject<Presentation>(u"presentation.pptx");
auto options = System::MakeObject<MarkdownSaveOptions>();
options->set_ExportType(MarkdownExportType::Visual);
options->set_BasePath(outputDirectory);
options->set_ImagesSaveFolderName(u"assets");
auto markdownPath = Path::Combine(outputDirectory, u"presentation.md");
presentation->Save(markdownPath, SaveFormat::Md, options);
Это поведение также используется как резервное, когда пользовательский обработчик сохранения изображения возвращает false.
Настройка сохранения изображений и ссылок Markdown
Используйте событие MarkdownSaveOptions::ImageSaving для не‑SVG растровых и метафайлов, генерируемых при экспорте Markdown. Делегат MarkdownImageSavingHandler получает объект IImage, его ImageFormat и сгенерированную ссылку Markdown в параметре System::String&. Сохраните или загрузите изображение в указанном формате и замените link на ссылку, которая должна появиться в выводе Markdown.
Ресурсы, генерируемые в формате SVG, обрабатываются отдельно. Подпишитесь на событие MarkdownSaveOptions::SvgImageSaving, делегат MarkdownSvgImageSavingHandler которого получает объект ISvgImage и параметр System::String& link. У SVG нет аргумента ImageFormat; вместо этого запишите или загрузите его XML‑данные через метод ISvgImage::get_SvgData. В зависимости от режима экспорта и визуального групперования SVG в исходной презентации может быть растерен или объединён с другим содержимым; полученный не‑SVG ресурс затем передаётся в ImageSaving. Подпишитесь на оба события, когда каждый экспортируемый визуальный ресурс требует пользовательской обработки.
Возврат обработчика определяет, кто будет обрабатывать изображение:
- Верните
true, если обработчик сохранил, загрузил, преобразовал или иначе обработал изображение и присвоилlinkдействительное значение. Aspose.Slides запишет это значение в документ Markdown и не будет выполнять своё локальное сохранение. - Верните
false, чтобы позволить Aspose.Slides сохранить изображение локально и сформировать ссылку согласно MarkdownSaveOptions::set_BasePath и MarkdownSaveOptions::set_ImagesSaveFolderName.
Важно
Обработчик, возвращающийtrue, берёт на себя ответственность за изображение. Если он возвращает true, не задав действительную, непустую ссылку, экспорт завершается с InvalidOperationException.
Сохранение изображений в каталог CDN‑origin и использование внешних URL
В следующем примере cdn-origin/presentations/quarterly-report рассматривается как смонтированный или синхронизированный каталог CDN‑origin. Каждый обработчик извлекает сгенерированное имя файла, сохраняет изображение в этот пользовательский каталог и заменяет локальную ссылку публичным URL CDN. Сам пример не выполняет сетевую загрузку: URL становится действительным только после монтирования каталога как CDN‑origin или публикации файлов в CDN. Для объектного хранилища замените запись в файловой системе на операцию загрузки SDK хранилища и присвойте link только после успешной загрузки.
#include <DOM/ISvgImage.h>
#include <DOM/Presentation.h>
#include <Export/Markdown/SaveOptions/MarkdownExportType.h>
#include <Export/Markdown/SaveOptions/MarkdownSaveOptions.h>
#include <Export/SaveFormat.h>
#include <IImage.h>
#include <ImageFormat.h>
#include <functional>
#include <system/io/directory.h>
#include <system/io/file.h>
#include <system/io/path.h>
#include <system/uri.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System::IO;
const System::String outputDirectory = u"output";
const System::String publicBaseUrl = u"https://cdn.example.com/presentations/quarterly-report";
const System::String storageDirectory = Path::Combine(u"cdn-origin", u"presentations", u"quarterly-report");
Directory::CreateDirectory_(outputDirectory);
Directory::CreateDirectory_(storageDirectory);
auto presentation = System::MakeObject<Presentation>(u"presentation.pptx");
auto options = System::MakeObject<MarkdownSaveOptions>();
options->set_ExportType(MarkdownExportType::Visual);
options->set_BasePath(outputDirectory);
options->set_ImagesSaveFolderName(u"fallback-images");
options->ImageSaving.connect(std::function<bool(System::SharedPtr<IImage>, ImageFormat, System::String&)>([storageDirectory, publicBaseUrl](System::SharedPtr<IImage> image, ImageFormat format, System::String& link) -> bool
{
if (image->get_Width() < 128 || image->get_Height() < 128)
{
return false;
}
auto urlCompatibleLink = link.Replace(u"\\", u"/");
auto fileName = urlCompatibleLink.Substring(urlCompatibleLink.LastIndexOf(u'/') + 1);
auto storagePath = Path::Combine(storageDirectory, fileName);
image->Save(storagePath, format);
link = publicBaseUrl + u"/" + System::Uri::EscapeDataString(fileName);
return true;
}));
options->SvgImageSaving.connect(std::function<bool(System::SharedPtr<ISvgImage>, System::String&)>([storageDirectory, publicBaseUrl](System::SharedPtr<ISvgImage> svgImage, System::String& link) -> bool
{
auto urlCompatibleLink = link.Replace(u"\\", u"/");
auto fileName = urlCompatibleLink.Substring(urlCompatibleLink.LastIndexOf(u'/') + 1);
auto storagePath = Path::Combine(storageDirectory, fileName);
File::WriteAllBytes(storagePath, svgImage->get_SvgData());
link = publicBaseUrl + u"/" + System::Uri::EscapeDataString(fileName);
return true;
}));
auto markdownPath = Path::Combine(outputDirectory, u"presentation.md");
presentation->Save(markdownPath, SaveFormat::Md, options);
Обработчик bitmap умышленно возвращает false для изображений размером менее 128 × 128 px, поэтому Aspose.Slides сохраняет такие изображения в output/fallback-images с поведением по умолчанию. Большие bitmap и метафайлы, а также SVG‑ресурсы обрабатываются пользовательским кодом. Например, локальная ссылка fallback-images/image1.png превращается в https://cdn.example.com/presentations/quarterly-report/image1.png. Обработчики используют системные пути только при записи файлов; ссылки в Markdown используют прямые слеши и URL‑экранированные имена файлов. Применяйте то же правило при построении относительных ссылок: используйте /, а не разделитель каталогов платформы.
FAQ
Можно ли одним обработчиком обрабатывать как растровые, так и SVG‑изображения?
Нет. Используйте MarkdownSaveOptions::ImageSaving для генерируемых bitmap и метафайлов и MarkdownSaveOptions::SvgImageSaving для ресурсов в формате SVG. Первый предоставляет объект IImage и ImageFormat; второй – объект ISvgImage с данными SVG, которые можно получить через ISvgImage::get_SvgData. SVG, растеризованный во время экспорта, обрабатывается ImageSaving.
Что происходит, когда обработчик сохранения изображения возвращает false?
Aspose.Slides использует своё поведение сохранения по умолчанию. Расположение изображения и сгенерированная ссылка управляются параметрами MarkdownSaveOptions::set_BasePath и MarkdownSaveOptions::set_ImagesSaveFolderName.
Может ли обработчик предоставить URL без локального сохранения изображения?
Да. Обработчик может загрузить изображение в объектное хранилище или передать его в другой сервис, присвоить полученный URL переменной link и вернуть true. При этом обработчик полностью отвечает за обработку; возврат true отключает сохранение по умолчанию.
Почему при экспорте Markdown из обработчика возникает InvalidOperationException?
Исключение возникает, когда обработчик возвращает true, но не предоставляет действительной ссылки. Присвойте относительный путь или внешний URL, который должен быть записан в Markdown, перед возвратом true.
Какой разделитель пути следует использовать в ссылках на изображения?
В ссылках Markdown и URL используйте прямые слеши. Для путей файловой системы используйте Path::Combine, а затем отдельно формируйте или нормализуйте ссылку Markdown.
Сохраняются ли гиперссылки при экспорте в Markdown?
Да. Текстовые hyperlinks сохраняются как обычные ссылки Markdown. Переходы слайдов transitions и animations не конвертируются.
Можно ли конвертировать презентации в Markdown параллельно?
Можно обрабатывать разные файлы презентаций одновременно, но не делите один экземпляр Presentation между потоками. Следуйте multithreading guidelines и используйте отдельный экземпляр для каждого файла.