Microsoft.Office.Interop.Word.Shapes.AddPicture Пропорциональное управление изображениями - PullRequest
0 голосов
/ 15 ноября 2018

Есть ли способ добавить картинку, которая пропорционально ограничена определенной областью? Мне нужно изменить программу, которую я написал несколько лет назад, и заказчик предоставляет мне размеры изображений, которые повсюду! Хуже того, похоже, что мы сами манипулируем имиджем. Я не вижу ничего в документах , которые выделяются этим, так что я здесь! Я понимаю, что есть параметры объекта .Height и .Width, но, учитывая текущую поставку изображений, я надеюсь избежать написания кода, который это решает. Я также надеюсь не добавлять больше библиотек. Что еще хуже, я могу сделать это в ImageMagick, но даже в этом случае до сих пор нет объяснения, почему изображение размером 300x300 будет занимать 1/4 листа. Исходное изображение было 300x100 и отлично помещалось в заголовке.

          Try
            'Open the template
            objDoc = objWordApp.Documents.Open(appPath & "\PackListTemplate.dotm", [ReadOnly]:=True)
            'set word document as active
            objDoc = objWordApp.ActiveDocument

            Using conn = New SqlConnection(My.Settings.ConnStr)
                conn.Open()
                Using cmd As New SqlCommand()
                    cmd.Connection = conn
                    cmd.CommandType = CommandType.Text
                    With objDoc
                        'get the image blob and store it as a file
                        'return the file path
                        Dim filePath As String = WriteImageFromDb()

                        'apply the filepath as the image header of the document
                        .PageSetup.DifferentFirstPageHeaderFooter = 0
                        .Sections(1).Headers(Word.WdHeaderFooterIndex.wdHeaderFooterPrimary).Shapes.AddPicture(filePath)

                    End With
                End Using
            End Using
        Catch ex As Exception
            Console.WriteLine(ex.Message)
            Console.ReadLine()
        Finally

            'quit msWord
            objWordApp.Quit()

            'clear objWord object
            If Not objWordApp Is Nothing Then objWordApp = Nothing

            'close com objects on parent system
            If Not objDoc Is Nothing Then
                System.Runtime.InteropServices.Marshal.ReleaseComObject(objDoc)
            End If

            If Not objWordApp Is Nothing Then
                System.Runtime.InteropServices.Marshal.ReleaseComObject(objWordApp)
            End If

            'If Not objTable Is Nothing Then objTable = Nothing
            If Not objDoc Is Nothing Then objDoc = Nothing
            If Not objWordApp Is Nothing Then objWordApp = Nothing
            'exit application with exit code 0 (successful)
            ' Environment.Exit(0)
            GC.Collect()
        End Try

EDIT: Я заметил в Intellisense, что есть свойство .WidthRelative. Странно это не в документах, но не стоит удивляться. Я думаю, если я смогу получить размеры изображения, я смогу определить, какое значение применить к нему.

1 Ответ

0 голосов
/ 16 ноября 2018

Отвечая на мой собственный пост.Ненавижу делать это, но я надеюсь, что это поможет кому-то еще!Учитывая то, что я нашел свойства .HeightRelative и .WidthRelative, я просто немного вычислил свойства изображения и применил его к заголовку.Я не получил эффект disired, это было непоследовательное изображение к изображению, поэтому я просто начал манипулировать свойствами .Height и .Width.Возможно, есть более простой способ сделать это, но это привело меня туда, где я должен был быть.

          Try
            'Open the template
            objDoc = objWordApp.Documents.Open(appPath & "\PackListTemplate.dotm", [ReadOnly]:=True)
            'set word document as active
            objDoc = objWordApp.ActiveDocument

            Using conn = New SqlConnection(My.Settings.ConnStr)
                conn.Open()
                Using cmd As New SqlCommand()
                    cmd.Connection = conn
                    cmd.CommandType = CommandType.Text
                    With objDoc
                        'get the image blob and store it as a file
                        'return the file path
                        Dim filePath As String = WriteImageFromDb()
                                                    Dim filePath As String = WriteImageFromDb()
                        Dim img As Image = Image.FromFile(filePath)
                        Dim imgX As Integer = img.Width
                        Dim imgXLim As Integer = 350
                        Dim imgY As Integer = img.Height
                        Dim imgYLim As Integer = 100
                        Dim imgXdiff As Integer = imgX - imgXLim
                        Dim imgYdiff As Integer = imgY - imgYLim
                        Dim growFactor As Double
                        Dim shrinkFactor As Double
                        .PageSetup.DifferentFirstPageHeaderFooter = 0
                        With .Sections(1).Headers(Word.WdHeaderFooterIndex.wdHeaderFooterPrimary).Shapes
                            'Check to see if the image is too big
                            If imgX > imgXLim Or imgY > imgYLim Then
                                If imgXdiff > imgYdiff Then
                                    shrinkFactor = (imgXLim / imgX) - ((imgXLim / imgX) Mod 0.1) 'Decimal Floor
                                ElseIf imgYdiff > imgXdiff Then
                                    shrinkFactor = (imgYLim / imgY) - ((imgYLim / imgY) Mod 0.1) 'Decimal Floor
                                End If
                                imgX = imgX * shrinkFactor
                                imgY = imgY * shrinkFactor
                                'If the image isn't too big, check to see if it's too small
                            ElseIf imgX < imgXLim Or imgY < imgYLim Then
                                If imgXdiff > imgYdiff Then
                                    growFactor = (imgXLim / imgX) - ((imgXLim Mod imgX) / imgX) ' Integer Floor
                                ElseIf imgYdiff > imgXdiff Then
                                    growFactor = (imgYLim / imgY) - ((imgYLim Mod imgY) / imgY) ' Integer Floor
                                End If
                                imgX = imgX * growFactor
                                imgY = imgY * growFactor
                            End If
                            With .AddPicture(filePath)
                                .Width = imgX
                                .Height = imgY
                            End With
                        End With
                    End With
                End Using
            End Using
        Catch ex As Exception
            Console.WriteLine(ex.Message)
            Console.ReadLine()
        Finally

            'quit msWord
            objWordApp.Quit()

            'clear objWord object
            If Not objWordApp Is Nothing Then objWordApp = Nothing

            'close com objects on parent system
            If Not objDoc Is Nothing Then
                System.Runtime.InteropServices.Marshal.ReleaseComObject(objDoc)
            End If

            If Not objWordApp Is Nothing Then
                System.Runtime.InteropServices.Marshal.ReleaseComObject(objWordApp)
            End If

            'If Not objTable Is Nothing Then objTable = Nothing
            If Not objDoc Is Nothing Then objDoc = Nothing
            If Not objWordApp Is Nothing Then objWordApp = Nothing
            'exit application with exit code 0 (successful)
            ' Environment.Exit(0)
            GC.Collect()
        End Try

Подобные результаты можно найти, используя методы .ScaleWidth и .ScaleHeight.Правильное расположение документации для вышеупомянутых методов: https://docs.microsoft.com/en-us/dotnet/api/microsoft.office.interop.word.shape.

. В конце концов, я использовал приведенный выше код, поскольку получил более надежные результаты с размером, что позволило снизить риск любого чрезмерного или недостаточного перекрытия.

...