Communitygithub.com

sulipapa/localize-infographic-pdf

Localisation de PDF avec préservation des illustrations (ex. EN→FR) pour infographies/dépliants exportés depuis un outil de design — une compétence Claude Code qui efface le texte vectoriel/Type3 source et redessine la traduction en place.

Qu'est-ce que localize-infographic-pdf ?

**sulipapa/localize-infographic-pdf** est une compétence Claude Code conçue pour la localisation de documents PDF exportés depuis des logiciels de design (comme Illustrator, Figma, etc.). Le problème principal est que ces PDF contiennent souvent du texte converti en courbes vectorielles ou en glyphes Type3, ce qui le rend non éditable directement. Cette compétence contourne cette limitation en rattachant la page source (rasterization), en effaçant précisément les glyphes source, puis en superposant la traduction aux mêmes coordonnées. L'illustration (photos, diagrammes, dégradés, icônes, logos) est intégralement préservée, pixel par pixel. Le pipeline se déroule en sept étapes, depuis l'analyse du PDF jusqu'à la génération du PDF final localisé, en passant par l'extraction du calque de texte caché (qui fournit les positions exactes), la traduction via un agent dédié, et la composition déterministe. Le flux de travail intègre trois rôles (traducteur → compositeur → relecteur) qui imitent une équipe humaine de localisation, ce qui permet de rattraper la longue traîne des défauts visuels résiduels. La compétence est livrée avec des scripts Python (utilisant pymupdf, numpy, opencv-python, Pillow), des fichiers de référence expliquant la logique et les correctifs, et des jeux de prompts prêts à l'emploi pour les agents traducteur et relecteur.

Compatible avec✓Claude Code~Codex CLI~Cursor
npx skills add sulipapa/localize-infographic-pdf

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

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].

  1. Analyser — 01_analyze.py SOURCE.pdf OUTDIR Confirme 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é comme manual_labels).

  2. Extraire — 02_extract.py SOURCE.pdf OUTDIR (variable d'env LOC_KEEP='marqueA|marqueB' pour conserver plus de chaînes dans la langue source). Produit units.json (une entrée par ligne de texte physique, avec bbox/couleur/taille) et translator_source.txt (un payload lisible, avec des identifiants) + half_*.png.

  3. Traduire — envoyez un agent traducteur. Donnez-lui translator_source.txt et half_0/1.png. Il doit écrire OUTDIR/translation.json = {"<id>":"traduction", ...} couvrant chaque id (les ids GARDER-EN-L'ÉTAT sont renvoyés inchangés). Utilisez le prompt dans references/agent-prompts.md.

  4. Surcharges (uniquement si nécessaire) — écrivez OUTDIR/overrides.json pour 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), et drop_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.

  5. 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.

  6. PDF + recadrages — 04_pdf.py SOURCE.pdf OUTDIR OUT.pdf → le PDF plus fr_L/fr_R.png pour l'AQ.

  7. Relire & itérer — envoyez un agent relecteur pour comparer fr_L/fr_R.png avec half_0/1.png (prompt dans references/agent-prompts.md). Corrigez les constatations en éditant overrides.json / translation.json et 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 dans references/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 via overrides.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 de overrides.json et comment mesurer les coordonnées des diagrammes/pastilles.

Skills associés