在二进制 PowerPoint MS-PPT 文件中查找图形

**摘要:**了解如何在二进制 MicrosoftPowerPoint (.ppt) 文件中查找位图、绘图、艺术字和其他静态图形。

上次修改时间: 2011年7月21日

适用范围: Office 2007 | Office 2010 | PowerPoint | PowerPoint 2010 | VBA

本文内容
简介
结构和过程
结论
其他资源

**发布时间:**2011 年 5 月

**供稿人:**Microsoft Corporation

目录

  • 简介

  • 结构和过程

    • 从 .PPT 文件提取位图图像

    • 从 .PPT 文件提取绘图

    • 在幻灯片中查找位图

  • 结论

  • 其他资源

简介

MS-PPT 二进制文件格式 (.ppt) 由 Microsoft OfficePowerPoint 2003、Microsoft PowerPoint 2002、Microsoft PowerPoint 2000 和 Microsoft PowerPoint 97 使用。使用本文中的过程可以从 .ppt 文件提取图像或绘图,以及在幻灯片中查找位图。

通过直接从二进制文件提取图像,您可以快速扫描众多文件以查找特定图像,而无需打开 PowerPoint 应用程序。然后,您可以完全移除该图像,或者将其替换为相同大小的其他图像,此过程几乎不需要对文件进行更改。例如,可以从文件集中删除受版权保护的图像的所有实例,或者更新公司徽标的所有实例。

替换绘图要比替换图像困难;但是,若要了解图像在幻灯片中的显示位置,您必须查找该图像锚定到的形状对象。如果绘图或形状在内存中保持相同大小,则可以毫不费力地对绘图或形状进行属性更改,例如编辑艺术字部分的文本。此外,您还必须在当前编辑中更新记录标头以反映新的内存分配。

备注

在 Microsoft PowerPoint 中执行大多数编程任务的推荐方法是使用 PowerPoint 主互操作程序集。这些程序集是一组提供可用于 Microsoft PowerPoint 的完整对象模型的 .NET 类。本系列文章只涉及高级方案,如未安装 Microsoft PowerPoint 的情形。

结构和过程

.ppt 文件中基于矢量的所有图形元素都以绘图的形式存储在 PowerPoint 文档流的 DrawingContainer 对象中。这些元素包括剪贴画、艺术字以及由可缩放形状和线条组成的任何绘图或图表。位图以二进制大型图像或图片 (BLIP) 的形式集中存储在图片流中,并由它所在的绘图引用。绘图和 BLIP 都采用 MS-ODRAW 文件格式,此格式是 Microsoft Excel、Microsoft PowerPoint 和 Microsoft Word 的共享图形格式。

备注

除非另有说明,否则 PowerPoint 文档中的所有记录都以 8 字节记录标头开头。第三和第四字节显示记录类型,最后 4 个字节显示记录的长度。您可以使用此信息标识相关记录并跳过其余记录。

从 .PPT 文件提取位图图像

  1. 打开图片流。

    此流包含所有嵌入的位图图像,用户将这些图像作为一系列 OfficeArtBStoreDelay 记录复制到文件中。OfficeArtBStoreDelay 记录是纯 OfficeArtBStoreContainerFileBlock 记录数组,没有记录标头或其他字段。

  2. 对该数组中的每个 OfficeArtBStoreContainerFileBlock 记录执行以下操作:

    1. 读取记录标头的第 2 和第 3 字节,以获取记录类型。

    2. 如果记录类型为 OfficeArtBlip(0xF018-0xF117),则继续此过程中的下一步骤。

      如果记录类型为 OfficeArtFBSE(0xF007),则执行以下操作:

      1. 跳过前 20 个字节。

      2. 读取接下来的 4 个字节,这些字节将位图大小显示为无符号整数。

      3. 跳过接下来的 12 个字节。

      4. 读取 .name 字段,该字段是一个长度可变、以 空 结尾且显示位图名称的 Unicode 字符串。

        接下来的字段是 .embeddedBlip,它是一个 OfficeArtBlip 记录。

    3. 读取 OfficeArtBlip 记录的记录标头。第 2 和第 3 字节指定图像的文件类型(如果已单独保存该图像)。记录标头的最后 4 个字节显示记录其余部分的长度。有关哪些类型值对应哪些文件类型的详细信息,请参阅 [MS-ODRAW] 规范section 2.2.23

    4. OfficeArtBlip 记录的其余部分是实际位图图像数据。将图像保存为哪种文件类型由记录标头指定。

从 .PPT 文件提取绘图

  1. 了解 PowerPoint MS-PPT 二进制文件格式中标题为"从 PowerPoint 文件检索幻灯片"的过程的第一部分所述,创建一个"持久对象目录"。

  2. 在"持久对象目录"中,在指定的每个偏移处检查记录标头,并读取每个记录标头。

    1. 如果 rh.RecType 等于 RT_Document(0x03E8),则为文档容器。检查其每个子容器的记录标头,直至找到 rh.recType 等于 RT_DrawingGroup(0x040B) 的记录。

      这是文件的绘图组容器。请注意此容器的位置。

    2. 其中,rh.recType 等于 RT_MainMaster(0x03F8) 或 RT_Slide(0x03EE):

      1. 检查每个子记录,以查找 rh.recType 等于 RT_Drawing(0x040C) 的记录标头。

      2. 了解采用 Office 二进制文件格式的图形中标题为"gg985447(v=office.14).md"的过程中所述,分析该记录。

在幻灯片中查找位图

  1. 如"从 .PPT 文件提取位图图像"过程中所述,提取文件的位图,然后记录每个 OfficeArtBStoreContainerFileBlock 记录在 OfficeArtBStoreDelay.rgfb 数组中的位置。

  2. 如"从 .PPT 文件提取绘图"过程中所述,分析文件的绘图。如果您知道包含位图的幻灯片,则可以只分析该幻灯片的绘图。

  3. 检查位图的每个形状。

    1. 如果要查找表示当前形状的 OfficeArtSpContainer 记录的每个子记录,可扫描记录的记录标头,其中 rh.RecType 等于 OfficeArtFOPT(F00B),它是"形状主选项"属性。

    2. 读取由属性表组成的 OfficeArtFOPT 记录的其余部分。

      属性表的类型为 OfficeArtRGFOPTE,并且没有记录标头。它由一个数组构成,该数组包含 6 字节 OfficeArtFOPTE 属性表条目,后跟一个大小可变的复杂数据字段。

    3. 读取每个属性表条目,直到在位 14 处找到 opid.fBid 属性等于 0x1 的条目,然后将后面的 4 个字节读取为无符号整数。该整数指定包含相应位图的 OfficeArtBStoreContainerFileBlock 记录在 OfficeArtBStoreDelay.rgfb 数组中的位置。

      如果给定形状的任何属性表条目的 opid.fBid 均不等于 0x1,表明没有与该形状关联的位图。

结论

本文讨论了从二进制格式的 PowerPoint (.ppt) 文件提取图片和形状的基本过程。以这些过程为基础,您将能够扫描大型文件集中的绘图和位图,标记这些绘图和位图,甚至可以将其替换为更新的版本。

其他资源

有关详细信息,请参阅以下资源: