0

Hi Below is the steps through which one can capture word document first page image in PNG format. If user need to capture image in any other format. Then just replace the image extension with your needed output image extension in below code. If this answer is useful then don't forget to vote.

Deduplicator
  • 44,692
  • 7
  • 66
  • 118
Milan Sheth
  • 884
  • 12
  • 11

1 Answers1

1

First Step: Very beginning you need to Import / Reference below namespace in your project:

    Import Imports Microsoft.Office.Interop.Word

Second Step: Add blank class file in your project and copy the below vb.net code for word document:

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

Third Step: Here is the code for capturing image from word document only for first page.

    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

Fourth Step: Add ReleaseComObject function in your project:

    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

You can even check your word page orientation using below vb.net code:

    objDoc.PageSetup.Orientation = Microsoft.Office.Interop.Word.WdOrientation.wdOrientPortrait / wdOrientLandscape
Milan Sheth
  • 884
  • 12
  • 11