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é")
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)
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
-
fpdf2— léger, rapide, parfait pour factures et tableaux. Ma préférence pour du PDF « utilitaire ». -
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). -
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")
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)