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
| Format | Méthode de conversion | Description |
|---|---|---|
.md | pandoc | Prend en charge YAML front-matter, tableaux GFM, listes, blocs de code, images |
.docx | pandoc | Styles de titre → titres de chapitre ; tableaux → tableaux stylisés ; images extraites automatiquement |
.txt | Analyse intégrée | Sauts de ligne pour séparer les paragraphes ; lignes courtes numérotées (一、/ 1. / Chapitre X) → titres de chapitre |
.html | Analyse intégrée | Prend 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
---
badgessont séparés par;, le préfixe!donne un fond noir avec texte blanc.- Si
daten'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
| Comportement | Rè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ères | Gé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 |
| Tableaux | Si 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 page | La 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 source | Traitement |
|---|---|
<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 diviser | Conservé 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"> + echarts | Capturé 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 :
| Fichier | Graisse |
|---|---|
SourceHanSansCN-Regular.subset.ttf | 400 |
SourceHanSansCN-Bold.subset.ttf | 700 |
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) :
- 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 - Supprimer le dossier
fonts/:make.pyne 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). - Modifier uniquement le CSS : changez le premier nom de police dans
--sansen haut detemplates/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ée | Sortie |
|---|---|
「」 | “” |
『』 | ‘’ |
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ée | Taille | Pages | Durée |
|---|---|---|---|
| md | 29 Ko | 15 | ~6 s |
| html | 105 Ko + 2 graphiques ECharts | 21 | ~15 s |
| docx | Styles de titre + tableaux | 2 | ~6 s |
txt (samples/) | 1,2 Ko | 2 | ~5 s |
| md long document (régression) | 71 Ko | 21 | ~24 s |
Dépendances
| Dépendance | État local | En cas d'absence |
|---|---|---|
| pandoc (≥2.19) | Exécutez pandoc -v pour vérifier | Les fichiers md/docx ne peuvent pas être convertis |
| playwright + chromium | Ou Chrome / Edge système | Impossible de générer le PDF |
| python-docx (optionnel) | Utilisé uniquement pour une analyse auxiliaire | N'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
.kvest 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.