ConTeXt/Publipostage XML/Jason/SQL
← Enveloppes et mise en page postale
• Page suivante →
Retour au sommaire du Wikilivre
Publipostage XML–JSON–SQL avec ConTeXt (automatisation avancée)
[modifier | modifier le wikicode]Objectifs de cette section
- comprendre comment ConTeXt (via Lua) lit des données XML, JSON ou SQL ;
- automatiser la génération de documents complexes à partir de bases externes ;
- savoir importer une base de données structurée (XML), une API ou un fichier JSON ;
- générer automatiquement pages, sections, étiquettes ou documents entiers ;
- maîtriser trois exemples complets : XML, JSON et SQL (SQLite) ;
- acquérir les bonnes pratiques pour travailler avec de grandes quantités de données.
Lorsque les données sont structurées (XML, JSON) ou hébergées dans une base SQL, ConTeXt peut utiliser Lua pour importer ces données et générer automatiquement des documents.
C’est la base de :
- catalogues automatisés,
- rapports générés depuis une base de données,
- fiches d’information,
- éditions à partir de XML TEI,
- publipostage avançé,
- flux éditoriaux professionnels (XML → PDF).
1. Pourquoi utiliser XML, JSON ou SQL ?
[modifier | modifier le wikicode]- XML
Idéal pour les données hiérarchiques : structures TEI, catalogues, notices, textes littéraires, métadonnées riches.
- JSON
Simple, léger, lisible. Parfait pour : API, exports de sites Web, listes, objets complexes.
- SQL (SQLite ou autre)
Pour les gros volumes de données : fiches clients, catalogues de milliers d’articles, inventaires.
Astuce
ConTeXt est livré avec un moteur Lua complet : vous pouvez importer presque n’importe quel format de données sans outil externe.
2. Structure recommandée d’un projet avancé
[modifier | modifier le wikicode]mon-projet/
├── donnees.xml
├── donnees.json
├── base.sqlite
├── modele.tex % modèle de page ou de chapitre
└── publication.tex % document maître
Séparer données et mise en page rend les projets robustes.
3. Exemple 1 : Publipostage XML
[modifier | modifier le wikicode]Nous utilisons un petit fichier XML :
Fichier : donnees.xml
[modifier | modifier le wikicode]<personnes>
<personne>
<nom>Marie Dupont</nom>
<adresse>12 rue des Lilas</adresse>
<ville>Paris</ville>
<codepostal>75005</codepostal>
</personne>
<personne>
<nom>Jean Martin</nom>
<adresse>5 avenue de Lyon</adresse>
<ville>Lyon</ville>
<codepostal>69002</codepostal>
</personne>
</personnes>
Fichier : publipostage-xml.tex
[modifier | modifier le wikicode]\setuppapersize[A4]
\setupbodyfont[11pt]
\startluacode
local lxp = require("lxp.lom") -- parseur XML standard
local f = io.open("donnees.xml","r")
local xml = lxp.parse(f:read("*all"))
f:close()
-- xml.personnes.personne est une liste de personnes
personnes = xml[1] -- premier nœud (<personnes>)
\stopluacode
\starttext
\startluacode
for i,personne in ipairs(personnes) do
context.startpage()
context.bold(personne.nom[1]) context.par()
context(personne.adresse[1]) context.par()
context(personne.codepostal[1] .. " " .. personne.ville[1])
context.stoppage()
end
\stopluacode
\stoptext
- Résultat : une page par entrée XML.
4. Exemple 2 : Publipostage JSON
[modifier | modifier le wikicode]Un format courant dans les API ou les exports modernes.
Fichier : donnees.json
[modifier | modifier le wikicode][
{
"nom": "Claire Moreau",
"adresse": "10 place des Arts",
"ville": "Bordeaux",
"cp": "33000"
},
{
"nom": "Léo Bernard",
"adresse": "2 rue Centrale",
"ville": "Nice",
"cp": "06000"
}
]
Fichier : publipostage-json.tex
[modifier | modifier le wikicode]\usemodule[json] % module JSON de ConTeXt (LMTX)
\setuppapersize[A4]
\startluacode
local f = io.open("donnees.json","r")
local data = utilities.json.tolua(f:read("*all"))
f:close()
\stopluacode
\starttext
\startluacode
for i,entry in ipairs(data) do
context.startpage()
context.bold(entry.nom) context.par()
context(entry.adresse) context.par()
context(entry.cp .. " " .. entry.ville)
context.stoppage()
end
\stopluacode
\stoptext
- Résultat : JSON → Lua → ConTeXt → PDF automatiquement.
5. Exemple 3 : Publipostage SQL (SQLite)
[modifier | modifier le wikicode]SQLite est un format idéal pour stocker des milliers d’entrées.
- Base de données :
base.sqlite
Elle contient, par exemple, une table :
CREATE TABLE clients (
nom TEXT,
adresse TEXT,
cp TEXT,
ville TEXT
);
- Code ConTeXt + Lua :
publipostage-sql.tex
\setuppapersize[A4]
\setupbodyfont[11pt]
\startluacode
local sqlite3 = require("lsqlite3")
local db = sqlite3.open("base.sqlite")
rows = {}
for nom, adresse, cp, ville in db:urows("SELECT nom, adresse, cp, ville FROM clients") do
rows[#rows+1] = {nom=nom, adresse=adresse, cp=cp, ville=ville}
end
db:close()
\stopluacode
\starttext
\startluacode
for i,entry in ipairs(rows) do
context.startpage()
context.bold(entry.nom) context.par()
context(entry.adresse) context.par()
context(entry.cp .. " " .. entry.ville)
context.stoppage()
end
\stopluacode
\stoptext
- Résultat : lecture SQL → génération automatique de centaines de pages.
6. Bonnes pratiques pour les données structurées
[modifier | modifier le wikicode]Astuce
- Valider les données avant importation (schéma XML, validation JSON).
- Placer les données dans un dossier séparé
data/. - Prévoir des valeurs par défaut (
entry.ville or ""). - Désactiver temporairement la justification pour les adresses :
\setupalign[flushleft].
7. Erreurs fréquentes
[modifier | modifier le wikicode]Avertissement
- XML mal formé → impossible à parser.
- JSON non valide → guillemets oubliés, virgule finale interdite.
- Problèmes d’encodage → utiliser UTF-8.
- Base SQL verrouillée → éviter d’ouvrir plusieurs fois simultanément la base.
- Fichiers trop volumineux → traiter par lots (1000 entrées à la fois).
8. Quand utiliser quel format ?
[modifier | modifier le wikicode]| Format | Avantages | Usage recommandé |
|---|---|---|
| XML | hiérarchique, normé, robuste | TEI, catalogues, notices littéraires |
| JSON | simple, API, très rapide | listes, objets, web, automatisation légère |
| SQL | millions d’entrées, requêtes | bases professionnelles, gros volumes |
← Enveloppes et mise en page postale
• Page suivante →
Retour au sommaire du Wikilivre