有个word文件内有大量的附件多种格式PNG、PDF、word、等20多个,有什么办法批量导出吗?
主要是word内的指定文件PDF、AI等格式的文档本机电脑无法打开。导致无法导出,有什么办法吗。
用 7-Zip 或 WinRAR 等软件将 docx 文档作为压缩文档打开,然后解压,可以从解压后得到的文件里面找一找。
至于图片,可以先参考一下这篇文章:
这个好像应该叫 “对象”
是的 是叫做对象
但是里面插入了大量的文件,有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文件, 二进制搜索迪个字节开始的文件名, 再找两次后就可以得到嵌入对象的文件长度以及二进制数据, 获取后保存即可, 完全不需要人工核对啊