Accueil
» BUREAU MS
»
Comment créer un publipostage automatisé avec images dans LibreOffice Writer
Comment créer un publipostage automatisé avec images dans LibreOffice Writer
Vous pouvez créer un publipostage parfaitement fonctionnel dans LibreOffice Writer pour les noms, adresses, dates et autres champs texte, puis vous rendre compte que dès que chaque destinataire a besoin d'une photo, d'une signature, d'une image de produit, d'un code QR ou d'un badge différent, le flux de travail, pourtant simple en apparence, se complique. La raison est importante : les champs de publipostage documentés dans Writer sont des champs de base de données utilisés comme espaces réservés pour le texte. LibreOffice prend également en charge les images incorporées et liées, mais son aide actuelle ne mentionne pas de « champ image de publipostage » natif qui remplacerait automatiquement une image provenant d'une colonne de chemin de fichier pour chaque enregistrement.
Deux options pratiques s'offrent alors à vous. Si chaque document fusionné utilise le même logo ou la même image de fond, utilisez la fonction de publipostage standard de Writer et conservez cette image fixe dans le modèle. Si l'image doit changer pour chaque ligne, la solution la plus simple consiste à conserver les données de texte et d'image dans Calc, à réserver un objet graphique nommé dans le modèle Writer et à automatiser la fusion à l'aide d'une macro LibreOffice Basic. Ce guide privilégie cette seconde approche.
Ces instructions sont conformes à la documentation de LibreOffice 26.2, disponible en 2026. Les menus peuvent légèrement différer dans d'autres versions ou sur macOS. Le guide actuel de LibreOffice Writer indique que les images peuvent être incorporées ou liées, tandis que l'API UNO expose les objets graphiques de Writer XTextGraphicObjectsSupplieret permet l'automatisation de l'insertion d'une image à partir d'une URL externe. Ces éléments rendent possible l'insertion d'images par enregistrement, même si l'Assistant Fusion et publipostage standard ne propose pas de champ image dédié.
Choisissez le flux de travail approprié avant de commencer.
Exigence
Meilleure approche
Compromis principal
Même logo ou photo sur chaque lettre
Fusion et publipostage avec Standard Writer
Simple, mais l'image ne change jamais d'un enregistrement à l'autre
Une image différente pour chaque destinataire
Modèle Writer + Calc + Automatisation Basic/UNO
Configuration plus complexe, mais contrôle prévisible de l'image
La base de données stocke l'image elle-même plutôt qu'un chemin d'accès.
Flux de travail de base de données/formulaire ou code UNO personnalisé
Plus adapté aux bases de données gérées, mais plus lourd qu'une fusion basée sur une feuille de calcul.
Des centaines, voire des milliers de documents dans des lots non surveillés
Macro ou script UNO externe
Nécessite des tests, une journalisation et une gestion rigoureuse des chemins d'accès aux fichiers.
Étape 1 : Préparer une source de données Calc propre
Créez une feuille Calc avec une ligne d'en-tête et une entrée par ligne. Placez les références d'images dans une colonne dédiée. Une mise en page pratique estCustomerID : , FirstName, LastName, Email, ImagePath, et OutputName.
Conservez un chemin d'accès à l'image et un nom de fichier de sortie par ligne afin que l'automatisation puisse résoudre chaque enregistrement sans deviner.
Utilisez des chemins absolus lors de la création et du test de la fusion. Ils sont moins portables, mais ils éliminent toute ambiguïté. Par exemple, C:\MailMerge\Imageslice.jpgsous Windows ou /home/user/mailmerge/images/alice.jpgLinux, il est plus facile de diagnostiquer un problème qu'avec un chemin relatif dont le répertoire de base varie selon la façon dont le document a été ouvert.
N’utilisez pas simultanément les formats de chemin Windows et Linux dans un même fichier de production. Les exemples présentés dans l’illustration montrent simplement le type de valeur que contient la colonne. Votre source de données réelle doit utiliser des chemins valides sur la machine qui exécute la fusion.
Une OutputNamecolonne bien conçue permet également d'éviter les conflits de noms de fichiers. Privilégiez un identifiant stable ou un nom nettoyé plutôt qu'une adresse e-mail ou du texte libre. Si la même valeur apparaît deux fois, déterminez à l'avance si la macro doit écraser la valeur existante, ajouter un suffixe ou échouer.
Étape 2 : Vérifier que Writer peut lire les enregistrements
La fonction de publipostage standard de Writer utilise une source de données enregistrée. Vous pouvez utiliser l'Assistant Fusion et publipostage, une source de données d'adresses ou l'explorateur de sources de données. La documentation d'aide de LibreOffice ( Outils > Assistant Fusion et publipostage ) permet également d'insérer des champs de base de données via Insertion > Champ > Autres champs > Base de données . Consultez la documentation officielle sur les champs de base de données .
Utilisez la vue de source de données de Writer pour vérifier que les colonnes et les enregistrements attendus sont visibles avant d'ajouter l'automatisation des images.
Cette vérification est utile même si la macro finale lit directement la feuille de calcul. Elle permet de détecter rapidement les problèmes courants : feuille incorrecte, noms d’en-tête inattendus, enregistrements vides ou feuille de calcul déplacée après l’enregistrement.
Pour un publipostage classique (texte uniquement), vous pouvez glisser-déposer un en-tête de colonne dans le document ou insérer un champ de publipostage depuis l'onglet Base de données. L'aide officielle de Writer confirme que ces champs sont remplacés par le contenu de la base de données lors de la fusion. En revanche, pour les images variables, ne considérez pas que le simple fait de glisser- ImagePathdéposer le chemin d'accès dans la page le transformera en image. Il restera une donnée tant que le code ne l'aura pas interprétée et mise à jour en un objet graphique.
Étape 3 : Créez le modèle Writer et nommez l’espace réservé à l’image.
Créez la mise en page de la lettre, du certificat, du badge ou du rapport dans Writer. Pour les valeurs de texte, utilisez soit les champs de fusion et publipostage classiques, soit des caractères distinctifs tels que {FirstName}, {LastName}, et {CustomerID}si votre macro les remplace automatiquement.
Insérez ensuite une image d'exemple à l'endroit où l'image variable doit apparaître. Définissez la taille, le retour à la ligne et l'ancrage souhaités avant d'automatiser le processus. LibreOffice documente le dimensionnement, le positionnement, l'ancrage, le retour à la ligne et le comportement des images liées dans le chapitre « Images et graphiques » de Writer 26.2 .
Réservez la position finale de l'image dans le modèle et donnez à l'objet graphique un nom stable tel que MergeImage.
Attribuez un nom stable à l'objet graphique, par exemple « Graphic » MergeImage. La boîte de dialogue des propriétés peut varier selon la version ; en cas de doute sur l'objet exposé par Writer, utilisez Outils > Outils de développement . Les outils de développement de LibreOffice permettent d'inspecter les objets graphiques, leurs propriétés, leurs méthodes et leurs interfaces dans le document courant. Ils constituent ainsi un outil de diagnostic plus fiable que de deviner le nom interne d'un objet.
Pour une mise en page harmonieuse, utilisez le même format pour toutes les images sources ou définissez le recadrage souhaité. Writer peut redimensionner une image aux dimensions de l'espace réservé, mais une photo portrait insérée dans un cadre large en forme de bannière aura toujours un aspect incorrect si vous ne normalisez pas les fichiers au préalable.
Étape 4 : Automatiser l’exportation des images et documents variables
L'opération d'automatisation principale est simple : ouvrir le modèle, remplacer les espaces réservés au texte, trouver l'objet graphique nommé, charger le fichier image de la ligne dans cet objet, puis exporter le résultat. La documentation de l'API UNO de LibreOffice getGraphicObjects()explique comment accéder aux graphiques incorporés et liés, ainsi qu'au TextGraphicObjectservice de gestion des propriétés graphiques. Bien que la GraphicURLpropriété soit obsolète pour le stockage général des objets et remplacée par une autre Graphic, l'API actuelle indique explicitement que la définition d'une URL externe charge cette image dans l'objet graphique. Cela facilite l'utilisation d'une macro Basic simple avec des chemins de fichiers locaux.
La couche d'automatisation est ce qui convertit une valeur ImagePath en l'image réelle affichée dans chaque document généré.
L'exemple suivant est volontairement réduit. Modifiez les trois chemins d'accès, le nom de la feuille, les index de colonnes et les noms des espaces réservés pour qu'ils correspondent à vos propres fichiers. Testez-le sur deux enregistrements avant d'exécuter un traitement par lots plus important.
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
Cette macro est un modèle, et non un programme universel prêt à l'emploi. Les installations de LibreOffice peuvent avoir des politiques de sécurité des macros, des règles de chemin d'accès au système d'exploitation et des mises en page de modèles différentes. Les concepts d'API importants et vérifiés sont que Writer expose sa collection d'objets graphiques et que LibreOffice peut définir une image à partir d'une URL externe. Pour les déploiements plus importants, il est recommandé de charger l'image via l' GraphicAPI moderne plutôt que de se fier au comportement de compatibilité GraphicURL. Les références officielles sont XTextGraphicObjectsSupplier et TextGraphicObject .
Étape 5 : Effectuez un test sur un petit lot et vérifiez le résultat.
Avant de traiter l'intégralité de la source de données, effectuez un traitement sur deux ou trois lignes délibérément différentes : une image JPG, une image PNG et, idéalement, une image avec un format différent. Vérifiez les points suivants avant d'effectuer un agrandissement :
Le nom du destinataire dans le document correspond à l'image de la même ligne du tableau.
Aucun chemin d'accès à l'image n'est affiché littéralement dans le document final.
Le nom du fichier de sortie correspond à l'enregistrement prévu et n'écrase pas un autre fichier destiné à un autre destinataire.
L'image s'adapte à la zone réservée sans repousser le texte sur une nouvelle page ni recouvrir un autre objet.
Le fichier PDF ou ODT généré s'ouvre indépendamment après la fermeture de LibreOffice et de Calc.
Cette dernière vérification est importante car les images liées et les images incorporées se comportent différemment. Le guide actuel de Writer explique qu'une image liée reste une référence de fichier distincte, tandis qu'une image incorporée fait partie intégrante du document. Si vous transférez des fichiers ODT vers un autre ordinateur, vérifiez que le résultat ne dépend pas d'un chemin d'accès local existant uniquement sur l'ordinateur ayant effectué la fusion.
Pannes courantes et solution la plus rapide
Le résultat affiche le chemin du fichier au lieu de l'image.
Vous avez inséré ImagePathun champ de fusion classique. Le résultat attendu est du texte. Conservez le chemin d'accès dans la source de données, mais laissez la macro le charger dans l'objet graphique nommé.
Chaque disque reçoit la même image
L'image du modèle n'a jamais été modifiée entre les enregistrements, ou votre boucle lit une cellule fixe. Enregistrez le numéro de ligne ImagePathlors d'un test sur deux enregistrements. Si le chemin change mais pas l'image, examinez le nom de l'objet graphique avec les outils de développement.
La macro indique que MergeImage n'existe pas.
L'élément graphique a été renommé, remplacé ou n'est pas accessible sous le nom attendu. Sélectionnez l'image et examinez-la via Outils > Outils de développement . L'API UNO expose les objets graphiques par leur nom ; la macro et le modèle doivent donc correspondre exactement.
Les images disparaissent sur un autre ordinateur
Vous avez probablement enregistré un document qui fait encore référence à des fichiers externes. Si la portabilité est importante, assurez-vous que le document généré intègre l'image ou exportez-le au format PDF après le chargement de l'image. Le guide des images de LibreOffice explique la différence entre les images liées et les images incorporées, et comment rompre les liens pour incorporer des fichiers.
La fusion de courrier HTML entraîne la perte d'images
Il s'agit d'une limitation connue qu'il convient de vérifier avant de choisir le mode d'envoi par courriel. L'aide de LibreOffice indique que lorsqu'une lettre type est au format HTML, les images intégrées ou liées ne sont pas envoyées avec le courriel. Si l'image est indispensable, utilisez une pièce jointe PDF ou testez un autre mode d'envoi plutôt que de supposer que le publipostage HTML la conservera. Voir Création d'une lettre type .
Quand utiliser plutôt le service MailMerge UNO de LibreOffice
Si vos champs de texte utilisent déjà la fonction de publipostage native de Writer et que vous avez besoin d'un contrôle programmatique sur le résultat, LibreOffice propose également un MailMergeservice. Ses propriétés documentées incluentDataSourceName : ` <img>` Command, ` <img>`, ` DocumentURL<img> OutputURL`, FileNameFromColumn`<img>`, `<img>` et ` SaveAsSingleFile<img>`. Cette API est utile pour automatiser le publipostage standard par programmation. Cependant, elle ne documente pas, de manière autonome, le champ de chemin d'accès aux fichiers image par enregistrement ; vous devrez donc peut-être combiner l'exécution du publipostage avec la gestion des objets graphiques. Consultez la documentation officielle du service MailMerge .
Liste de vérification finale
Utilisez la fonction de publipostage standard de Writer lorsque l'image est fixe pour chaque destinataire.
Utilisez une seule ImagePathcolonne vierge lorsque l'image varie selon l'enregistrement.
Nommez l'élément graphique de remplacement « Writer » et veillez à ce que ses dimensions restent stables.
Résolvez le chemin d'accès à l'image automatiquement ; ne vous attendez pas à ce qu'un champ de fusion de texte se transforme automatiquement en image.
Testez deux ou trois enregistrements avant de lancer un traitement par lots complet.
Ouvrez les fichiers exportés après avoir fermé les documents sources pour vérifier que le résultat est autonome.
Pour la plupart des petits et moyens travaux, une feuille de calcul Calc, un modèle Writer et une courte macro Basic offrent le meilleur compromis entre transparence et contrôle. La configuration est plus poussée qu'avec un publipostage classique, mais vous pouvez identifier précisément la ligne correspondant à chaque image, choisir le nom du fichier de sortie et valider le résultat avant d'envoyer des centaines de fichiers personnalisés.