Word文件批量提取「对象」内的附件

有个word文件内有大量的附件多种格式PNG、PDF、word、等20多个,有什么办法批量导出吗?
主要是word内的指定文件PDF、AI等格式的文档本机电脑无法打开。导致无法导出,有什么办法吗。

用 7-Zip 或 WinRAR 等软件将 docx 文档作为压缩文档打开,然后解压,可以从解压后得到的文件里面找一找。

至于图片,可以先参考一下这篇文章:

https://www.appinn.com/word-export-images/

1 个赞


测试了一个只能分解为20+个bin文档,完全无法识别之前的名字和格式。里面有word和表格文件,只有xLS格式的可以被识别。

这个好像应该叫 “对象”

是的 是叫做对象
但是里面插入了大量的文件,有PDF、Ai、word、xlsx等格式
现在就是无法直接提取 ,我看看标题能不能改

解压出来之后,看看能不能打开其中的一两个,如果可以,说明只是扩展名损坏,只要根据文件头修正扩展名即可

这些 bin 文档似乎也是可以解压缩的,您可以试试用 7-Zip 打开看一下。

直接解压得到的,不是原文件,应该是数据存储格式也发生变化了。

我测试了一下,

  • 如果插入的对象是 .zip 压缩包,解压这个 .bin 文档,会得到 4 个文件,再解压其中的 [1]Ole10Native 就可以看到原文件中的内容。
  • 如果插入的对象是 .pdf 文档,解压这个 .bin 文档,会得到 5 个文件,将其中的 CONTENTS 重命名,加上扩展名 .pdf 即可得到 PDF 文档。

至于其他格式,时间关系我没有测试。不过可以提供给您一个思路:解压 .bin 文档得到的文件中,体积最符合你的预期 的最有可能包含您想要的内容。

试了试智谱, 给出的VBS脚本, 说不定可以用

Set objWord = CreateObject("Word.Application")
objWord.Visible = False

' 打开Word文档
Set objDoc = objWord.Documents.Open("C:\路径\你的文档.docx")

' 设置附件保存的目录
strSavePath = "C:\路径\附件\"

' 遍历文档中的所有OLE对象
For Each objShape In objDoc.InlineShapes
    If objShape.OLEFormat.ProgID = "Package" Then
        ' 附件对象的ProgID通常是"Package",可以根据实际情况调整
        strFileName = objShape.AlternativeText
        If strFileName <> "" Then
            ' 保存附件
            objShape.OLEFormat.DoVerb 2 ' 2 表示执行"打开"操作
            Set objLink = objShape.OLEFormat.Link
            objLink.SaveAsFile strSavePath & strFileName
        End If
    End If
Next

' 关闭Word文档
objDoc.Close False

' 退出Word应用程序
objWord.Quit

' 清理对象
Set objShape = Nothing
Set objDoc = Nothing
Set objWord = Nothing

你这样的文档,有没有例子来看下啊

好像不管用,我把上述代码保存为 .vbs 文档,并修改了第 5 行的文档路径和第 8 行的保存目录,然后双击运行脚本,无事发生。

您的思路有比较大的错误哦…
其实我们有一个最简单的办法:
分别修改扩展名为所有可能的项目,如果改成哪个能打开,那么就是对应的文件格式

又因为程序是通过文件头来确定文件格式是否合法,所以我们只要找个文件头判定程序来判定bin文件文件头对应的扩展名,再据其重命名即可

另外,这也是对于数据完整但文件名未知的场景下(如数据恢复等),判断文件扩展名的最常用手段之一

有致命错误:这里混入了VBA语言的函数,它不可能被VBS脚本解释器正常运行
不知道它作为VBA脚本运行是否合法…
注,关于VBA脚本

是个办法,就是可能比较麻烦。如果能用 file 之类的工具鉴定一下是不是会更好?

这个方法是根据您引用的方法推理出来的,所以其实我给出的结论是我上面引用的这一段…原谅我的表述混乱

原来如此,是我看漏了,抱歉。

不过根据我的观察,那些 .bin 文件其实都是压缩包,从 .bin 文件里解压出来的东西才是我们可能需要的文件。

.bin 文件中解压出来的内容都是一些没有扩展名的文件。

嗯, 试了一下在Word里面, 修改一下后可以运行, 但是无法获取到OLE对象(文件)的名字, 所以暂时也是不可用的, 但是如果你用ZIP解开获得的BIN文件再解压后的文件中的OLE10Native文件其实可以直接获取到文件名和文件本体, 只是需要二进制搜索三次文件名, 之后很容易发现文件长度以及文件开始, 之后处理分割一下后再保存应该就可以了,

提取图片就不用说了, 有个特别方便的工具, 叫做

Office.Files.Images

是 Q-dir 作者写的另一款软件。

如果是文档还包括 pdf,音频等 ole 对象文件的话, docx 会存放在

测试.docx\word\embeddings\oleObject1.bin 目录结构中

如果有多个, 就依序为 oleObject2.bin、oleObject3.bin ……

这种格式文件并不是简单的改名, 而是包装成 OLE对象。

是用 stream 流格式分段储存的的文件格式。无法直接用关联软件打开。

目前我找到2个方法:

方法1: 有个python包,olefile,用于解析、读取和写入 Microsoft OLE2 文件的 Python 包(结构化存储或复合文档,Microsoft Office)

olefile 主要面向开发人员。如果您正在寻找分析 OLE 文件或提取数据的工具(尤其是出于安全目的,例如恶意软件分析和取证),那么还请查看 python-oletools,它基于 olefile 构建并提供更高级别的接口。

方法2:

写一个vba(宏), 批量激活文档中插入的OLE对象。

代码如下:

Sub ActivateOLEObjects()
    Dim shap As InlineShape
    Dim i As Integer

    ' 遍历文档中的所有形状

    
    For Each shap In ActiveDocument.InlineShapes
         ' 尝试激活OLE对象
         On Error Resume Next
         shap.OLEFormat.Activate

    Next shap
    
    
    MsgBox "所有可激活的OLE对象已尝试激活.", vbInformation
    
    ' 获取系统临时文件夹路径
    tempFolderPath = Environ$("TEMP")

    ' 打开系统临时文件夹
    Shell "explorer.exe """ & tempFolderPath & """", vbNormalFocus
    
End Sub

这些对象激活后,会释放到系统临时文件夹 %tmp%

类似如下命名

C:\Users\admin\AppData\Local\Temp\{A1EF7F57-3964-488C-8E89-307544D912CF}

注意:只有激活对象后,文件才会释放。你全部复制即可。

做了一个测试文件 可以试试
https://wormhole.app/ezMzb#0CbSvVW0fM-mRmtKWQS-dw

主要是实际的时候有的文档预计会有20-30个对象附件。
并且文档的格式都不相同有点难弄 一个一个对名字挺麻烦的

我不是写了么, 写个代码调用7z解压docx之后, 枚举 embeddings目录下的*.bin, 然后继续用7z解开这些bin文件, 再枚举所有的OLE10Native文件, 二进制搜索迪个字节开始的文件名, 再找两次后就可以得到嵌入对象的文件长度以及二进制数据, 获取后保存即可, 完全不需要人工核对啊