Communitygithub.com

echoBai83/swiss-pdf

Transformez instantanément vos fichiers md / docx / txt / html en PDF A4 au style suisse international. Police noire sur fond blanc, filets fins, grands numéros de chapitre, chiffres à chasse fixe, bandeau de couverture, table des matières automatique, en-têtes/pieds de page et sept types de blocs de style (note, citation, inverse, avertissement, statistiques, check, kv).

Qu'est-ce que swiss-pdf ?

Cette compétence (skill) pour agents IA, nommée echoBai83/swiss-pdf, permet de générer des documents PDF professionnels au style suisse international à partir de fichiers Markdown, DOCX, TXT ou HTML. Elle est idéale pour les développeurs, rédacteurs techniques et utilisateurs d'agents IA qui souhaitent produire rapidement des rapports soignés, des white papers ou des documentations. Le skill supporte les plateformes comme Claude Code, Cursor et Codex, et peut être utilisé via glisser-déposer ou en ligne de commande. Il intègre un parsing automatique des formats d'entrée, une génération de couverture via YAML front-matter, six blocs de style (note, citation, inverse, avertissement, statistiques, check, KV), une table des matières automatique, une gestion des polices intégrée (Source Han Sans CN subset), et une normalisation des guillemets. Le rendu PDF est assuré par Playwright/Chromium, avec une mise en page A4, des marges précises et un comportement anti-veuvage. La compétence est livrée avec un aperçu de performance (ex: 15 pages en ~6s pour un MD de 29 Ko) et une gestion des dépendances (pandoc, playwright).

Compatible avec✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/echoBai83/swiss-pdf/tree/HEAD

Demander à votre IA préférée

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

Documentation

Que fait swiss-pdf ?

Transformez en un clic vos fichiers md / docx / txt / html en PDF A4 au style suisse international. Fond blanc, texte noir, filets très fins, grands numéros de chapitre, chiffres à chasse fixe, une seule couleur d'accent rouge #E5484D.

Les jetons de conception proviennent d'un ouvrage relié de style typographique suisse (grands numéros de chapitre, filets très fins, une seule couleur d'accent), adapté en un flux unique à pagination automatique, donc tout document de n'importe quelle longueur peut être traité directement.

Comment l'utiliser

Méthode 1 : Glisser-déposer (recommandé)

Faites glisser le fichier sur swiss-pdf.bat → un fichier .pdf du même nom est généré dans le même répertoire, et une copie xxx.pdf-src.html est conservée (source HTML consultable).

Méthode 2 : Ligne de commande

python make.py fichier_entrée                    # Génère un PDF
python make.py fichier_entrée --html             # Génère uniquement le HTML (enregistré sous xxx.html, ouvrable dans un navigateur pour impression manuelle)
python make.py fichier_entrée -o sortie.pdf
python make.py a.md b.docx c.txt           # Traitement par lots
python make.py fichier_entrée --no-cover --no-toc
python make.py fichier_entrée --title "Titre" --kick "Note de bas de page" --date 2026.11.09

Entrées prises en charge

FormatMéthode de conversionDescription
.mdpandocPrend en charge YAML front-matter, tableaux GFM, listes, blocs de code, images
.docxpandocStyles de titre → titres de chapitre ; tableaux → tableaux stylisés ; images extraites automatiquement
.txtAnalyse intégréeSauts de ligne pour séparer les paragraphes ; lignes courtes numérotées (一、/ 1. / Chapitre X) → titres de chapitre
.htmlAnalyse intégréePrend le <body>, supprime les scripts/styles ; <title> devient le titre du document

Couverture : YAML front-matter

Écrivez-le en haut du fichier md (pour les autres formats, utilisez les paramètres --title, etc.) :

---
title: Livre blanc sur la sécurité cycliste en ville
subtitle: Observations et recommandations basées sur une enquête dans trois villes
kick: Recherche sur la gestion du trafic
en: Urban Cycling Safety White Paper
slug: sécurité-cycliste-urbaine
nature: Version publique
project: Programme d'étude des systèmes de déplacement doux en ville
party_a: Nom du mandant
party_b: Nom du mandataire
stage: Enquête → Rédaction → Finalisation
source: 01_Enregistrements d'observation 02_Comptes rendus d'entretien 03_Plan
date: 2026.11.10
version: v2.1
badges: Public; !Important; Données probantes
---
  • badges sont séparés par ;, le préfixe ! donne un fond noir avec texte blanc.
  • Si date n'est pas renseigné, la date du jour est utilisée automatiquement.
  • Fonctionne aussi sans front-matter ; la couverture affiche uniquement le titre + la date + un espace réservé pour la version.

