olefile是Python中用于解析和处理OLE复合文档的轻量级库,它能读取微软 Office旧格式文件(如 .doc、.xls)以及 MSI 安装包等二进制文档,提取其中的流数据、存储结构和元信息,同时支持查看文档内部结构、提取嵌入对象和元数据,适用于文件分析、文档内容提取等场景,是处理OLE格式文档的基础工具。
运行下面命令安装olefile库。
bash
pip install olefile

olefile库的主要函数如下表所示:
| 序号 | 名称 | 说明 |
|---|---|---|
| 1 | isOleFile | 判断文件是否为OLE格式 |
| 2 | OleFileIO | 创建OLE文件对象 |
| 3 | open / close | 打开/关闭 OLE 文件 |
| 4 | openstream | 打开指定流,返回文件对象 ,如openstream('\x01Ole10Native') |
| 5 | listdir | 列出OLE文件中所有的流和存储 |
| 6 | exists | 判断指定的流或存储在OLE文件中是否存在 |
| 7 | get_size | 获取指定流的字节数 |
| 8 | get_type | 获取指定条目的类型,返回流、存储或根目录类型 |
| 9 | get_rootentry_name | 获取根目录名称 |
| 10 | get_metadata | 获取文档元数据,返回OleMetadata 对象 |
| 11 | getctime/getmtime | 获取存储或流的创建/修改时间 |
| 12 | get_userdefined_properties | 获取指定流中的用户自定义属性 |
| 13 | getclsid | 获取指定流或存储的clsid |
| 14 | getproperties | 获取指定流的属性 |
以前面文章中提取的bin文件为例,下面的示例代码获取ole文件的所有流和存储、元数据信息:
python
import olefile
filename='xml.bin'
# 检查文件是否为 OLE 格式
is_ole = olefile.isOleFile(filename)
print(f"Is OLE file: {is_ole}")
with olefile.OleFileIO(filename) as ole:
# 获取根目录信息
root = ole.root
print(f"Root: {root}")
# 列出所有流和存储
print("\nAll entries:")
for entry in ole.listdir():
print(f" {entry}")
# 获取元数据
metadata = ole.get_metadata()
print(f"Author: {metadata.author}")
print(f"Title: {metadata.title}")
print(f"Created: {metadata.create_time}")
print(f"Modified: {metadata.last_saved_time}")
# 获取文件属性
print("\nProperties:")
for prop in metadata.SUMMARY_ATTRIBS:
value = getattr(metadata, prop, None)
if value:
print(f" {prop}: {value}")

使用olefile库也能读取OLE文件中指定流的数据,但是遇到和C#调用OpenMcdf模块解析OLE文件类似的问题,想从\x01Ole10Native流中提取原始文件名称及数据,但不知道数据结构,还得继续查找资料。
参考文献:
1\]https://www.modb.pro/db/585135 \[2\]https://github.com/decalage2/olefile \[3\]https://olefile.readthedocs.io/en/latest/