Aller au contenu

ConTeXt/Publipostage et étiquettes

Un livre de Wikilivres.

Publipostage et étiquettes avec ConTeXt (fusion de données)

[modifier | modifier le wikicode]

Objectifs de cette section

  • comprendre le principe du publipostage (fusion donnée + mise en page) avec ConTeXt ;
  • savoir importer une base d’adresses (CSV, TSV, texte structuré) ;
  • apprendre à générer automatiquement lettres, étiquettes, enveloppes ;
  • utiliser Lua dans ConTeXt pour automatiser la production ;
  • maîtriser les précautions indispensables (encodage, longueur des lignes, typographie) ;
  • disposer de deux exemples complets : étiquettes et lettre personnalisée.

La fusion de données (ou publipostage) consiste à combiner :

  • un fichier de données (adresses, liste de destinataires, base clients, etc.) ;
  • une mise en page ConTeXt (étiquettes, lettres, enveloppes) ;
  • un script ConTeXt+Lua qui génère automatiquement une page par entrée.

ConTeXt est particulièrement adapté à ce travail, grâce à :

  • ses capacités typographiques (marges, grilles d’étiquettes, PDF impeccable) ;
  • son moteur Lua intégré ;
  • la facilité avec laquelle on peut lire des fichiers externes.

1. Types de fichiers utilisables pour le publipostage

[modifier | modifier le wikicode]

Voici les formats les plus courants :

  • CSV (Comma-Separated Values) — le plus simple et recommandé ;
  • TSV (tabulations) — lisible, sans ambiguïté ;
  • JSON — très pratique pour les structures complexes ;
  • TXT structuré — possible mais demande plus de travail ;
  • Bases SQL — accessibles via Lua (usage avancé).

Astuce
Utilisez toujours UTF-8 pour vos fichiers de données, afin d’éviter les erreurs d’accents ou de césures.


2. Structure recommandée du projet

[modifier | modifier le wikicode]
mon-projet/
├── donnees.csv       % Fichier des adresses
├── etiquettes.tex    % Mise en page des étiquettes
├── lettre.tex        % Modèle de lettre personnalisée
└── prog.lua          % Script Lua optionnel (si on sépare le code)

Séparer **données**, **mise en page** et **code Lua** facilite la maintenance.


3. Exemple simple : générer des étiquettes d’adresses

[modifier | modifier le wikicode]

Nous allons lire un fichier CSV comme celui-ci :

Fichier : donnees.csv

[modifier | modifier le wikicode]
Nom,Adresse,CPVille
Marie Dupont,12 rue des Lilas,75005 Paris
Jean Martin,5 avenue de Lyon,69002 Lyon
Claire Moreau,10 place des Arts,33000 Bordeaux

Ce fichier comporte trois colonnes, séparées par des virgules.


Mise en page : etiquettes.tex

[modifier | modifier le wikicode]

Cette mise en page crée une grille de 3 colonnes × 8 rangées, classique pour des planches Avery.

\setuppapersize[A4]
\setuplayout[tight]

\setuplayout[grid=yes] % active les repères (à commenter pour la version finale)

% Taille des étiquettes
\definecollector[etiquette][
  width=65mm,
  height=35mm,
]

% JSON produit par Lua
\startluacode
function lire_csv()
  local fichier = io.open("donnees.csv","r")
  local lignes = {}
  for ligne in fichier:lines() do
    local nom, adr, cpville = string.match(ligne,"([^,]+),([^,]+),(.+)")
    if nom ~= "Nom" then -- ignorer l’en-tête
      lignes[#lignes+1] = { nom=nom, adr=adr, cpville=cpville }
    end
  end
  fichier:close()
  return lignes
end

donnees = lire_csv()
\stopluacode

\starttext

\startcolumns[n=3,balance=no]

\startluacode
for i, d in ipairs(donnees) do
  context.startcollector("etiquette")
  context(d.nom) context.par()
  context(d.adr) context.par()
  context(d.cpville)
  context.stopcollector()
  context.collector("etiquette")
end
\stopluacode

\stopcolumns

\stoptext

Résultat : une planche entière d’étiquettes prêtes à imprimer.


4. Exemple avancé : lettre personnalisée générée automatiquement

[modifier | modifier le wikicode]

Cet exemple montre comment produire une lettre par destinataire, avec :

  • prénom / nom inséré automatiquement ;
  • adresse en haut à droite ;
  • date dynamique ;
  • mise en page complète.

Nous réutilisons le même fichier donnees.csv.

Fichier : lettre.tex

[modifier | modifier le wikicode]
\setuplanguage[fr]
\mainlanguage[fr]

\setuppapersize[A4]
\setuplayout[
  backspace=25mm,
  topspace=20mm,
  cutspace=25mm,
]

\setupbodyfont[11pt]

\startluacode
function lire_csv()
  local fichier = io.open("donnees.csv","r")
  local lignes = {}
  for ligne in fichier:lines() do
    local nom, adr, cpville = string.match(ligne,"([^,]+),([^,]+),(.+)")
    if nom ~= "Nom" then
      lignes[#lignes+1] = { nom=nom, adr=adr, cpville=cpville }
    end
  end
  fichier:close()
  return lignes
end

donnees = lire_csv()
\stopluacode

\starttext

\startluacode
for i, d in ipairs(donnees) do
  context.startpage()

  context.rightaligned(d.nom)
  context.rightaligned(d.adr)
  context.rightaligned(d.cpville)

  context.blank("big")

  context("Paris, le ") context(os.date("%d/%m/%Y"))
  context.par()

  context.blank("big")

  context.bf("Objet : Confirmation d'inscription")
  context.par()

  context("Madame, Monsieur,")
  context.par()
  context("Nous confirmons l’enregistrement de votre dossier. ") 
  context("Nous restons à votre disposition pour toute information complémentaire.")
  context.par()

  context("Veuillez agréer, Madame, Monsieur, l’expression de nos salutations distinguées.")
  context.par()

  context.blank("big")
  context("Signature")

  context.stoppage()
end
\stopluacode

\stoptext

Résultat : Un PDF où chaque page est une lettre personnalisée.


5. Précautions indispensables

[modifier | modifier le wikicode]

Avertissement : erreurs fréquentes

  • Encodage incorrect → utiliser UTF-8 sans BOM.
  • Ligne CSV trop longue → prévoir des césures manuelles si nécessaire.
  • Colonnes contenant des virgules → utiliser des guillemets dans le CSV.
  • Colonnes vides → protéger avec or "" dans Lua.
  • Accès au fichier → le .tex doit être dans le même dossier que le CSV.

6. Bonnes pratiques pour réussir un publipostage

[modifier | modifier le wikicode]
  • Toujours commencer par un MWE avant un projet complexe.
  • Préparer les données **avant** de travailler la mise en page.
  • Valider le PDF avec une impression test.
  • Pour les planches d’étiquettes :
 utiliser un papier brouillon avant la planche définitive.
  • Ajouter une grille (\showframe ou grid=yes) pendant les tests.
  • Séparer le code Lua dans un fichier externe si le projet grossit.

Astuce avancée
Pour les projets professionnels, vous pouvez générer des codes-barres ou QR-codes dans les étiquettes grâce à MetaPost ou Lua.