vb.net代码捕获word文档第一页的屏幕截图

时间:2014-06-17 09:17:27

标签: vb.net ms-word image-capture

嗨以下是可以用PNG格式捕获word文档第一页图像的步骤。如果用户需要以任何其他格式捕获图像。然后在下面的代码中用您需要的输出图像扩展名替换图像扩展名。如果这个答案很有用,那就不要忘了投票。

1 个答案:

答案 0 :(得分:1)

第一步:一开始你需要在项目中的名称空间下面导入/引用:

    Import Imports Microsoft.Office.Interop.Word

第二步:在项目中添加空白类文件,并复制下面的word文档的vb.net代码:

Public Class ClipboardAPI
<Runtime.InteropServices.DllImport("user32.dll", EntryPoint:="OpenClipboard", SetLastError:=True, ExactSpelling:=True, CallingConvention:=System.Runtime.InteropServices.CallingConvention.StdCall)> _
Public Shared Function OpenClipboard(ByVal hWnd As IntPtr) As Boolean
End Function

<Runtime.InteropServices.DllImport("user32.dll", EntryPoint:="EmptyClipboard", SetLastError:=True, ExactSpelling:=True, CallingConvention:=System.Runtime.InteropServices.CallingConvention.StdCall)> _
Public Shared Function EmptyClipboard() As Boolean
End Function

<Runtime.InteropServices.DllImport("user32.dll", EntryPoint:="SetClipboardData", SetLastError:=True, ExactSpelling:=True, CallingConvention:=System.Runtime.InteropServices.CallingConvention.StdCall)> _
Public Shared Function SetClipboardData(ByVal uFormat As Integer, ByVal ByValhWnd As IntPtr) As IntPtr
End Function

<Runtime.InteropServices.DllImport("user32.dll", EntryPoint:="CloseClipboard", SetLastError:=True, ExactSpelling:=True, CallingConvention:=System.Runtime.InteropServices.CallingConvention.StdCall)> _
Public Shared Function CloseClipboard() As Boolean
End Function

<Runtime.InteropServices.DllImport("user32.dll", EntryPoint:="GetClipboardData", SetLastError:=True, ExactSpelling:=True, CallingConvention:=System.Runtime.InteropServices.CallingConvention.StdCall)> _
Public Shared Function GetClipboardData(ByVal uFormat As Integer) As IntPtr
End Function

<Runtime.InteropServices.DllImport("user32.dll", EntryPoint:="IsClipboardFormatAvailable", SetLastError:=True, ExactSpelling:=True, CallingConvention:=System.Runtime.InteropServices.CallingConvention.StdCall)> _
Public Shared Function IsClipboardFormatAvailable(ByVal uFormat As Integer) As Short
End Function
End Class

第三步:以下是仅针对第一页从word文档中捕获图像的代码。

    Dim Width, Height, Orientation as Integer
    Dim objWord As New Microsoft.Office.Interop.Word.Application
    Dim objDoc As Microsoft.Office.Interop.Word.Document

    Const CF_ENHMETAFILE As Integer = 14
    objDoc = objWord.Documents.Open(YourSourcePath)

    objWord.ActiveDocument.Select()
    objWord.Selection.CopyAsPicture()

    Try
        Dim ip As IntPtr
        Dim metaFile As System.Drawing.Imaging.Metafile
        Dim bRet As Boolean
        bRet = ClipboardAPI.OpenClipboard(Me.Handle)
        If bRet = True Then
            'Verify the clipboard contains data available
            'as an enhanced metafile.
            bRet = ClipboardAPI.IsClipboardFormatAvailable(CF_ENHMETAFILE) <> 0
        End If

        If bRet = True Then
            'Store the clipboard's contents in the IntPtr.
            ip = ClipboardAPI.GetClipboardData(CF_ENHMETAFILE)
        End If

        'Verify the IntPrt contains data before proceeding. Passing
        'an empty IntPtr to System.Drawing.Imaging.Metafile results
        'in an exception.
        If Not IntPtr.Zero.Equals(ip) Then
            metaFile = New System.Drawing.Imaging.Metafile(ip, True)
            ClipboardAPI.CloseClipboard()
            Dim image As System.Drawing.Image = metaFile
            'Me.PictureBox1.Image = metaFile

            Dim objImageWriter As Image = New Bitmap(image)
            Dim objGraphics As Graphics = Graphics.FromImage(objImageWriter)
            objGraphics.Clear(Color.White)
            objGraphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias

            If Orientation = 1 Then
                Width = image.Width
                Height = image.Height
            Else
                Width = image.Height
                Height = image.Width
            End If

            objGraphics.DrawImage(image, 0, 0, Width, Height)

            image.Dispose()
            objGraphics.Dispose()

            Dim ep As Imaging.EncoderParameters = New Imaging.EncoderParameters
            ep.Param(0) = New System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100)

            Dim codecs() As Imaging.ImageCodecInfo = Imaging.ImageCodecInfo.GetImageEncoders()
            Dim iciInfo As Imaging.ImageCodecInfo
            Dim item As Imaging.ImageCodecInfo

            For Each item In codecs
                If (item.MimeType = "image/png") Then iciInfo = item
            Next

            ImageFileName = Format(Now, "ddMMMyyyy_hhmmss_") & RandNumber.Next & ".png"
            ImageFilePath = Application.StartupPath & "\" & ImageFileName
            objImageWriter.Save(ImageFilePath, iciInfo, ep)
            objImageWriter.Dispose()

        End If
    Catch ex As Exception
        ExceptionGenerated = True
        Throw New System.Exception(ex.Message.ToString())
    Finally
        objDoc.Close()
        objWord.Application.Quit(False)
        objDoc = Nothing
        objWord = Nothing
        ReleaseComObject(objWord)
        ReleaseComObject(objDoc)
    End Try

第四步:在项目中添加ReleaseComObject函数:

    Public Sub ReleaseComObject(ByVal obj As Object)
        Try
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
            obj = Nothing
        Catch ex As Exception
            obj = Nothing
        End Try
    End Sub

您甚至可以使用以下vb.net代码检查您的单词页面方向:

    objDoc.PageSetup.Orientation = Microsoft.Office.Interop.Word.WdOrientation.wdOrientPortrait / wdOrientLandscape