Corps du texte : six types de blocs de style

En markdown, entourez le contenu avec ::: (chaque ligne dans le bloc = un élément) :

::: note
Complément d'information, rappel de périmètre. Fond gris.
:::

::: quote
Citation de conclusion clé, barre verticale de 3 pt à gauche.
:::

::: inverse
Bloc noir à texte blanc, pour la phrase la plus importante.
:::

::: warn
Cadre rouge d'avertissement, le seul endroit où la couleur est autorisée.
:::

::: stat
4 280 | Nombre total d'échantillons observés || 24 | Points d'observation || 3 | Villes couvertes
:::

::: check
Carrefour aux heures de pointe matinales (arrivée avant 7h30 requise)
Tronçons éclairés la nuit (nécessitent un éclairage d'appoint)
:::

::: kv
Pages | Plan A 20 pages / Plan C 32 pages
Recommandation | Plan C, mais nécessite des données supplémentaires pour la deuxième ville
:::

stat utilise nombre | description pour former une cellule, || pour séparer les cellules. kv utilise clé | valeur.

Comportements automatiques

ComportementRègle
Numérotation des chapitres# Titre de niveau 1 → grand nombre 00/01/02… ; si le titre contient déjà une numérotation comme « 01 » ou « 一、 », elle est conservée
Table des matièresGénérée uniquement si le nombre total de chapitres + sections (##) est ≥ 5, sinon cette page est omise ; les titres de chapitre ont des ancres, cliquables dans le PDF pour naviguer
TableauxSi le nombre de colonnes ≥ 6, la taille de police est réduite automatiquement (table.wide) ; les cellules purement numériques sont alignées à droite avec une police à chasse fixe
En-têtes et pieds de pageLa page de couverture n'a pas d'en-tête/pied ; en-tête : titre courant à gauche, pied : « Page i / N pages » à droite
Impression@page A4, marges 14/15/13 mm ; les titres ne sont pas séparés du corps, les lignes de tableau ne sont pas coupées entre les pages

Traitement supplémentaire des sources HTML (compléments testés)

Lorsque la source est une « page web avec son propre design », ce skill effectue automatiquement ces normalisations pour éviter des numéros flottants ou des titres en double après la mise en page :

Structure sourceTraitement
<div class="sec-head"><span class="sec-num">3</span><h2>Titre</h2></div>Converti en en-tête de section .sec du modèle (numéro pris du span, titre du h2)
<h1>03 Titre</h1> / <h1>Titre</h1>Idem ; sans numéro, incrémentation automatique selon l'ordre d'apparition
Paragraphe isolé de chiffres <p>0</p>Supprimé (courant lorsque le numéro de chapitre est utilisé comme élément décoratif)
<header class="masthead"> / <nav>Supprimé (la couverture est déjà séparée ; les kickers/ grands titres/ tables des matières redondants pollueraient le corps)
<section> pour diviserConservé comme conteneur de section, mais nécessite toujours sec-head ou h1 pour apparaître dans la table des matières
<div id="xxx" class="chart"> + echartsCapturé en PNG via un navigateur sans tête, puis intégré ; attend networkidle + 2,5 s avant la capture

Prérequis pour la capture d'écran des graphiques : si ECharts utilise un CDN, une connexion réseau est nécessaire ; dans un environnement hors ligne, intégrez echarts.min.js en ligne dans la source.

Polices et ponctuation

Polices : Source Han Sans CN intégré au dépôt, via @font-face en ligne

Le dossier fonts/ contient deux fichiers livrés avec le dépôt. make.py intègre leur base64 dans le <style> lors de la génération du HTML, et les enregistre sous la famille de polices Swiss Sans SC :

FichierGraisse
SourceHanSansCN-Regular.subset.ttf400
SourceHanSansCN-Bold.subset.ttf700

Le sous-ensemble couvre environ 7 100 caractères (ASCII + ponctuation chinoise/anglaise + les 6 763 caractères GB2312 complets). Le jeu de caractères est listé dans fonts/charset.txt. Avantage : sur une machine sans Source Han Sans installée, le rendu est identique, l'utilisateur n'a pas besoin d'installer la police.

L'utilisateur peut changer ou télécharger la police librement, trois méthodes (voir fonts/README.md pour plus de détails) :

  1. Remplacer les fichiers (recommandé) : renommez votre police TTF avec les noms ci-dessus et remplacez les fichiers. Sous-ensemblez d'abord, sinon le HTML fera 10 Mo :
    pyftsubset votre-police-Regular.ttf --text-file=fonts/charset.txt --output-file=fonts/SourceHanSansCN-Regular.subset.ttf
    
  2. Supprimer le dossier fonts/ : make.py ne trouve pas les fichiers et ignore @font-face, en utilisant la pile de polices système de secours dans le CSS (Source Han Sans SC/CN → Noto Sans SC → Noto Sans CJK SC → GenYo Gothic CN → PingFang SC → Segoe UI Symbol).
  3. Modifier uniquement le CSS : changez le premier nom de police dans --sans en haut de templates/swiss.css.

⚠️ Utilisez impérativement .ttf (contours TrueType), pas .otf (CFF). Chromium, lors de l'impression PDF, dégrade les polices web CFF en instructions de glyphes Type 3 (chaque glyphe stocké comme un ensemble d'instructions de dessin), multipliant la taille. Pour un même document de 4 pages : OTF → 328 Ko / 205 glyphes Type 3 ; TTF → 79 Ko / 1 glyphe Type 3.

Microsoft YaHei sous Chromium manque des glyphes pour · (U+00B7), → ↓ ≤ ≥ etc., qui deviennent des carrés. Il a donc été retiré de la pile de polices principale.

Guillemets : guillemets courbes chinois obligatoires dans tout le texte

convert.normalize_quotes() traite uniformément à la dernière étape de la conversion, couvrant les titres, la couverture, les en-têtes, la table des matières, les tableaux et les blocs de style :

EntréeSortie
「」“”
『』‘’
Guillemets droits dans le code " 'En markdown, pandoc avec +smart les convertit automatiquement en guillemets courbes ; à l'intérieur des blocs de code <code> / <pre>, ils restent inchangés

L'implémentation remplace seulement 4 points de code (U+300C/D/E/F → U+201C/D/8/9), sans toucher aux attributs de balises HTML ni au CSS/JS.

Enregistrements de tests validés

EntréeTaillePagesDurée
md29 Ko15~6 s
html105 Ko + 2 graphiques ECharts21~15 s
docxStyles de titre + tableaux2~6 s
txt (samples/)1,2 Ko2~5 s
md long document (régression)71 Ko21~24 s

Dépendances

DépendanceÉtat localEn cas d'absence
pandoc (≥2.19)Exécutez pandoc -v pour vérifierLes fichiers md/docx ne peuvent pas être convertis
playwright + chromiumOu Chrome / Edge systèmeImpossible de générer le PDF
python-docx (optionnel)Utilisé uniquement pour une analyse auxiliaireN'affecte pas le flux principal

Spécifiez un navigateur : set SWISS_PDF_CHROME=<chemin_vers_chrome.exe>

Structure des fichiers

swiss-pdf/
├── SKILL.md              Ce fichier
├── swiss-pdf.bat         Point d'entrée par glisser-déposer
├── make.py               Flux principal : conversion → assemblage → rendu
├── convert.py            Conversion de chaque format → fragment HTML + syntaxe de bloc
├── templates/
│   └── swiss.css         Tous les styles (jetons de conception + règles d'impression)
└── samples/              Exemples de référence pour les trois formats

Limites (ce qu'il ne fait pas)

  • Pagination manuelle comme un ouvrage relié (contenu soigneusement placé sur chaque page, conception en vis-à-vis) : le modèle ne le permet pas, nécessite toujours un HTML fait main. Ce skill est conçu pour « une mise en page rapide de documents courants ».
  • Mise en page des illustrations dépend des dimensions des images dans le document source, pas de recadrage ni de fond perdu.
  • Numéros de page imprimés dans la table des matières non implémentés (les éléments de la page ne peuvent pas connaître leur numéro de page) ; les titres de chapitre sont cliquables pour naviguer, et le pied de page affiche « Page i / N pages ».
  • Les blocs de tableau trop courts peuvent être repoussés en entier à la page suivante (pour éviter de couper les tableaux clé-valeur, le bloc .kv est défini comme ne pouvant pas être scindé entre les pages).
  • Les styles Word complexes (zones de texte, WordArt, listes numérotées à plusieurs niveaux) sont dégradés lors de la conversion par pandoc.

Skills associés