Startseite
» MS OFFICE
»
So erstellen Sie einen automatisierten Serienbrief mit Bildern in LibreOffice Writer
So erstellen Sie einen automatisierten Serienbrief mit Bildern in LibreOffice Writer
Sie können in LibreOffice Writer problemlos einen Serienbrief für Namen, Adressen, Datum und andere Textfelder erstellen. Sobald jedoch jeder Empfänger ein anderes Foto, eine andere Unterschrift, ein anderes Produktbild, einen anderen QR-Code oder ein anderes Abzeichen benötigt, wird der einfache Workflow kompliziert. Der Grund dafür ist wichtig: Die dokumentierten Serienbrieffelder in Writer sind Datenbankfelder, die als Textplatzhalter verwendet werden. LibreOffice unterstützt zwar auch eingebettete und verknüpfte Grafiken, die aktuelle Hilfe dokumentiert jedoch kein natives „Serienbrief-Bildfeld“, das automatisch ein Bild aus einer Dateipfadspalte für jeden Datensatz ersetzt.
Damit bleiben zwei praktische Möglichkeiten. Wenn alle zusammengeführten Dokumente dasselbe Logo oder Hintergrundbild verwenden, nutzen Sie die normale Serienbrieffunktion von Writer und fixieren Sie das Bild in der Vorlage. Muss sich das Bild für jede Zeile ändern, ist es ratsamer, die Text- und Bilddaten in Calc zu speichern, ein benanntes Grafikobjekt in der Writer-Vorlage zu reservieren und den Seriendruck mit einem LibreOffice Basic-Makro zu automatisieren. Diese Anleitung beschreibt die zweite Vorgehensweise.
Die Anweisungen orientieren sich an der LibreOffice 26.2-Dokumentation (verfügbar ab 2026). Menüs können in anderen Versionen oder unter macOS geringfügig abweichen. Laut der aktuellen Writer-Anleitung von LibreOffice lassen sich Bilder einbetten oder verlinken. Die UNO-API stellt Writer-Grafikobjekte bereit XTextGraphicObjectsSupplierund ermöglicht die automatisierte Einbindung von Grafiken über externe URLs. Dadurch ist ein Workflow mit Bildern pro Datensatz möglich, obwohl der Standard-Serienbriefassistent kein separates Bildfeld dafür bereitstellt.
Wählen Sie den richtigen Arbeitsablauf, bevor Sie beginnen.
Erfordernis
Beste Vorgehensweise
Hauptabwägung
Auf jedem Buchstaben das gleiche Logo oder Foto.
Standard Writer Serienbrief
Simpel, aber das Bild ändert sich durch die Aufzeichnung nie.
Für jeden Empfänger ein anderes Bild
Writer-Vorlage + Calc + Basic/UNO-Automatisierung
Mehr Aufwand beim Einrichten, aber vorhersehbare Kontrolle über das Bild.
Die Datenbank speichert das Bild selbst und nicht einen Pfad.
Datenbank-/Formular-Workflow oder benutzerdefinierter UNO-Code
Besser geeignet für verwaltete Datenbanken, aber ressourcenintensiver als eine tabellenkalkulationsbasierte Zusammenführung.
Hunderte oder Tausende von Dokumenten in unbeaufsichtigten Stapeln
Makro oder externes UNO-Skript
Erfordert Tests, Protokollierung und die Einhaltung der Dateipfadrichtlinien.
Wenn Sie lediglich ein festes Firmenlogo verwenden möchten, können Sie hier aufhören und den normalen Workflow für LibreOffice-Formularbriefe nutzen . Der Rest dieses Artikels behandelt variable Bilder.
Schritt 1: Bereiten Sie eine saubere Calc-Datenquelle vor
Erstellen Sie ein Calc-Arbeitsblatt mit einer Kopfzeile und einem Datensatz pro Zeile. Bildreferenzen sollten in einer eigenen Spalte gespeichert werden. Ein praktisches Layout sieht folgendermaßen aus CustomerID: , FirstName, LastName, Email, ImagePath, und OutputName.
Bitte verwenden Sie pro Zeile einen Bildpfad und einen Ausgabedateinamen, damit die Automatisierung jeden Datensatz ohne Rätselraten auflösen kann.
Verwenden Sie beim Erstellen und Testen des Merges absolute Pfade. Diese sind zwar weniger portabel, beseitigen aber Mehrdeutigkeiten. Beispielsweise ist die Diagnose C:\MailMerge\Imageslice.jpgunter Windows oder /home/user/mailmerge/images/alice.jpgLinux einfacher als bei einem relativen Pfad, dessen Basisverzeichnis sich je nach Art des Öffnens des Dokuments ändert.
Verwenden Sie in derselben Produktionsdatei keine gemischten Pfadformate aus Windows und Linux. Die Beispiele in der Abbildung zeigen lediglich den Datentyp der Spalte. Ihre eigentliche Datenquelle sollte Pfade verwenden, die auf dem Rechner, auf dem die Zusammenführung ausgeführt wird, gültig sind.
Eine gut OutputNamestrukturierte Spalte verhindert zudem Dateinamenskonflikte. Verwenden Sie lieber eine eindeutige ID oder einen anonymisierten Namen anstelle einer E-Mail-Adresse oder eines beliebigen Freitexts. Falls derselbe Wert zweimal vorkommt, legen Sie im Voraus fest, ob das Makro den vorhandenen Wert überschreiben, ein Suffix anhängen oder fehlschlagen soll.
Schritt 2: Bestätigen Sie, dass Writer die Datensätze lesen kann.
Die Standard-Serienbrieffunktion von Writer verwendet eine registrierte Datenquelle. Sie können den Serienbrief-Assistenten, eine Adressdatenquelle oder den Datenquellen-Browser verwenden. Die aktuelle LibreOffice-Hilfe beschreibt den Serienbrief- Assistenten unter „Extras > Serienbrief-Assistent“ und ermöglicht das Einfügen von Datenbankfeldern über „Einfügen > Feld > Weitere Felder > Datenbank“ . Weitere Informationen finden Sie in der offiziellen Referenz zu Datenbankfeldern .
Verwenden Sie die Datenquellenansicht von Writer, um zu überprüfen, ob die erwarteten Spalten und Datensätze sichtbar sind, bevor Sie die Bildautomatisierung hinzufügen.
Diese Prüfung ist auch dann nützlich, wenn das endgültige Makro die Tabelle direkt einliest. Sie erkennt häufige Probleme frühzeitig: das falsche Tabellenblatt, unerwartete Spaltenüberschriften, leere Datensätze oder eine Tabelle, die nach der Registrierung verschoben wurde.
Für den reinen Textseriendruck können Sie eine Spaltenüberschrift in das Dokument ziehen oder ein Seriendruckfeld über die Registerkarte „Datenbank“ einfügen. Die offizielle Writer-Hilfe bestätigt, dass diese Felder beim Seriendruck durch Datenbankinhalte ersetzt werden. Bei variablen Bildern sollten Sie jedoch nicht davon ausgehen, dass das Ziehen ImagePathin das Dokument den Pfad in ein Bild umwandelt. Es handelt sich um Daten, solange sie nicht vom Code interpretiert und ein Grafikobjekt aktualisiert wird.
Schritt 3: Erstellen Sie die Writer-Vorlage und benennen Sie den Bildplatzhalter.
Erstellen Sie das Layout für Brief, Zertifikat, Abzeichen oder Bericht in Writer. Verwenden Sie für die Textwerte entweder normale Serienbrieffelder oder eindeutige Platzhalter wie Komma {FirstName}, {LastName}Komma und Leerzeichen {CustomerID}, falls Ihr Makro diese automatisch ersetzt.
Fügen Sie als Nächstes ein Beispielbild an der Stelle ein, an der das variable Bild erscheinen soll. Legen Sie vor der Automatisierung die gewünschte Größe, den Zeilenumbruch und die Verankerung fest. LibreOffice dokumentiert Bildgrößen, Positionierung, Verankerung, Zeilenumbruch und das Verhalten verknüpfter Bilder im Kapitel „Bilder und Grafiken“ (Writer 26.2) .
Reservieren Sie die endgültige Bildposition in der Vorlage und geben Sie dem Grafikobjekt einen festen Namen, z. B. MergeImage.
Geben Sie dem Grafikobjekt einen eindeutigen Namen, z. B. „Grafikobjekt“ MergeImage. Der genaue Eigenschaftendialog kann je nach Version variieren. Wenn Sie sich nicht sicher sind, welches Objekt Writer bereitstellt, verwenden Sie „Tools > Entwicklungstools“ . Die Entwicklungstools von LibreOffice können Grafikobjekte, Eigenschaften, Methoden und Schnittstellen im aktuellen Dokument untersuchen. Dadurch sind sie ein zuverlässigeres Diagnosewerkzeug als das Erraten eines internen Objektnamens.
Für ein einheitliches Layout sollten Sie für alle Quellbilder dasselbe Seitenverhältnis verwenden oder festlegen, wie diese zugeschnitten werden sollen. Writer kann Grafiken zwar an die Abmessungen des Platzhalters anpassen, aber ein Porträtfoto, das in einen breiten, bannerförmigen Rahmen eingefügt wird, sieht trotzdem falsch aus, solange Sie die Dateien nicht vorher normalisieren.
Schritt 4: Automatisieren Sie den Export von variablen Bildern und Dokumenten.
Die wichtigste Automatisierungsoperation ist einfach: Vorlage öffnen, Textplatzhalter ersetzen, das benannte Grafikobjekt suchen, die Bilddatei der Zeile in dieses Objekt laden und das Ergebnis exportieren. Die UNO-API von LibreOffice dokumentiert getGraphicObjects()den Zugriff auf eingebettete und verknüpfte Grafiken sowie den TextGraphicObjectDienst für Grafikeigenschaften. Die GraphicURLEigenschaft ist für die allgemeine Objektspeicherung zugunsten von veraltet Graphic, aber die aktuelle API weist explizit darauf hin, dass das Festlegen einer externen URL das Bild in das Grafikobjekt lädt. Dies ist praktisch für ein einfaches Basic-Makro, das lokale Dateipfade verwendet.
Die Automatisierungsschicht wandelt einen ImagePath-Wert in die tatsächliche Grafik um, die in jedem generierten Dokument angezeigt wird.
Das folgende Beispiel ist bewusst klein gehalten. Passen Sie die drei Pfade, den Tabellennamen, die Spaltenindizes und die Platzhalternamen an Ihre eigenen Dateien an. Testen Sie es zunächst mit zwei Datensätzen, bevor Sie eine größere Menge verarbeiten.
Sub MailMergeWithImages()
Dim calcDoc As Object, sheet As Object, doc As Object
Dim graphics As Object, imageObj As Object
Dim row As Long
Dim firstName As String, lastName As String
Dim imagePath As String, outputName As String
Dim sourceURL As String, templateURL As String, outputDir As String
sourceURL = ConvertToURL("C:\MailMerge\customers.ods")
templateURL = ConvertToURL("C:\MailMerge\LetterTemplate.odt")
outputDir = ConvertToURL("C:\MailMerge\Output")
calcDoc = StarDesktop.loadComponentFromURL(sourceURL, "_blank", 0, Array())
sheet = calcDoc.Sheets.getByName("Sheet1")
row = 1 ' row 0 contains headers
Do While sheet.getCellByPosition(0, row).String <> ""
firstName = sheet.getCellByPosition(1, row).String
lastName = sheet.getCellByPosition(2, row).String
imagePath = sheet.getCellByPosition(4, row).String
outputName = sheet.getCellByPosition(5, row).String
doc = StarDesktop.loadComponentFromURL(templateURL, "_blank", 0, Array())
ReplaceAll doc, "{FirstName}", firstName
ReplaceAll doc, "{LastName}", lastName
graphics = doc.getGraphicObjects()
If graphics.hasByName("MergeImage") Then
imageObj = graphics.getByName("MergeImage")
imageObj.GraphicURL = ConvertToURL(imagePath)
Else
MsgBox "Graphic object MergeImage was not found."
doc.close(True)
Exit Sub
End If
Dim args(1) As New com.sun.star.beans.PropertyValue
args(0).Name = "FilterName"
args(0).Value = "writer_pdf_Export"
args(1).Name = "Overwrite"
args(1).Value = True
doc.storeToURL(outputDir & outputName & ".pdf", args())
doc.close(True)
row = row + 1
Loop
calcDoc.close(True)
End Sub
Sub ReplaceAll(doc As Object, findText As String, replacement As String)
Dim d As Object
d = doc.createReplaceDescriptor()
d.SearchString = findText
d.ReplaceString = replacement
doc.replaceAll(d)
End Sub
Dieses Makro ist ein Muster, kein universell einsetzbares Programm. LibreOffice-Installationen können unterschiedliche Sicherheitsrichtlinien für Makros, Pfadregeln des Betriebssystems und Vorlagenlayouts aufweisen. Die wichtigsten verifizierten API-Konzepte sind, dass Writer seine Grafikobjektsammlung bereitstellt und LibreOffice Grafiken von einer externen URL laden kann. Bei größeren Installationen empfiehlt es sich, Grafiken über die moderne API zu laden, anstatt Graphicsich auf das Kompatibilitätsverhalten von XTextGraphicObjectsSupplier und TextGraphicObject zu verlassen .GraphicURL
Schritt 5: Führen Sie eine kleine Charge durch und überprüfen Sie das Ergebnis.
Bevor Sie die gesamte Datenquelle verarbeiten, führen Sie zwei oder drei bewusst unterschiedliche Zeilen aus: eine JPG-Datei, eine PNG-Datei und idealerweise ein Bild mit einem anderen Seitenverhältnis. Stellen Sie vor der Skalierung sicher, dass Folgendes stimmt:
Der Empfängername im Dokument stimmt mit dem Bild aus derselben Tabellenzeile überein.
Im endgültigen Dokument wird kein Bildpfad als Text angezeigt.
Der Ausgabedateiname entspricht dem gewünschten Datensatz und überschreibt keinen anderen Empfänger.
Das Bild passt in den reservierten Bereich, ohne dass Text auf eine neue Seite verschoben oder ein anderes Objekt verdeckt wird.
Die generierte PDF- oder ODT-Datei öffnet sich unabhängig, nachdem LibreOffice und Calc geschlossen wurden.
Diese letzte Prüfung ist wichtig, da verknüpfte und eingebettete Grafiken sich unterschiedlich verhalten. Im aktuellen Writer-Handbuch wird erläutert, dass ein verknüpftes Bild eine separate Dateireferenz bleibt, während ein eingebettetes Bild Teil des Dokuments wird. Wenn Sie ODT-Dateien an einen anderen Rechner senden, stellen Sie sicher, dass das Ergebnis nicht von einem lokalen Pfad abhängt, der nur auf dem Rechner existiert, der die Zusammenführung durchgeführt hat.
Häufige Fehler und die schnellste Lösung
Die Ausgabe zeigt den Dateipfad anstelle des Bildes an.
Sie haben es ImagePathals normales Serienbrieffeld eingefügt. Dadurch wird erwartungsgemäß Text erzeugt. Behalten Sie den Pfad in der Datenquelle bei, lassen Sie das Makro die Daten aber in das benannte Grafikobjekt laden.
Jeder Datensatz erhält dasselbe Bild
Das Vorlagenbild wurde zwischen den Datensätzen nicht geändert, oder Ihre Schleife liest eine feste Zelle. Protokollieren Sie die Zeilennummer ImagePathwährend eines Tests mit zwei Datensätzen. Wenn sich der Pfad ändert, das Bild aber nicht, überprüfen Sie den Namen des Grafikobjekts mit den Entwicklertools.
Die Makro-Meldung besagt, dass MergeImage nicht existiert.
Die Grafik wurde umbenannt, ersetzt oder wird nicht unter dem erwarteten Namen angezeigt. Wählen Sie das Bild aus und untersuchen Sie es mit „Tools > Entwicklungstools“ . Die UNO-API stellt Grafikobjekte anhand ihres Namens bereit, daher müssen Makro und Vorlage exakt übereinstimmen.
Auf einem anderen Computer verschwinden die Bilder.
Sie haben wahrscheinlich ein Dokument gespeichert, das noch auf externe Dateien verweist. Wenn Ihnen die Portabilität wichtig ist, stellen Sie sicher, dass das generierte Dokument das Bild einbettet oder exportieren Sie es nach dem Laden des Bildes als PDF. Der Bildleitfaden von LibreOffice erklärt den Unterschied zwischen verknüpften und eingebetteten Grafiken und wie Verknüpfungen aufgehoben werden können, um Dateien einzubetten.
Beim HTML-Serienbrief gehen Bilder verloren
Dies ist eine bekannte Einschränkung, die Sie vor der Auswahl des E-Mail-Ausgabeformats prüfen sollten. Die LibreOffice-Hilfe weist darauf hin, dass beim Versenden eines Serienbriefs im HTML-Format eingebettete oder verlinkte Bilder nicht mit der E-Mail versendet werden. Ist das Bild unerlässlich, verwenden Sie einen PDF-Anhang oder testen Sie einen anderen Zustellungsablauf, anstatt davon auszugehen, dass der HTML-Serienbrief das Bild beibehält. Siehe „ Erstellen eines Serienbriefs“ .
Wann sollte man stattdessen den MailMerge-UNO-Dienst von LibreOffice verwenden?
Wenn Ihre Textfelder bereits die native Datenbank-Serienbrieffunktion von Writer verwenden und Sie die Ausgabe programmatisch steuern möchten, bietet LibreOffice einen entsprechenden MailMergeDienst an. Zu dessen dokumentierten Eigenschaften gehören unter anderem DataSourceName`<properties>`, Command` DocumentURL<properties> `, OutputURL`<properties>` FileNameFromColumn, `<properties>` und ` SaveAsSingleFile<properties>`. Diese API ist nützlich, wenn Sie den Standard-Serienbriefversand per Code automatisieren möchten. Sie dokumentiert jedoch kein Feld für den Bilddateipfad pro Datensatz, sodass Sie die Serienbriefausführung möglicherweise mit der Verarbeitung von Grafikobjekten kombinieren müssen. Weitere Informationen finden Sie in der offiziellen Referenz zum MailMerge-Dienst .
Abschließende Checkliste
Verwenden Sie die normale Writer-Serienbrieffunktion, wenn das Bild für jeden Empfänger festgelegt ist.
Verwenden Sie eine leere ImagePathSpalte, wenn das Bild je nach Datensatz variiert.
Benennen Sie den Platzhalter für die Schriftstellergrafik und behalten Sie dessen Abmessungen bei.
Den Bildpfad in der Automatisierung auflösen; erwarten Sie nicht, dass ein Text-Serienbildfeld automatisch in ein Bild umgewandelt wird.
Testen Sie zwei oder drei Datensätze, bevor Sie einen kompletten Batch ausführen.
Öffnen Sie die exportierten Dateien, nachdem Sie die Quelldokumente geschlossen haben, um zu beweisen, dass die Ausgabe in sich abgeschlossen ist.
Für die meisten kleinen und mittleren Aufträge bietet eine Calc-Tabelle in Kombination mit einer Writer-Vorlage und einem kurzen Basic-Makro die beste Balance zwischen Transparenz und Kontrolle. Die Einrichtung ist zwar etwas aufwendiger als bei einem herkömmlichen Serienbrief, aber Sie sehen genau, welche Zeile welches Bild enthält, können den Ausgabedateinamen festlegen und das Ergebnis vor dem Versenden hunderter personalisierter Dateien überprüfen.