当前位置: 首页 > 知识库问答 >
问题:

使用VBA从Word文档中提取图像

步建茗
2023-03-14

我需要循环一些word文档,并从word文档中提取图像,并将其保存在单独的文件夹中。我尝试过将它们保存为超文本标记语言文档的方法,但它不太适合我的需求。

现在,我使用inlineshapes对象循环浏览图像,然后将它们复制粘贴到publisher文档上,然后将它们保存为图像。但是,在运行脚本时,我会遇到运行时自动化错误。对于使用Publisher运行时库,我尝试了早期绑定和晚期绑定,但都遇到了错误。

谁能告诉我出了什么问题?另外,如果有人能解释为什么我会面临这个错误,那就太好了。根据我的理解,这是由于内存分配,但我不确定。

这是我一直在处理的代码块(fp,dp是文件夹路径,而filename是word文档名。我在另一个子文件夹中循环调用此子文件):

Sub test(ByVal fp As String, ByVal dp As String, ByVal filename As String)
Dim doc As Document
Dim pubdoc As New Publisher.Document
Dim shp As InlineShape
'Applicathtml" target="_blank">ion.Screenupdating = False
'Dim pubdoc As Object
'Set pubdoc = CreateObject("Publisher.Document")
Set doc = Documents.Open(fp)
With doc
    i = .InlineShapes.Count
    Debug.Print i
End With
For j = 1 To i
    Set shp = doc.InlineShapes(j)
    shp.Select
    Selection.CopyAsPicture
    pubdoc.Pages(1).Shapes.Paste
    pubdoc.Pages(1).Shapes(1).SaveAsPicture (dp & Application.PathSeparator & j & ".jpg")
    pubdoc.Pages(1).Shapes(1).Delete
Next
doc.Close (wdDoNotSaveChanges)
pubdoc.Close
'Application.Screenupdating = True

End Sub

除此之外,如果有人有任何建议,让这更快,我洗耳恭听。提前谢谢!

共有3个答案

潘智刚
2023-03-14

我不得不改变一些事情,但这将允许在word文档中保存一个图像,并经过几个周期,然后在另一侧变成jpg,而不需要任何空白

filename = ActiveDocument.FullName
saveLocaton = "z:\temp\"
FolderName = "test"
On Error Resume Next
Kill "z:\temp\test_files\*"  'Delete all files
RmDir "z:\temp\test_files"  'Delete folder

ActiveDocument.SaveAs2 filename:="z:\temp\test.html", FileFormat:=wdFormatHTML

ActiveDocument.Close
Kill saveLocaton & FolderName & ".html"
Kill saveLocaton & FolderName & "_files\*.xml"
Kill saveLocaton & FolderName & "_files\*.html"
Kill saveLocaton & FolderName & "_files\*.thmx"

Name saveLocaton & FolderName & "_files\image00" & 1 & ".png" As saveLocaton & FolderName & "_files\" & test2 & "_00" & x & ".jpg"

字。应用程序。可见=真言。应用程序。激活,激活

东郭自珍
2023-03-14

从从原始源文档创建的已过滤HTML文档中提取图片会更快。但是,你说这不适合你的需要,所以。。。下面的示例代码将在源文档中找到图片并将其粘贴到第二个文档中。

这种类型的代码的速度问题是由CopyPicture从选择命令工作引起的,所以我建议使用范围。当然,无论如何,所需的For/Nexthtml" target="_blank">循环都较慢。

