OpenXML WordprocessingML ImagePart >> Position des Bildes festlegen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von steel75.

    OpenXML WordprocessingML ImagePart >> Position des Bildes festlegen

    Hallo zusammen,
    ich habe ein Thema, in das ich mich gerade hineinarbeiten muss. Die Erstellung von *.docx Dateien auf Basis von OpenXML 2.8 mit WordprocessingML.

    Das Programm was geschrieben muss, muss für Mitarbeiter (durch Datenbank Abfrage) einen ausgefüllten Beurteilungsbogen erzeugen. Einiges funktioniert auch
    schon. Bei anderem findet man einfach so gut wie keine Beispiele oder Dokumentation.

    So kann ich aus dem Dateisystem eine Logo Datei ganz oben links im Dokument einfügen auch die Höhe und Weite festlegen, aber was ich bis jetzt nicht geschafft
    habe, ist das Logo an eine bestimmte Position einzufügen. Es wird nämlich immer linksbündig oben in der Ecke angezeigt. Es muss aber auf die rechte Seite.

    Hat hier jemand schon mal mit OpenXML gearbeitet und da Erfahrung wie ich ImagePart manipulieren muss, damit ich sowas wie .X und .Y habe und eine
    Position festlegen kann?

    Schon mal vielen Dank für eure Hilfe :)
    VG steel
    Also das Problem mit dem Logo auf der rechten Seite im Dokument konnte lösen. Mit der folgenden Funktion und Hilfsfunktion, erscheint das
    Logo auf der rechten Seite ganz oben.

    Dafür das nächste Problem, öffne ich das Dokument mit Word 2019, wird es richtig angezeigt. Schicke ich es dann auf den Multifunktionsdrucker HPColor Laserjet Pro MFP479fdn
    wird es wieder links ausgedruckt. Speichere ich das Dokument in Word als PDF und drucke es dann, wird es rechts ausgedruckt.

    Was kann das sein?

    VB.NET-Quellcode

    1. 'Benötigte Imports, Verweis im Projekt auf auf DocumentFormat.OpenXml und WindowsBase
    2. Imports System.IO
    3. Imports DocumentFormat.OpenXml
    4. Imports DocumentFormat.OpenXml.Packaging
    5. Imports DocumentFormat.OpenXml.OpenXmlWriter
    6. Imports DocumentFormat.OpenXml.Wordprocessing
    7. Imports DocumentFormat.OpenXml.ExtendedProperties
    8. Imports D = DocumentFormat.OpenXml.Drawing
    9. Imports DWP = DocumentFormat.OpenXml.Drawing.Wordprocessing
    10. Imports PIC = DocumentFormat.OpenXml.Drawing.Pictures
    11. '********************************************************************************************************************
    12. 'Logo einfügen
    13. Dim imagePart As ImagePart = mainPart.AddImagePart(ImagePartType.Jpeg)
    14. If frmMain.FileExists(AppDomain.CurrentDomain.BaseDirectory & modMain.msv_sLogo) Then 'Logo auf Existenz prüfen aus dem Applikationsverzeichnis & Dateiname als Variable
    15. Using stream As New FileStream(AppDomain.CurrentDomain.BaseDirectory & modMain.msv_sAuthority_Logo, FileMode.Open) 'Logo einlesen
    16. imagePart.FeedData(stream)
    17. End Using
    18. Dim imageElement = AddImageToBody(mainPart.GetIdOfPart(imagePart), 480, 130) 'Bild einbetten aufrufen
    19. body.AppendChild(New Paragraph(New Run(imageElement)))
    20. doc.MainDocumentPart.Document.Save()
    21. End If
    22. '********************************************************************************************************************




    VB.NET-Quellcode

    1. Friend Function AddImageToBody(ByVal relationshipId As String, ByVal width As Double, ByVal height As Double) As Drawing
    2. Dim englishMetricUnitsPerInch As Double = 914400
    3. Dim PixelsPerInch As Double = 96 '96 Pixel umfast ein Inch = 2,54 cm
    4. 'Berechne die EMU Größe in Inch
    5. Dim emuWidth As Double = width * englishMetricUnitsPerInch / PixelsPerInch
    6. Dim emuHeight As Double = height * englishMetricUnitsPerInch / PixelsPerInch
    7. 'Kernreferenz zum Bild
    8. Dim picElement = New Drawing(
    9. New DWP.Inline(
    10. New DWP.Extent() With {.Cx = 5800000L, .Cy = 500000L},'Absatz Größe für das Logo
    11. New DWP.EffectExtent() With {.LeftEdge = 0L, .TopEdge = 0L, .RightEdge = 0L, .BottomEdge = 0L},
    12. New DWP.DocProperties() With {.Id = CType(1UI, UInt32Value), .Name = "Logo"},
    13. New DWP.NonVisualGraphicFrameDrawingProperties(
    14. New D.GraphicFrameLocks() With {.NoChangeAspect = True}
    15. ),
    16. New D.Graphic(New D.GraphicData( '
    17. New PIC.Picture(
    18. New PIC.NonVisualPictureProperties(
    19. New PIC.NonVisualDrawingProperties() With {.Id = 0UI, .Name = "Logo.jpg"},
    20. New PIC.NonVisualPictureDrawingProperties()
    21. ),
    22. New PIC.BlipFill(
    23. New D.Blip(
    24. New D.BlipExtensionList(
    25. New D.BlipExtension() With {.Uri = "{28A0092B-C50C-407E-A947-70E740481C1C}"})
    26. ) With {.Embed = relationshipId, .CompressionState = D.BlipCompressionValues.Print},
    27. New D.Stretch(
    28. New D.FillRectangle()
    29. )
    30. ),
    31. New PIC.ShapeProperties(
    32. New D.Transform2D(
    33. New D.Offset() With {.X = 9500000, .Y = 100000},'Logo Position im Dokument, rechts oben erste Seite
    34. New D.Extents() With {.Cx = Convert.ToInt64(emuWidth), .Cy = Convert.ToInt64(emuHeight)}), 'Logo Größe wird übergeben und konvertiert in EMU
    35. New D.PresetGeometry(
    36. New D.AdjustValueList()
    37. ) With {.Preset = D.ShapeTypeValues.Rectangle}
    38. )
    39. )
    40. ) With {.Uri = "http://schemas.openxmlformats.org/drawingml/2006/picture"}
    41. )
    42. ) With {.DistanceFromTop = 0UI,
    43. .DistanceFromBottom = 0UI,
    44. .DistanceFromLeft = 0UI,
    45. .DistanceFromRight = 0UI}
    46. )
    47. Return picElement
    48. End Function

    VG steel