DEV Community

Dev du Sud
Dev du Sud

Posted on

Générer des PDF propres en Python, sans aucune dépendance

La question revient sans cesse : « comment je génère un PDF en Python ? » Et la réponse qu'on donne toujours — « installe ReportLab » — n'est pas la seule.

Pour des factures, des rapports simples ou des attestations, il y a une voie plus légère.

La voie zéro dépendance : la bibliothèque standard

Pas de PDF natif dans la bibliothèque standard, mais un détour élégant existe : le HTML + le navigateur/outil d'impression, ou, pour rester 100 % Python, générer le PDF à partir de texte brut avec fpdf2... — non, restons sur du concret.

La vraie méthode sans dépendance que j'utilise pour du simple :

from pathlib import Path

def rapport_txt_vers_pdf(texte, sortie):
    # Étape 1 : on écrit un fichier texte propre
    Path(sortie + ".txt").write_text(texte, encoding="utf-8")
    # Étape 2 : conversion via un outil système déjà présent
    # (sur Linux, enscript/pandoc existent souvent ; sinon voir plus bas)
    print(f"Texte prêt dans {sortie}.txt — convertir avec votre outil préféré")
Enter fullscreen mode Exit fullscreen mode

Honnêtement, pour du VRAI PDF, le détour le plus robuste est le HTML :

import subprocess
from pathlib import Path

def html_vers_pdf(html, sortie):
    Path(sortie + ".html").write_text(html, encoding="utf-8")
    # Chrome headless convertit n'importe quel HTML en PDF nickel :
    subprocess.run([
        "chromium", "--headless", "--disable-gpu",
        "--print-to-pdf=" + sortie + ".pdf",
        sortie + ".html",
    ], check=True)
Enter fullscreen mode Exit fullscreen mode

Un simple fichier HTML avec un peu de CSS = un PDF avec police, marges, tableau, logo. Et Chrome est déjà installé sur la plupart des machines.

Quand il faut plus : les trois options sérieuses

  1. fpdf2 — léger, rapide, parfait pour factures et tableaux. Ma préférence pour du PDF « utilitaire ».
  2. weasyprint — HTML/CSS → PDF avec un vrai moteur de mise en page. Idéal pour des rapports élégants. Plus lourd à installer (dépendances système).
  3. reportlab — le classique. Puissant mais verbeux : comptez 50 lignes pour un PDF que fpdf2 fait en 15.

Le piège que tout le monde découvre trop tard

Les caractères accentués. é, è, à deviennent des hiéroglyphes ou carrément des erreurs. Avec fpdf2 :

from fpdf import FPDF

pdf = FPDF()
pdf.add_page()
pdf.add_font("DejaVu", "", "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf")
pdf.set_font("DejaVu", size=12)
pdf.cell(0, 10, "Facture échéance — ÉTÉ 2026", new_x="LMARGIN", new_y="NEXT")
pdf.output("facture.pdf")
Enter fullscreen mode Exit fullscreen mode

Toujours embarquer une police Unicode. Toujours tester avec « é è ç à œ É ».

Le générateur de factures complet

Dans mon guide — 10 scripts Python pour gagner 2h par jour — je détaille un générateur de factures complet : calcul de TVA, numérotation automatique, en-tête personnalisé et envoi par email. Le PDF de démarrage est gratuit.

Votre avis : fpdf2, weasyprint ou reportlab — vous êtes team quoi ?

Top comments (0)