Kompletten Ordner mit Bildern per Makro einfügen

Hallo.
Um mich endgültig von Word und damit Windows lösen zu können, benötige ich einen Makro, der folgendes kann:

  • jpg-Fotos (alle mit gleicher Größe) aus einem Ordner einfügen
  • darunter eine Beschriftung mit Nummerierung (Foto 1, Foto 2 etc.) einfügen und ein Text (TEXT1), der anfangs abgefragt werden müsste
  • schön wäre noch, wenn hinter dem TEXT1 der Dateiname und das Aufnahmedatum (aus den EXIF-Daten) angegeben würde

Das ist der Plan, aber mit einer funktionierenden Foto-einfügen-Schleife wäre ich natürlich schon zufrieden.
:wink:

Gruß
norrin

PS:
Here the same question in english:

Englisch: https://ask.libreoffice.org/c/english/5

Bei Crossposting bitte gegenseitig verlinken. Danke.

Bei keine Antwort schreiben, wenn es nicht eine Lösung zur Eingansfrage ist.

Editiere jeweils deine Frage oder bei Bedarf schreibe einen Kommentar. Danke.

Ich habe das einmal aus diversen Quellen zusammengepackt und zumindest die Schleife für die Bilder untereinander drin, so dass jedes Bild an einem separaten Anker hängt und daneben ein Absatz existiert, die Bilder also nicht einfach übereinander gepackt werden:

SUB GrafikenEinfuegen
GlobalScope.BasicLibraries.LoadLibrary("Tools")
DIM oDoc AS OBJECT
DIM oDrawpage AS OBJECT
DIM oTxtRange AS OBJECT
DIM stUrl AS STRING
DIM stFile AS STRING
DIM oText AS OBJECT
oDoc = ThisComponent
oDrawpage = oDoc.getDrawpage()
stUrl = oDoc.URL
stUrl = Left(stUrl, len(stUrl)-len(RetrieveFileName(oDoc))) & "Bilder"
stFile = Dir$(stUrl + getPathSeparator + "*",0)
oText = oDoc.text
oCursor = oText.createTextCursor()
DIM oLinie AS NEW com.sun.star.table.BorderLine
oLinie.innerLineWidth = 0
oLinie.outerLineWidth = 0
Do
    If stFile <> "." And stFile <> ".." Then
        stDir = stFile     
		oTxtRange = oText.getEnd()
		oFrame = oDoc.createInstance("com.sun.star.text.TextFrame")
		oFrame.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PARAGRAPH
		oFrame.width = 10000
		oFrame.height = 10000
		oText.InsertTextContent(oTxtRange, oFrame, FALSE)
		oFrameCur = oFrame.createTextCursor()
		oFrameCur.charHeight = 12
		oFrameCur.String = stFile
		oFrame.BorderDistance = 0
		oFrame.LeftBorder = oLinie
		oFrame.RightBorder = oLinie
		oFrame.TopBorder = oLinie
		oFrame.BottomBorder = oLinie
		oGrafik = oDoc.createInstance("com.sun.star.text.GraphicObject")
		stUrl1 = stUrl & getPathSeparator & stFile
		oGrafik.GraphicURL = stUrl1
		oGrafik.AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER
		oFrame.InsertTextContent(oFrameCur, oGrafik, FALSE)
		oGrafik.height = oGrafik.ActualSize.height
		oGrafik.width = oGrafik.ActualSize.width
		oFrame.SurroundAnchorOnly = TRUE
		Dim aSize As New com.sun.star.awt.Size
		aSize.width = oGrafik.ActualSize.width
		aSize.height = oGrafik.ActualSize.height + 50
		oFrame.Size = aSize
		oText.insertString(oCursor, CHR(13) ,false)
		oGrafik.Name = stFile
	End If
    stFile = Dir$
Loop Until stFile = ""
END SUB

Die Variablen sind nicht alle deklariert. Die Bilder liegen unterhalb des Textdokumentes in einem Verzeichnis “Bilder”. In diesem Verzeichnis darf nach der Konstruktion nichts anderes liegen, denn alle dort enthaltenen Dateien werden als Grafiken gesehen, die eingefügt werden können.

