Как извлекать текст из файлов PPT, PPTX и ODP с помощью Open XML SDK в .NET
Open XML SDK
Open XML SDK предоставляет высоко структурированный и эффективный метод извлечения текста из файлов презентаций — особенно PPTX, которые соответствуют стандарту Open XML. Предоставляя прямой доступ к базовому XML, этот SDK обеспечивает более быструю и гибкую работу с содержимым слайдов по сравнению с традиционными методами.
Direct XML Access
- Analyze Text Directly: Open XML SDK позволяет извлекать текст из XML‑частей без рендеринга слайдов.
- Structured Elements: Поскольку текст хранится в четко определенных XML‑тегах, его проще получать и обрабатывать.
Пример: Извлечение текста непосредственно из XML‑содержимого слайда
using (PresentationDocument presentation = PresentationDocument.Open("presentation.pptx", false))
{
var slidePart = presentation.PresentationPart.SlideParts.FirstOrDefault();
if (slidePart != null)
{
var textElements = slidePart.Slide.Descendants<DocumentFormat.OpenXml.Drawing.Text>();
foreach (var text in textElements)
{
Console.WriteLine(text.Text);
}
}
}
Преимущества производительности
- Faster Extraction: Обходит накладные расходы на открытие PowerPoint или других высокоуровневых API.
- Lower Memory Usage: Доступ только к релевантным XML‑частям, уменьшая потребление ресурсов.
- No Microsoft PowerPoint Needed: Освобождает от необходимости установки Microsoft PowerPoint.
Пример: Эффективное извлечение текста без загрузки полной презентации
using (PresentationDocument presentation = PresentationDocument.Open("presentation.pptx", false))
{
foreach (var slidePart in presentation.PresentationPart.SlideParts)
{
var texts = slidePart.Slide.Descendants<DocumentFormat.OpenXml.Drawing.Text>().Select(t => t.Text);
Console.WriteLine(string.Join(" ", texts));
}
}
Идентификация текстовых элементов
Особенности извлечения текста из презентаций
При извлечении текста из презентаций учитывайте следующие моменты:
- Text May Reside in Different Sections: Обычные слайды, слайды‑шаблоны, макеты или заметки выступающего.
- Default Placeholders: Слайды‑шаблоны и макеты могут содержать заполнительные элементы (например, «Щелкните, чтобы отредактировать стиль заголовка шаблона»), которые не являются реальным содержимым презентации.
- Filtering Empty or Hidden Text: Некоторые элементы могут быть пустыми или не предназначенными для отображения.
Теги, содержащие текст
В файле PPTX текст обычно хранится в:
- элементами
<a:t>внутри<a:p>(абзацы) - элементами
<a:r>(текстовые сегменты внутри абзацев)
Пример: Извлечение всех текстовых элементов со слайда
var textElements = slidePart.Slide.Descendants<DocumentFormat.OpenXml.Drawing.Text>();
foreach (var text in textElements)
{
Console.WriteLine(text.Text);
}
ODP и PPT
Невозможность прямого извлечения текста
- В отличие от PPTX, PPT (бинарный формат) и ODP (презентация OpenDocument) не поддерживаются Open XML SDK.
- PPT хранит содержимое в закрытом бинарном формате, что усложняет извлечение текста.
- ODP использует OpenDocument XML, который структурно отличается от PPTX.
Обходной путь: Конвертация в PPTX
Для извлечения текста из PPT или ODP рекомендуется следующий подход:
- Convert PPT → PPTX с помощью PowerPoint или стороннего инструмента.
- Convert ODP → PPTX через LibreOffice или PowerPoint.
- Extract text из нового PPTX с помощью Open XML SDK.
Пример: Конвертация ODP в PPTX через командную строку LibreOffice
soffice --headless --convert-to pptx presentation.odp
Поддерживаемые платформы и фреймворки
- Windows: .NET Framework 4.6.1 и выше, .NET Core 2.1+, .NET 5/6/7.
- Linux/macOS: .NET Core 2.1+, .NET 5/6/7.
- Cloud Environments: Microsoft Azure Functions, AWS Lambda (.NET Core), Docker‑контейнеры.
- Compatibility with Office Applications: Не требуется установка Microsoft Office.
- Supported Programming Languages: Open XML SDK можно использовать с C#, VB.NET, F# и другими поддерживаемыми .NET языками.
Заключение
Использование Open XML SDK для извлечения текста из PPTX обеспечивает как эффективность, так и ясность, тогда как PPT и ODP требуют начального шага конвертации для корректной обработки. Применение этого подхода гарантирует высокую производительность, гибкость и широкую совместимость с современными .NET‑приложениями.