从演示文稿中提取文本

从幻灯片中提取文本

Aspose.Slides for C++ 提供了 Aspose.Slides.Util 命名空间,其中包含 SlideUtil 类。该类公开了一些重载的静态方法,用于从演示文稿或幻灯片中提取全部文本。要从 PPTX 演示文稿中的幻灯片中提取文本,请使用由 SlideUtil 类公开的 GetAllTextBoxes 重载静态方法。该方法接受 Slide 对象作为参数。 执行时,Slide 方法扫描作为参数传递的幻灯片中的所有文本,并返回一个 TextFrame 对象数组。这意味着与文本相关的任何文本格式也可用。以下代码提取演示文稿中第一张幻灯片上的所有文本:

// 文档目录的路径。
System::String dataDir = GetDataPath();

// 实例化表示 PPTX 文件的 Presentation 类
auto pptxPresentation = System::MakeObject<Presentation>(dataDir + u"demo.pptx");

// 从 PPTX 的所有幻灯片中获取 ITextFrame 对象数组
auto textFramesPPTX = Util::SlideUtil::GetAllTextFrames(pptxPresentation, true);

// 遍历 TextFrames 数组
for (int32_t i = 0; i < textFramesPPTX->get_Length(); i++)
{
	// 遍历当前 ITextFrame 中的段落
	for (const auto& para : textFramesPPTX[i]->get_Paragraphs())
	{
		// 遍历当前 IParagraph 中的部分
		for (const auto& port : para->get_Portions())
		{
			// 显示当前部分中的文本
			Console::WriteLine(port->get_Text());

			// 显示文本的字体高度
			Console::WriteLine(port->get_PortionFormat()->get_FontHeight());

			// 显示文本的字体名称
			if (port->get_PortionFormat()->get_LatinFont() != nullptr)
			{
				Console::WriteLine(port->get_PortionFormat()->get_LatinFont()->get_FontName());
			}
		}
	}
}

从演示文稿中提取文本

要扫描整个演示文稿中的文本,请使用由 SlideUtil 类公开的 GetAllTextFrames 静态方法。它接受两个参数:

  1. 首先,是一个表示从中提取文本的 PPTX 演示文稿的 Presentation 对象。
  2. 其次,是一个布尔值,确定在从演示文稿扫描文本时是否包含母版幻灯片。 该方法返回一个包含文本格式信息的 TextFrame 对象数组。以下代码扫描演示文稿中的文本和格式信息,包括母版幻灯片。
// 文档目录的路径。
System::String dataDir = GetDataPath();

// 实例化表示 PPTX 文件的 Presentation 类
auto pptxPresentation = System::MakeObject<Presentation>(dataDir + u"demo.pptx");

// 从 PPTX 的所有幻灯片中获取 ITextFrame 对象数组
auto textFramesPPTX = Util::SlideUtil::GetAllTextFrames(pptxPresentation, true);

// 遍历 TextFrames 数组
for (int32_t i = 0; i < textFramesPPTX->get_Length(); i++)
{
	// 遍历当前 ITextFrame 中的段落
	for (const auto& para : textFramesPPTX[i]->get_Paragraphs())
	{
		// 遍历当前 IParagraph 中的部分
		for (const auto& port : para->get_Portions())
		{
			// 显示当前部分中的文本
			Console::WriteLine(port->get_Text());

			// 显示文本的字体高度
			Console::WriteLine(port->get_PortionFormat()->get_FontHeight());

			// 显示文本的字体名称
			if (port->get_PortionFormat()->get_LatinFont() != nullptr)
			{
				Console::WriteLine(port->get_PortionFormat()->get_LatinFont()->get_FontName());
			}
		}
	}
}

分类和快速文本提取

Presentation 类中新增了静态方法 GetPresentationText。该方法有两个重载:

System::SharedPtr<IPresentationText> GetPresentationText(System::String file, TextExtractionArrangingMode mode) override
 
System::SharedPtr<IPresentationText> GetPresentationText(System::SharedPtr<System::IO::Stream> stream, TextExtractionArrangingMode mode) override

TextExtractionArrangingMode 枚举参数指示组织文本结果输出的模式,可以设置为以下值:
未排序 - 原始文本,不考虑在幻灯片上的位置
已排序 - 文本按照幻灯片上的顺序定位

当速度至关重要时,可以使用未排序模式,它比已排序模式更快。

PresentationText 表示从演示文稿中提取的原始文本。它包含 Aspose.Slides.Util 命名空间中的 get_SlidesText() 方法,该方法返回 ISlideText 对象数组。每个对象代表相应幻灯片上的文本。ISlideText 对象具有以下方法:

get_Text() - 幻灯片形状上的文本。
get_MasterText() - 此幻灯片的母版页面形状上的文本。
get_LayoutText() - 此幻灯片的布局页面形状上的文本。
get_NotesText() - 此幻灯片的备注页面形状上的文本。

还有一个实现 ISlideText 接口的 SlideText 类。

新的 API 可以如下使用:

auto text = System::MakeObject<PresentationFactory>()->GetPresentationText(u"presentation.ppt", TextExtractionArrangingMode::Unarranged);
Console::WriteLine(text->get_SlidesText()[0]->get_Text());
Console::WriteLine(text->get_SlidesText()[0]->get_LayoutText());
Console::WriteLine(text->get_SlidesText()[0]->get_MasterText());
Console::WriteLine(text->get_SlidesText()[0]->get_NotesText());