Sub CopyPasteAsPicture()
    Dim doc As Word.Document, iShp As Word.InlineShape, shp As Word.Shape
    Dim i As Integer, nDoc As Word.Document, rng As Word.Range
    Set doc = ActiveDocument
    
    If doc.Shapes.Count > 0 Then
        For i = 1 To doc.Shapes.Count
            Set shp = doc.Shapes(i)
            If shp.Type = msoLinkedPicture Or shp.Type = msoPicture Then
                'if you want only pictures extracted then you have
                'to specify the type
                shp.ConvertToInlineShape
                'if you want all extracted pictures to be in the sequence
                'they appear in the document then you have to convert
                'floating shapes to inline shapes
            End If
        Next
    End If
    
    If doc.Content.InlineShapes.Count > 0 Then
        Set nDoc = Word.Documents.Add
        Set rng = nDoc.Content
        For i = 1 To doc.Content.InlineShapes.Count
            doc.Content.InlineShapes(i).Range.CopyAsPicture
            rng.Paste
            rng.Collapse Word.WdCollapseDirection.wdCollapseEnd
            rng.Paragraphs.Add
            rng.Collapse Word.WdCollapseDirection.wdCollapseEnd
        Next
    End If
End Sub

如果要将所有形状(浮动或内联)作为图像文件放置到文件夹中,那么最好的方法是将源文档另存为过滤后的HTML文档。命令如下:

htmDoc。SaveAs2文件名:=LGPWorking

在上面的示例中,活动文档被分配给变量htmDoc。我给这个新文档指定了一个特定的名称和位置。它的输出不仅是HTML文件,而且是一个同名的目录,并附加了一个“\u Files”标签。“x_文件”目录中包含所有图像文件。

如果您只希望从原始源文档中提取选择性图像,或者如果您希望从多个源文档中提取图像...那么您需要使用上面我分享的代码,以便仅将您希望从一个或多个源文档中提取的图像放入新建Word文档,然后将该新文档保存为筛选的超文本标记语言。

完成例程后,您可以杀死超文本标记语言文档,只留下文件目录。

酆乐湛
2023-03-14

只要加上。压缩到文件名的末尾,展开文件并查看word/media文件夹。所有文件都将在那里,无需编程。

 类似资料:
  • 正如您在word文档中看到的,有许多带有要点的问题。现在,我正在尝试使用apache POI从文件中提取每个段落。这是我当前的代码 上述方法的问题在于它打印的是每一行而不是段落。此外,项目符号也从提取的字符串中删除。返回一个纯字符串。 谁能解释一下我做错了什么。也请建议如果你有一个更好的想法来解决它。

  • 我想用vba来保护我的word文档。 的确,这是可能的,但我已经通过以下链接搜索了如何取消文档保护: http://www.aurelp.com/2015/04/01/how-to-unlock-a-microsoft-word-document-step-by-stepsolved/ 有没有其他方法可以成功地保护文档不被未经授权的用户使用?

  • 我有一个当前格式的文档 标题 字幕 H1 样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本 H2 样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本 H3 样本文本样本文本样本文本样本文本样本文

  • 我有一个word文档,其中包含许多由html标记定义的html文档。我想创建一个数组或范围集合,每个范围由一个html文档组成。例如,以下是Word文档: 等等。我想用一系列范围来填充rngHTMLDocs()As Range,每个范围包含每个打开和关闭html标记中的文本。 我创建了以下代码,试图遍历定义这些范围的整个文档,但它只继续选择超文本标记语言Doc 1。我想我可能以错误的方式接近整个迭

  • 我正在开发一个程序,需要从MS Word文档中提取两个图像,以便在另一个文档中使用它们。我知道图像的位置(文档中的第一个表),但当我试图从表中提取任何信息(即使只是纯文本)时,我会得到空单元格。 这是我想从中提取图像的Word文档。我想从第一页(第一个表,第0行和第1行,第2列)中提取“Rentel”图像。 我尝试了以下代码: 这只会给我空话。。。 我已经读过这篇讨论和这篇文章,问题可能是“包含在

  • 我已经很多年没有使用VB了,所以如果这是显而易见的,请原谅我。我正在尝试编写一个word vba宏,以便在模板中使用,该模板将显示一个userform,然后导入fileA的内容。docx,fileB。docx或fileC。docx取决于用户表单。(之后我将使用书签填写一些表单数据,我不知道这是否相关)。文件A、B和C将包含一些基本格式(如列表)的文本,但没有什么特别之处。 我在网上看到的解决方案可