用Python提取docx嵌入式文件:PDF/ZIP无法打开问题求助
解决线索
剥离OLE包装头:PDF和ZIP是以OLE对象形式嵌入的,导出的
.bin文件开头包含OLE容器的元数据,并非纯文件内容。可通过文件特征码定位真实内容起始位置:- PDF的特征码是
%PDF-,在.bin文件中找到该字符串的起始索引,截取从该位置到文件末尾的内容保存为.pdf; - ZIP的特征码是
PK\x03\x04,同样截取对应位置后的内容保存为.zip。
示例代码(以PDF为例):
with open("word_embeddings_oleObject1.bin", "rb") as f: data = f.read() pdf_start = data.find(b"%PDF-") if pdf_start != -1: with open("extracted.pdf", "wb") as f_out: f_out.write(data[pdf_start:])- PDF的特征码是
使用OLE解析库:借助
olefile库直接解析OLE容器文件,提取内部真实内容。先安装库pip install olefile,示例代码:import olefile ole = olefile.OleFileIO("word_embeddings_oleObject1.bin") # 查看所有可用流 print(ole.listdir()) # 提取对应流的内容,通常真实内容在"Contents"或类似流中 if ole.exists("Contents"): content = ole.openstream("Contents").read() # 根据MIME类型判断保存后缀,比如PDF则保存为.pdf with open("extracted.pdf", "wb") as f: f.write(content)区分嵌入类型:docx中嵌入式文件有两种存储方式:
- 嵌入式docx用的是Package嵌入(对应关系类型
http://schemas.openxmlformats.org/officeDocument/2006/relationships/package),这类文件可直接提取使用; - PDF/ZIP用的是OLE嵌入(对应关系类型
http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject),必须解析OLE容器才能获取真实内容。可查看word/_rels/document.xml.rels文件里的关系项,确认每个嵌入对象的类型后针对性处理。
- 嵌入式docx用的是Package嵌入(对应关系类型
内容的提问来源于stack exchange,提问作者karpan
相关产品推荐
相关产品推荐

