在二进制 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 文件提取位图图像
打开图片流。
此流包含所有嵌入的位图图像,用户将这些图像作为一系列 OfficeArtBStoreDelay 记录复制到文件中。OfficeArtBStoreDelay 记录是纯 OfficeArtBStoreContainerFileBlock 记录数组,没有记录标头或其他字段。
对该数组中的每个 OfficeArtBStoreContainerFileBlock 记录执行以下操作:
读取记录标头的第 2 和第 3 字节,以获取记录类型。
如果记录类型为 OfficeArtBlip(0xF018-0xF117),则继续此过程中的下一步骤。
如果记录类型为 OfficeArtFBSE(0xF007),则执行以下操作:
跳过前 20 个字节。
读取接下来的 4 个字节,这些字节将位图大小显示为无符号整数。
跳过接下来的 12 个字节。
读取 .name 字段,该字段是一个长度可变、以 空 结尾且显示位图名称的 Unicode 字符串。
接下来的字段是 .embeddedBlip,它是一个 OfficeArtBlip 记录。
读取 OfficeArtBlip 记录的记录标头。第 2 和第 3 字节指定图像的文件类型(如果已单独保存该图像)。记录标头的最后 4 个字节显示记录其余部分的长度。有关哪些类型值对应哪些文件类型的详细信息,请参阅 [MS-ODRAW] 规范section 2.2.23。
OfficeArtBlip 记录的其余部分是实际位图图像数据。将图像保存为哪种文件类型由记录标头指定。
从 .PPT 文件提取绘图
如了解 PowerPoint MS-PPT 二进制文件格式中标题为"从 PowerPoint 文件检索幻灯片"的过程的第一部分所述,创建一个"持久对象目录"。
在"持久对象目录"中,在指定的每个偏移处检查记录标头,并读取每个记录标头。
如果 rh.RecType 等于 RT_Document(0x03E8),则为文档容器。检查其每个子容器的记录标头,直至找到 rh.recType 等于 RT_DrawingGroup(0x040B) 的记录。
这是文件的绘图组容器。请注意此容器的位置。
其中,rh.recType 等于 RT_MainMaster(0x03F8) 或 RT_Slide(0x03EE):
检查每个子记录,以查找 rh.recType 等于 RT_Drawing(0x040C) 的记录标头。
如了解采用 Office 二进制文件格式的图形中标题为"gg985447(v=office.14).md"的过程中所述,分析该记录。
在幻灯片中查找位图
如"从 .PPT 文件提取位图图像"过程中所述,提取文件的位图,然后记录每个 OfficeArtBStoreContainerFileBlock 记录在 OfficeArtBStoreDelay.rgfb 数组中的位置。
如"从 .PPT 文件提取绘图"过程中所述,分析文件的绘图。如果您知道包含位图的幻灯片,则可以只分析该幻灯片的绘图。
检查位图的每个形状。
如果要查找表示当前形状的 OfficeArtSpContainer 记录的每个子记录,可扫描记录的记录标头,其中 rh.RecType 等于 OfficeArtFOPT(F00B),它是"形状主选项"属性。
读取由属性表组成的 OfficeArtFOPT 记录的其余部分。
属性表的类型为 OfficeArtRGFOPTE,并且没有记录标头。它由一个数组构成,该数组包含 6 字节 OfficeArtFOPTE 属性表条目,后跟一个大小可变的复杂数据字段。
读取每个属性表条目,直到在位 14 处找到 opid.fBid 属性等于 0x1 的条目,然后将后面的 4 个字节读取为无符号整数。该整数指定包含相应位图的 OfficeArtBStoreContainerFileBlock 记录在 OfficeArtBStoreDelay.rgfb 数组中的位置。
如果给定形状的任何属性表条目的 opid.fBid 均不等于 0x1,表明没有与该形状关联的位图。
结论
本文讨论了从二进制格式的 PowerPoint (.ppt) 文件提取图片和形状的基本过程。以这些过程为基础,您将能够扫描大型文件集中的绘图和位图,标记这些绘图和位图,甚至可以将其替换为更新的版本。
其他资源
有关详细信息,请参阅以下资源: