VBA/VBScript提取Word(*.doc)文件中包含的图片(照片)

 

要处理的人事简历表是典型的Word文档,其中一人一份doc,里面包含有个人的照片,如果要把里面的照片复制出来就比较麻烦了,一般手动的做法是选择文件另存为,保存类型选择“网页(*.htm; *.html)”,这样就会另存为网页形式,同时会有个以文件名开头,以.files结尾的文件夹,点击进去就可以看到Word里面嵌入的所有资源,包含所需要的图片资源。

值得注意的是该文件夹里同一张图片正常会有两个副本,其中一张图片文件体积较大,另一张图片文件体积较小,显而易见较小体积的文件是Word自动创建的缩略图,在绝大多数情况下我们可能仅仅需要原始的插入图片,那么选择较大体积的图片文件即可,好在我要处理的人事简历表只有员工的一张照片,那么另存为网页后的文件夹也仅仅只有两张图片,一张原始图片,一张缩略图,这两张图片可以通过大小区分。

到这里大家可能对提取Word里面的图片有了大概的思路,如果文件比较少,那么刚才手动另存的方法是可以接受的,但是我所要处理的人事简历表就有好几百份,一份一份手动处理肯定耗时耗力,所以本文接下来将要简单介绍如何编程处理这项任务。

首先对于大批Word文件来袭,第一件事情就是要枚举每份文件,VBScript枚举文件的方式有很多,我就不一一介绍了,感兴趣的可以参考我这篇文章。这里有个注意点就是仅仅筛选扩展名为*.doc或者*.docx的文件,可以通过FileSystemObject组件的GetExtensionName获取,还有一个需要注意的地方就是Word会生成以~$开头的隐藏文件,偏偏这个文件也是doc扩展名结尾的,但该文件不是可用的Word文件,所以也要排除~$打头的文件类型。

下一步要明确将该Word文档另存为网页时保存的位置,因为我们主要是提取Word里插入的图片,另存文件这一部分不需要向用户展示,所以我们可以借助临时目录和临时文件来存储。

获取临时目录和文件名的方法如下:

Set fso = WSH.CreateObject("Scripting.FileSystemObject")
strTempDir = fso.GetSpecialFolder(2) ' 临时目录路径
strTempFileName = fso.GetTempName() ' 临时文件名
' 另存为HTML网页的文件路径
strTempHTMLFileName = fso.BuildPath(strTempDir, strTempFileName & ".html" )
' 对应的网页资源文件夹路径
strTempHTMLDirName = fso.BuildPath(strTempDir, strTempFileName & ".files" )
Set fso = Nothing

然后使用SaveAs对目标Word文件进行另存操作,其中另存类型为wdFormatHTML,这是个常量,具体如下所示,表示不同的保存类型选项。

Const wdFormatDocument                    =  0
Const wdFormatDocument97 = 0
Const wdFormatDocumentDefault = 16
Const wdFormatDOSText = 4
Const wdFormatDOSTextLineBreaks = 5
Const wdFormatEncodedText = 7
Const wdFormatFilteredHTML = 10
Const wdFormatFlatXML = 19
Const wdFormatFlatXMLMacroEnabled = 20
Const wdFormatFlatXMLTemplate = 21
Const wdFormatFlatXMLTemplateMacroEnabled = 22
Const wdFormatHTML = 8
Const wdFormatPDF = 17
Const wdFormatRTF = 6
Const wdFormatTemplate = 1
Const wdFormatTemplate97 = 1
Const wdFormatText = 2
Const wdFormatTextLineBreaks = 3
Const wdFormatUnicodeText = 7
Const wdFormatWebArchive = 9
Const wdFormatXML = 11
Const wdFormatXMLDocument = 12
Const wdFormatXMLDocumentMacroEnabled = 13
Const wdFormatXMLTemplate = 14
Const wdFormatXMLTemplateMacroEnabled = 15
Const wdFormatXPS = 18
Const wdFormatOfficeDocumentTemplate = 23
Const wdFormatMediaWiki = 24

对于上述类型,本文不做详细叙述,详情可以参考MSDN相关文档,关于另存的VBScript代码如下所示。

Set objWordApp = WSH.CreateObject("Word.Application")
objWordApp.Visible = True
' 打开目标Word文件
Set objDoc = objWordApp.Documents.Open(strFileName)
' 另存为HTML文件
objDoc.SaveAs strTempHTMLFileName, wdFormatHTML
objDoc.Close
Set objDoc = Nothing
objWordApp.Quit
Set objWordApp = Nothing

另存成功后,我们就可以通过变量strTempHTMLDirName定位到导出的资源文件夹,找到所需要的图片即可。这里需要再次用到文件枚举,实际上每次导出,Word会很贴心的生成一个XML的文件列表,叫做filelist.xml,所有导出的文件该列表均有记录,如下所示:

<xml xmlns:o="urn:schemas-microsoft-com:office:office">
<o:MainFile HRef="../rad1378A.tmp.html"/>
<o:File HRef="image001.jpg"/>
<o:File HRef="image002.jpg"/>
<o:File HRef="header.html"/>
<o:File HRef="filelist.xml"/>
</xml>

另外由于是XML格式的,所以可以通过解析这个文件完成对所有导出资源的处理,得到所需要的图片文件路径,获得所对应图片文件大小,取最大存储体积的图片为最终所需要的图片,相关代码如下所示:

Function GetRealImageFileName(fso, strBaseDir)
Dim i, objXml, objNode, objChildNode
Dim strFileListFile, strExtension, strFileName
strFileListFile = fso.BuildPath(strBaseDir, "filelist.xml")
 
Set objXml = WSH.CreateObject("Microsoft.XMLDOM")
objXml.validateOnParse = True
objXml.Load strFileListFile
objXml.Async = False
 
Set objNode = objXml.documentElement
 
Dim f, strFileName2, strFinalImageFileName, fFinalImageFileSize
 
fFinalImageFileSize = 0
strFinalImageFileName = ""
 
For i = 0 To objNode.childNodes.Length - 1
Set objChildNode = objNode.childNodes.Item(i)
If objChildNode.tagName = "o:File" Then
strFileName = objChildNode.attributes.getNamedItem("HRef").text
strExtension = UCase(fso.GetExtensionName(strFileName))
If strExtension = "JPG" Or strExtension = "JPEG" Or _
strExtension = "GIF" Or strExtension = "BMP" Or _
strExtension = "PNG" Then
strFileName2 = fso.BuildPath(strBaseDir, strFileName)
Set f = fso.GetFile(strFileName2)
 
If fFinalImageFileSize < f.Size Then
fFinalImageFileSize = f.Size
strFinalImageFileName = strFileName2
End If
Set f = Nothing
End If
End If
Set objChildNode = Nothing
Next
 
Set objNode = Nothing
Set objXml = Nothing
 
GetRealImageFileName = strFinalImageFileName
 
End Function

最后将该图片复制出来即可,这里直接判断最大存储体积的图片为所需要的原始图片是基于每张简历表仅插入一张照片为前提的。

另外别忘了进行扫尾工作,删除另存的网页文件和关联资源文件夹,当然由于是临时目录,使用临时文件清理工具也可以完成此项工作,如果我们代码完美一些,可以编程实现自动删除。

' 删除网页文件
fso.DeleteFile strTempHTMLFileName
' 删除网页文件对应资源文件夹里所有文件
fso.DeleteFile fso.BuildPath(strTempHTMLDirName, "*"), True
' 删除网页文件对应资源文件夹里所有目录
fso.DeleteFolder fso.BuildPath(strTempHTMLDirName, "*"), True
' 删除网页文件对应资源文件夹
fso.DeleteFolder strTempHTMLDirName, True

 

VBA/VBScript提取Word(*.doc)文件中包含的图片(照片)的更多相关文章

  1. 使用POI读写Word doc文件

    使用POI读写word doc文件 目录 1     读word doc文件 1.1     通过WordExtractor读文件 1.2     通过HWPFDocument读文件 2     写w ...

  2. android使用POI读写word doc文件

    目录 1     读word doc文件 1.1     通过WordExtractor读文件 1.2     通过HWPFDocument读文件 2     写word doc文件 Apache p ...

  3. C# 提取Word文档中的图片

    C# 提取Word文档中的图片 图片和文字是word文档中两种最常见的对象,在微软word中,如果我们想要提取出一个文档内的图片,只需要右击图片选择另存为然后命名保存就可以了,今天这篇文章主要是实现使 ...

  4. 使用Java POI来选择提取Word文档中的表格信息

    通过使用Java POI来提取Word(1992)文档中的表格信息,其中POI支持不同的ms文档类型,在具体操作中需要注意.本文主要是通过POI来提取微软2003文档中的表格信息,具体code如下(事 ...

  5. 使用POI转换word doc文件

    目录 1       转换为Html文件 2       转换为Xml文件 3       转换为Text文件 在POI中还存在有针对于word doc文件进行格式转换的功能.我们可以将word的内容 ...

  6. 如何在Qt资源文件中包含和释放exe等各种类型文件?

    操作系统:Windows 10 X64 企业版 Qt: 5.8.0 QtCreater: 4.2.1 刚刚开始学习Qt,不断遇到困难和挑战,前几天在各个QQ群里询问如何在Qt的资源文件中包含和释放ex ...

  7. POI转换word doc文件为(html,xml,txt)

    在POI中还存在有针对于word doc文件进行格式转换的功能.我们可以将word的内容转换为对应的Html文件,也可以把它转换为底层用来描述doc文档的xml文件,还可以把它转换为底层用来描述doc ...

  8. time.h文件中包含的几个函数使用时须注意事项

    time.h头文件中包含以下函数 char* asctime(const struct tm *tm); char* asctime_r(const struct tm *tm,char *buf); ...

  9. Aspose.Words提取word文档中的图片文件

    /// <summary> /// 提取word中的图片 /// </summary> /// <param name="filePath">w ...

随机推荐

  1. HDFS v1.0学习笔记

    hdfs是一个用于存储大文件的分布式文件系统,是apache下的一个开源项目,使用java实现.它的设计目标是可以运行在廉价的设备上,运行在大多数的系统平台上,高可用,高容错,易于扩展. 适合场景 存 ...

  2. srvctl error

    Hit an strange error just now. [oracle@racnode1 ~]$ srvctl # # An unexpected error has been detected ...

  3. springMvc把client传过来一个String类型,转换为日期类型为例

    springMvc--接受日期类型参数处理   目录 步骤 2.自定义类型转换规则 3.注册自定义的类型转换类 4.地址栏访问 这个问题,也即是springMvc如何进行参数类型的转换 , 以把cli ...

  4. gogs: 如何恢复repository

    当某天gogs的数据库突然崩溃,配置数据全部消失后,要如何将之前git的repository重新加入到gogs中呢?(别问了,那个倒霉的人就是我) step 1, 2, 3, go... 1. 进入g ...

  5. firebug 扩展介绍和下载

    https://getfirebug.com/wiki/index.php/Firebug_Extensions#Firecookie https://addons.mozilla.org/zh-CN ...

  6. priority_queue实现

    #include <algorithm> using namespace std; /* priority_queue只允许在底端加入元素,并从顶端取出元素, 其内部元素不是依照被推入的次 ...

  7. Swift具体解释之六----------------枚举、结构体、类

    枚举.结构体.类 注:本文为作者自己总结.过于基础的就不再赘述 ,都是亲自測试的结果.如有错误或者遗漏的地方.欢迎指正,一起学习. 1.枚举 枚举是用来定义一组通用类型的一组相关值 ,关键字enum ...

  8. How can I add files to a Jar file? (or add a file to a zip archive)

    https://stackoverflow.com/questions/12239764/how-can-i-add-files-to-a-jar-file M.java class M{ publi ...

  9. 战术网络安全检查表 | Symantec Connect

    "知己知彼,百战不殆: 不知彼而知己,一胜一负: 不知彼,不知己,每战必殆." 孙子(中国古代军事家). 孙子的话在今日仍能够使我们产生共鸣. 机构只有了解敌人和自己优缺点才能在持 ...

  10. ZOJ 3675 Trim the Nails(bfs)

    Trim the Nails Time Limit: 2 Seconds      Memory Limit: 65536 KB Robert is clipping his fingernails. ...