Mal sehen, ob ich auch noch die Zeit habe, die Unterschriften usw. zu ermitteln.

Habe ich gemacht: Bilder in Frames, Bildunterschrift (Dateinamen) sowie Bilder in den Frames.

So, habe das erstmal auf meinem Windows-PC getestet. Die Writer-Datei liegt gemeinsam mit einem Ordner “Bilder” (dort sind 4 jpegs enthalten) in einem Verzeichnis.

Ich bekomme folgenden fehler (Zeile 49):

BASIC-Laufzeitfehler.
Es ist eine Ausnahme aufgetreten 
Type: com.sun.star.uno.RuntimeException

Da kann ich jetzt lange suchen um die Zeile zu finden. Teste erst einmal hiermit: ZIP-Datei mit Writerdatei und Bildern. Da liegen in der Bilderdatei auch schon die EXIF-Informationen in einer Textdatei. Ich habe es bisher nicht hinbekommen, das während des Makros automatisch ablaufen zu lassen …

Screenshot
Sieht das bei dir nicht auch so aus?
Das betrifft also die 5. Zeile von unten (!) deines oben geposteten Makros.

Ich versuche es mal mit der zip-Datei Danke.
EDIT: der Link kann nicht stimmen

Alles klar, war der Link von meinem Rechner - aus unerfindlichen Gründen. Writer_Bilder

Der obige Makrocode funktioniert bei mir ohne Probleme.

Ok, dannn liegt es an meinem PC/Windows. Selbe Fehlermeldung beim Ausführen des Makros in deiner Datei

Teste das später noch auf dem Linux-Notebook.

setze einmal diesen Namen in Form eines Zählers:
Vor do einsetzen i=1
Dann oGrafik.Name = stFile ändern zu oGrafik.Name = "Bild" & i, anschließend i=i+1

Es kann sein, dass unter Windows die Bezeichnung der Grafik nicht mit Punkten möglich ist. Ich habe für die Bezeichnung ja einfach den Dateinamen gewählt. Wenn Du keinen Namen zuweist funktioniert das Makro auch (auskommentieren mit rem). Nur wird dann das Bild nicht im Navigator angezeigt.

Kleine Ergänzung: Habe das jetzt noch einmal überarbeitet und erneut unter dem Link bereitgestellt. Das Erstellen der Nummernkreis-Beschriftung war etwas härteres Brot. Auch die EXIF-Informationen auszulesen gehen so nur, wenn vorher z.B. über ImageMagic die Informationen in Textdateien vorliegen. Dazu habe ich keine andere Lösung gefunden.

Wenn Du raus hast, was bei dem Grafiknamen falsch ist, dann poste das hier - oder Mail mich direkt an. Dann ändere ich anschließend die ursprüngliche Antwort.

Hallo Robert, würde gern produktives Feedback geben, aber der Makro läuft bei mir nicht.
Weder auf zwei Windows- noch auf dem Linux-Notebook.
Habe die Libre-Office-Versionen geupdatet. die Makrosicherheit herunter gesetzt, aber es passiert nichts (auch keine Fehlermeldung).
Die Java-JRE-Meldung ist ein Bug, wenn ich das richtig verstanden habe und weder Schaltfläche, noch das Ausführen über Makro-Menü klappen.
:frowning:

Ich habe da noch weitere Updates hinterhergeschoben - alle funktionieren hier. Bei der letzten Version habe ich auch oGrafik.Name geändert …

Du hast doch wohl einfach den Ordner entpackt und dann die Writerdatei geöffnet, oder?

Wenn gar nichts passiert helfe ich mir immer damit, erst einmal in die Prozedur eine Messagebox zu schreiben: msgbox "Hallo". Wenn Du die nicht siehst, dann stimmt etwas grundlegend nicht an der Makroausführung.

Lass uns das gegebenenfalls per privater Mail weiter klären. Kannst Du über meine Homepage erfahren.