Localiser un PDF infographique (préservation des illustrations)
Produire une version traduite d'un PDF de conception qui a exactement la même apparence que l'original, à ceci près que chaque morceau de texte courant est remplacé par la langue cible. Fonctionne en rattachant la page, en effaçant le texte source, et en recomposant la traduction aux mêmes coordonnées — l'illustration (photos, diagrammes, dégradés, icônes, logos) n'est jamais regénérée.
Pourquoi ce pipeline (à lire en premier)
Les PDF exportés depuis des logiciels de design stockent généralement le texte visible sous forme de contours vectoriels (texte converti en courbes) ou de glyphes Type3 — ce n'est PAS du texte éditable, et il n'existe pas de moyen propre de « remplacer le texte ». Mais ces PDF contiennent presque toujours aussi un calque de texte caché et indexable dont les boîtes de mots sont alignées pixel par pixel avec le texte visible. Ce calque fournit gratuitement les positions/taille exactes. Donc : n'essayez pas d'éditer le texte, et n'utilisez pas un modèle génératif pour « repeindre » l'arrière-plan — cela altère l'illustration et ne peut pas être fidèle au pixel. À la place, couvrez et superposez : effacez chaque série de glyphes source et redessinez la traduction en place. L'arrière-plan reste fidèle au niveau de l'octet. Voir references/pipeline.md pour la justification plus approfondie et les modes d'échec.
Workflow (exécuter les scripts dans l'ordre depuis le dossier scripts/ de la compétence)
Choisissez un répertoire de travail (loc_work par défaut). Tous les scripts prennent SOURCE.pdf [OUTDIR] [PAGE].
-
Analyser —
01_analyze.py SOURCE.pdf OUTDIRConfirme comment le texte est stocké, liste les images intégrées, rend la page. Regardez le rendu et notez tout texte qui est intégré (baked) dans une image de diagramme/logo/photo (il ne sera PAS dans le calque de texte et doit être traité commemanual_labels). -
Extraire —
02_extract.py SOURCE.pdf OUTDIR(variable d'envLOC_KEEP='marqueA|marqueB'pour conserver plus de chaînes dans la langue source). Produitunits.json(une entrée par ligne de texte physique, avec bbox/couleur/taille) ettranslator_source.txt(un payload lisible, avec des identifiants) +half_*.png. -
Traduire — envoyez un agent traducteur. Donnez-lui
translator_source.txtethalf_0/1.png. Il doit écrireOUTDIR/translation.json = {"<id>":"traduction", ...}couvrant chaque id (les ids GARDER-EN-L'ÉTAT sont renvoyés inchangés). Utilisez le prompt dansreferences/agent-prompts.md. -
Surcharges (uniquement si nécessaire) — écrivez
OUTDIR/overrides.jsonpour les parties propres au document que le moteur automatique ne peut pas voir : texte intégré dans des images (manual_labels), texte à l'intérieur de contrôles fins comme les pastilles/badges (solid_fill_labels), zones d'étiquettes centrées (centered_id_ranges), etdrop_ids. Schéma + comment mesurer les coordonnées :references/overrides.md. La plupart des flyers simples n'ont besoin d'aucune surcharge ; ceux riches en diagrammes en nécessitent quelques-unes. -
Composer —
03_compose.py SOURCE.pdf OUTDIR→final_fr.png. C'est le moteur déterministe (reconstruction de l'arrière-plan + redessin unifié par taille). Il n'a besoin d'aucun réglage par document. -
PDF + recadrages —
04_pdf.py SOURCE.pdf OUTDIR OUT.pdf→ le PDF plusfr_L/fr_R.pngpour l'AQ. -
Relire & itérer — envoyez un agent relecteur pour comparer
fr_L/fr_R.pngavechalf_0/1.png(prompt dansreferences/agent-prompts.md). Corrigez les constatations en éditantoverrides.json/translation.jsonet en réexécutant 03→04. Répétez jusqu'à ce que ce soit propre. Les problèmes typiques et leurs correctifs sont listés dansreferences/pipeline.md.
La boucle à 3 rôles (traducteur → compositeur → relecteur) imite une équipe humaine de localisation ; exécuter le relecteur 1 à 2 fois permet de rattraper la longue traîne (texte source résiduel, blocs mal dimensionnés).
Ce que le moteur gère automatiquement (aucune configuration)
- Panneaux de texte clair sur fond sombre ET foncé sur fond clair (choisit la bonne couleur d'arrière-plan).
- Panneaux plats, dégradés lisses et arrière-plans photo (choisit remplissage vs. inpainting par région).
- Entrées de calque de texte « fantômes » sans glyphes visibles (ignorées automatiquement — jamais dessinées).
- Listes à puces où la puce a été avalée dans la boîte de la première ligne (réalignement automatique).
- Taille de police : taille originale, unifiée par bloc pour que les paragraphes/citations renvoyés à la ligne ne soient pas irréguliers.
Valeurs par défaut et prérequis
- Python :
pymupdf (fitz),numpy,opencv-python (cv2),Pillow. - Police CJK par défaut :
Hiragino Sans GB.ttc(macOS ; indice régulier W3 0 / gras W6 2). Surcharger viaoverrides.json"font"pour d'autres langues/polices. - Échelle de rendu par défaut 6.0 (≈432 dpi). Réduire à 4 pour la vitesse lors des itérations ; augmenter pour l'impression.
- Conserver dans la langue source par défaut : URL, e-mails, marques/produits déposés, texte intégré dans les logos, nombres/unités simples, et noms propres. Le traducteur décide ; l'expression régulière KEEP pré-identifie les évidences.
Fichiers de référence
references/pipeline.md— justification, arbre de décision pour la stratégie de suppression, et catalogue des défauts visuels courants avec leurs correctifs exacts (traînées, résidus, pastilles cassées, effondrement de taille).references/agent-prompts.md— prompts prêts à l'emploi pour les agents traducteur et relecteur.references/overrides.md— schéma deoverrides.jsonet comment mesurer les coordonnées des diagrammes/pastilles.