这篇分析SummaryInformation流,该流为可选流,保存文档的摘要信息。该流的位置同样通过目录定位,其名字为0005SummaryInformation(0005为16进制数),定位方法见复合文档格式的分析(http://blog.csdn.net/shadow20080578/article/details/50245309)。
该流包含一个或多个属性组,每个属性组包含一个或多个属性。
1.开始为流的全局信息:
00H-01H为字节顺序,要求为0xFFFE。
02H-03H属性集版本。
04H为一字节的操作系统主版本号。
05H为一字节的操作系统次版本号。
06H-07H为操作系统类型,固定为0x0002.
08H-17H为10字节的CLSID,未设置时为默认的全0x00。
018H-01BH的4字节UInt32,是存储属性组的个数。
01CH开始的每20字节,是每个属性组的标志和偏移:
前16字节为FMTID,FMTID_SummaryInformation 是0xE0 0x85 0x9F 0xF2 0xF9 0x4F 0x68 0x10 0xAB 0x91 0x08 0x00 0x2B 0x27 0xB3 0xD9。
后4字节UInt32,则是该属性组相对于流起始的偏移。
2.利用偏移可以在流中定位到属性组,对于每个属性组,其结构如下:
000H-003H的4字节UInt32,是属性组大小。
004H-007H的4字节UInt32,是属性组中属性的个数。
008H开始的每8字节,是属性的信息:
对于前4字节UInt32,是属性编号,表示属性的种类。
Unknown = 0x00
CodePage = 0x01
Title = 0x02;文档标题
Subject = 0x03
Author = 0x04;文档作者
Keyword = 0x05;文档关键字
Commenct = 0x06;文档注释
Template = 0x07
LastAuthor = 0x08
Reversion = 0x09
EditTime = 0x0A
LastPrintTime = 0x0B
CreateDateTime = 0x0C
LastSaveDateTime = 0x0D
PageCount = 0x0E
WordCount = 0x0F
CharCount = 0x10
Thunbnail = 0x11
ApplicationName = 0x12
Security = 0x13
对于后4字节UInt32,是属性内容相对于属性组的偏移。
3.利用属性信息可以定位到属性组中的每个属性,对于每个属性,其结构如下:
000H-003H的4字节UInt32,是属性内容的类型:
类型为0x02时为UInt16
类型为0x03时为UInt32
类型为0x0B时为Boolean
类型为0x1E时为String
剩余的字节为属性的内容, 除了类型是String时为不定长,其余三种均为4位字节(多余字节置0)。类型是String时前4字节是字符串的长度(包括“\0”),所以没法使用BinaryReader的ReadString读取。之后长度为字符串内容,字符串是使用单字节编码进行存储的,可以使用Encoding中的GetString获取字符串内容。