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

**URL:** <https://meta.appinn.net/t/topic/63779>\
**Category:** 问题求助\
**Tags:** word, office\
**Created:** [2024 年12 月 3 日 08:03 UTC](https://meta.appinn.net/t/topic/63779 "2024-12-03T08:03:05Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

作者： ![tioo888](https://meta-edge.appinn.com/letter_avatar_proxy/v4/letter/t/5f9b8f/32.png) [@tioo888](https://meta.appinn.net/u/tioo888)\
发布日期： [2024 年12 月 3 日 08:03 UTC](https://meta.appinn.net/t/topic/63779/1 "2024-12-03T08:03:05Z")

</div>

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

---

<div class="post-metadata">

作者： ![VictoryRoad](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/victoryroad/32/58964_2.png) [@VictoryRoad](https://meta.appinn.net/u/VictoryRoad)\
发布日期： [2024 年12 月 3 日 08:05 UTC](https://meta.appinn.net/t/topic/63779/2 "2024-12-03T08:05:13Z")

</div>

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

至于图片，可以先参考一下这篇文章：

[https://www.appinn.com/word-export-images/](https://www.appinn.com/word-export-images/)

---

<div class="post-metadata">

作者： ![tioo888](https://meta-edge.appinn.com/letter_avatar_proxy/v4/letter/t/5f9b8f/32.png) [@tioo888](https://meta.appinn.net/u/tioo888)\
发布日期： [2024 年12 月 3 日 08:24 UTC](https://meta.appinn.net/t/topic/63779/3 "2024-12-03T08:24:22Z")

</div>

[![](https://h1.appinn.me/file/1733214150680_1.png) ](https://h1.appinn.me/file/1733214150680_1.png)  
测试了一个只能分解为20+个bin文档，完全无法识别之前的名字和格式。里面有word和表格文件，只有xLS格式的可以被识别。

---

<div class="post-metadata">

作者： ![VictoryRoad](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/victoryroad/32/58964_2.png) [@VictoryRoad](https://meta.appinn.net/u/VictoryRoad)\
发布日期： [2024 年12 月 3 日 08:27 UTC](https://meta.appinn.net/t/topic/63779/4 "2024-12-03T08:27:59Z")

</div>

> [@tioo888](#):
>
> 有大量的附件

这个好像应该叫 “对象”

---

<div class="post-metadata">

作者： ![tioo888](https://meta-edge.appinn.com/letter_avatar_proxy/v4/letter/t/5f9b8f/32.png) [@tioo888](https://meta.appinn.net/u/tioo888)\
发布日期： [2024 年12 月 3 日 08:34 UTC](https://meta.appinn.net/t/topic/63779/5 "2024-12-03T08:34:31Z")

</div>

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

---

<div class="post-metadata">

作者： ![3\_5105](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/3_5105/32/57748_2.png) [@3\_5105](https://meta.appinn.net/u/3_5105)\
发布日期： [2024 年12 月 3 日 10:23 UTC](https://meta.appinn.net/t/topic/63779/6 "2024-12-03T10:23:47Z")

</div>

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

---

<div class="post-metadata">

作者： ![VictoryRoad](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/victoryroad/32/58964_2.png) [@VictoryRoad](https://meta.appinn.net/u/VictoryRoad)\
发布日期： [2024 年12 月 3 日 11:04 UTC](https://meta.appinn.net/t/topic/63779/7 "2024-12-03T11:04:04Z")

</div>

> [@tioo888](#):
>
> 只能分解为20+个bin文档

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

> [@3\_5105](#):
>
> 解压出来之后，看看能不能打开其中的一两个

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

我测试了一下，

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

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

---

<div class="post-metadata">

作者： ![netcharm](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/netcharm/32/11247_2.png) [@netcharm](https://meta.appinn.net/u/netcharm)\
发布日期： [2024 年12 月 3 日 12:18 UTC](https://meta.appinn.net/t/topic/63779/8 "2024-12-03T12:18:03Z")

</div>

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

```vbscript
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

```

---

<div class="post-metadata">

作者： ![Qingwa](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/qingwa/32/58632_2.png) [@Qingwa](https://meta.appinn.net/u/Qingwa)\
发布日期： [2024 年12 月 3 日 12:22 UTC](https://meta.appinn.net/t/topic/63779/9 "2024-12-03T12:22:44Z")

</div>

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

---

<div class="post-metadata">

作者： ![VictoryRoad](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/victoryroad/32/58964_2.png) [@VictoryRoad](https://meta.appinn.net/u/VictoryRoad)\
发布日期： [2024 年12 月 3 日 12:49 UTC](https://meta.appinn.net/t/topic/63779/10 "2024-12-03T12:49:02Z")

</div>

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

---

<div class="post-metadata">

作者： ![3\_5105](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/3_5105/32/57748_2.png) [@3\_5105](https://meta.appinn.net/u/3_5105)\
发布日期： [2024 年12 月 3 日 13:19 UTC](https://meta.appinn.net/t/topic/63779/11 "2024-12-03T13:19:19Z")

</div>

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

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

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

---

<div class="post-metadata">

作者： ![3\_5105](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/3_5105/32/57748_2.png) [@3\_5105](https://meta.appinn.net/u/3_5105)\
发布日期： [2024 年12 月 3 日 13:29 UTC](https://meta.appinn.net/t/topic/63779/12 "2024-12-03T13:29:18Z")

</div>

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

> **[Office VBA 入门](https://learn.microsoft.com/zh-cn/office/vba/library-reference/concepts/getting-started-with-vba-in-office)**
>
> Office VBA 参考主题

---

<div class="post-metadata">

作者： ![VictoryRoad](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/victoryroad/32/58964_2.png) [@VictoryRoad](https://meta.appinn.net/u/VictoryRoad)\
发布日期： [2024 年12 月 3 日 13:54 UTC](https://meta.appinn.net/t/topic/63779/13 "2024-12-03T13:54:24Z")

</div>

> [@3\_5105](#):
>
> 分别修改扩展名为所有可能的项目，如果改成哪个能打开，那么就是对应的文件格式

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

---

<div class="post-metadata">

作者： ![3\_5105](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/3_5105/32/57748_2.png) [@3\_5105](https://meta.appinn.net/u/3_5105)\
发布日期： [2024 年12 月 3 日 15:31 UTC](https://meta.appinn.net/t/topic/63779/14 "2024-12-03T15:31:03Z")

</div>

> [@3\_5105](#):
>
> 找个 **文件头判定程序来判定bin文件文件头对应的扩展名，再据其重命名**

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

---

<div class="post-metadata">

作者： ![VictoryRoad](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/victoryroad/32/58964_2.png) [@VictoryRoad](https://meta.appinn.net/u/VictoryRoad)\
发布日期： [2024 年12 月 3 日 15:35 UTC](https://meta.appinn.net/t/topic/63779/15 "2024-12-03T15:35:37Z")

</div>

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

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

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

---

<div class="post-metadata">

作者： ![netcharm](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/netcharm/32/11247_2.png) [@netcharm](https://meta.appinn.net/u/netcharm)\
发布日期： [2024 年12 月 3 日 17:07 UTC](https://meta.appinn.net/t/topic/63779/16 "2024-12-03T17:07:31Z")

</div>

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

---

<div class="post-metadata">

作者： ![xiaokonglong](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/xiaokonglong/32/908_2.png) [@xiaokonglong](https://meta.appinn.net/u/xiaokonglong)\
发布日期： [2024 年12 月 4 日 01:34 UTC](https://meta.appinn.net/t/topic/63779/17 "2024-12-04T01:34:37Z")

</div>

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

# [Office.Files.Images](https://www.softwareok.com/?Download=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](https://www.decalage.info/python/oletools)，它基于 olefile 构建并提供更高级别的接口。

方法2：

写一个vba（宏）， 批量激活文档中插入的OLE对象。

代码如下:

```auto
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://h1.appinn.me/file/1733379219606_20241205_141318.png) ](https://h1.appinn.me/file/1733379219606_20241205_141318.png)

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

---

<div class="post-metadata">

作者： ![tioo888](https://meta-edge.appinn.com/letter_avatar_proxy/v4/letter/t/5f9b8f/32.png) [@tioo888](https://meta.appinn.net/u/tioo888)\
发布日期： [2024 年12 月 4 日 02:15 UTC](https://meta.appinn.net/t/topic/63779/18 "2024-12-04T02:15:23Z")

</div>

> [@Qingwa](#):
>
> 你这样的文档，有没有例子来看下啊

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

---

<div class="post-metadata">

作者： ![tioo888](https://meta-edge.appinn.com/letter_avatar_proxy/v4/letter/t/5f9b8f/32.png) [@tioo888](https://meta.appinn.net/u/tioo888)\
发布日期： [2024 年12 月 4 日 02:34 UTC](https://meta.appinn.net/t/topic/63779/19 "2024-12-04T02:34:46Z")

</div>

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

---

<div class="post-metadata">

作者： ![netcharm](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/netcharm/32/11247_2.png) [@netcharm](https://meta.appinn.net/u/netcharm)\
发布日期： [2024 年12 月 4 日 04:48 UTC](https://meta.appinn.net/t/topic/63779/20 "2024-12-04T04:48:01Z")

</div>

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

[下一页](https://meta.appinn.net/t/topic/63779.md?page=2)
