Hallo,
ich habe unter Word2016 einen anderen Ansatz erarbeitet:
So werden alle Bilder rausgeschrieben (nach *.tiff konvertieren kann ich nicht).
Sub Idee()
'benötigt Verweis auf: Microsoft XML v3.0
Dim objXML As MSXML2.DOMDocument
Dim objNode As MSXML2.IXMLDOMElement
Dim InlSh As InlineShape
Dim Filename As String, ff As Integer
Dim tmp() As Byte
Const Pfad As String = "c:\DeinPfad\mit\abschliessendem\Backslash\" 'anpassen
For Each InlSh In ThisDocument.InlineShapes ' gibts da noch was anderes außer Bilder => läuft evtl. in einen Fehler?
Set objXML = New MSXML2.DOMDocument
objXML.LoadXML InlSh.Range.WordOpenXML
Filename = objXML.getElementsByTagName("pic:cNvPr").Item(0).Attributes(1).Text
'Bild
Set objNode = objXML.createElement("b64")
objNode.dataType = "bin.base64"
objNode.Text = objXML.getElementsByTagName("pkg:binaryData").Item(0).Text
tmp = objNode.nodeTypedValue 'base64 codiertes Bild
ff = FreeFile()
Open Pfad & Filename For Binary As #ff
Put #ff, , tmp ' Variable tmp wird benötigt, damit put Länge und Deskriptor nicht schreibt
Close #ff
Next
Set objXML = Nothing
Set objNode = Nothing
End Sub
Bei meinen Tests kamen die *.png, *.jpg und *.tiff genau so raus, wie die Originale waren bevor ich sie in das Worddokument eingefügt habe (auf das bit genau).
Ausnahme: *.bmp wurde Wordintern irgendwie nach png konvertiert. Dementsprechend kam es auch verändert raus und hat die falsche Dateiendung?! Dem bin ich nicht weiter nachgegangen.
In Word2016 werden die Bilder standardmäßig komprimiert, das muss natürlich abgeschaltet sein, damit die extrahierten Bilder mit den originalen identisch sind (klar, sind die Bilder erst einmal komprimiert, kann man das nicht rückgängig machen).
Evtl. kann man da auch einstellen, dass das mit bmp nicht passiert => nicht im Kern meines Interesses.
Der Code ist als experimentell anzusehen. Es ist das erste Mal, dass ich mit dieser XML-dll arbeite. Keine Ahnung, ob ich da grundsätzliche Fehler gemacht habe, es war mehr so "spielerisches forschen".
Auch sind keine Abfragen drin, die ein Überschreiben vorhandener Dateien verhindern würden (Achtung, da hat man schnell mal ein Original mit was kompimiertem überschrieben). Daher bitte bei der Wahl des Pfades sorgfältig sein!
Da du ja nach selektieren und nur einem Bild gefragt hast, hier der gleiche Code, der aber nur das aktuell selektierte Bild exportiert.
Sub selektiertesBildExportieren()
'benötigt Verweis auf: Microsoft XML v3.0
Dim objXML As MSXML2.DOMDocument
Dim objNode As MSXML2.IXMLDOMElement
Dim Filename As String, ff As Integer
Dim tmp() As Byte
Const Pfad As String = "c:\DeinPfad\mit\abschliessendem\Backslash\" 'anpassen
Set objXML = New MSXML2.DOMDocument
objXML.LoadXML Selection.WordOpenXML
Filename = objXML.getElementsByTagName("pic:cNvPr").Item(0).Attributes(1).Text
'Bild
Set objNode = objXML.createElement("b64")
objNode.dataType = "bin.base64"
objNode.Text = objXML.getElementsByTagName("pkg:binaryData").Item(0).Text
tmp = objNode.nodeTypedValue 'base64 codiertes Bild
ff = FreeFile()
Open Pfad & Filename For Binary As #ff
Put #ff, , tmp ' Variable tmp wird benötigt, damit put Länge und Deskriptor nicht schreibt
Close #ff
Set objXML = Nothing
Set objNode = Nothing
End Sub
Bei beiden Codes ist ein Verweis auf "Microsoft XML v3.0" nötig. Höhere Versionen gehen bestimmt auch, ich habe einfach mal die 3.0 benutzt ...
Grüße, Ulrich
|