Générer un PDF en Python ou Node.js avec une API : guide pratique
Produire un PDF en Python ou un PDF en Node.js est un besoin récurrent : factures, devis, rapports, contrats, attestations. Mais la plupart des développeurs découvrent vite que c'est plus pénible que prévu. Les bibliothèques de mise en page demandent du temps, le rendu diffère d'un serveur à l'autre, et chaque retouche de design impose de modifier le code. Une API de génération de PDF change la donne : vous décrivez le document une fois sous forme de modèle, vous envoyez vos données, et l'API vous renvoie le fichier fini.
Ce guide montre comment générer un PDF par API en Python et en Node.js avec DocX, l'API documentaire de Layerone, avec deux exemples de code complets et prêts à copier.
Le problème : générer des PDF proprement, sans usine à gaz
Quand on veut créer un PDF en JavaScript ou en Python, l'approche classique consiste à empiler des librairies de rendu : on positionne le texte, on gère les sauts de page, les polices, les marges, les tableaux. Le moindre changement de maquette devient un chantier. Pire : le rendu dépend de l'environnement (polices installées, version de la librairie, moteur headless), ce qui produit des PDF différents en local et en production.
Le contenu d'un document change (le client, les montants, les dates) mais sa mise en forme reste stable. Coder cette mise en forme ligne par ligne est donc à la fois fastidieux et fragile. S'ajoutent les coûts cachés : maintenir un navigateur headless ou une chaîne de conversion, surveiller la mémoire sur des documents volumineux, reproduire fidèlement un en-tête ou un pied de page sur chaque page. Autant de code qui n'apporte aucune valeur métier. L'idéal serait de séparer la maquette du code : que les développeurs n'écrivent plus que la logique de données, et que la présentation reste un fichier modifiable par n'importe qui.
La solution : un modèle Word + des données JSON → un PDF
L'approche par modèle inverse la logique. Un gérant ou un
graphiste prépare la maquette dans Microsoft Word, un outil qu'il
maîtrise déjà, et y place des balises comme
{{ client_nom }} ou {{ total_ttc }}. Le
développeur se contente d'injecter les données. Il n'y a
aucun moteur de rendu à installer ni à maintenir.
Avec DocX, le principe tient en trois étapes :
-
Vous déposez un modèle Word (.docx) avec vos
balises, et vous récupérez son identifiant
(
template_id). -
Vous appelez l'API en envoyant le
template_idet vos données au format JSON. - L'API renvoie le document fini (PDF ou Word) directement dans la réponse, sous forme binaire.
Les modèles sont stockés côté serveur : vous pouvez les modifier sans toucher au code de votre application. La transformation template Word vers PDF est entièrement pilotée par l'API.
Authentification : l'en-tête X-API-Key
Toutes les requêtes vers DocX s'authentifient avec un en-tête HTTP
X-API-Key. Vous obtenez votre clé sur l'espace
développeur après inscription. Cette clé est secrète :
conservez-la côté serveur, jamais dans du code front-end public.
L'endpoint de génération est
POST https://docx.layerone.fr/render-document, et le
corps de la requête est envoyé au format formulaire
(application/x-www-form-urlencoded) avec trois champs
: template_id, json_data (vos données
sérialisées en JSON) et output_filename (le nom du
fichier voulu).
Générer un PDF en Python
En Python, la bibliothèque requests suffit. On envoie
le formulaire avec data=, et comme la réponse est un
fichier binaire, on écrit directement
response.content sur le disque :
import json
import requests
CLE_API = "VOTRE_CLE_API"
URL = "https://docx.layerone.fr/render-document"
donnees = {
"client_nom": "Boulangerie Martin",
"numero": "F-2026-0042",
"date": "19/06/2026",
"total_ttc": "1 250,00 €",
}
reponse = requests.post(
URL,
headers={"X-API-Key": CLE_API},
data={
"template_id": "facture-standard",
"json_data": json.dumps(donnees),
"output_filename": "facture.pdf",
},
timeout=120,
)
if reponse.status_code == 200:
with open("facture.pdf", "wb") as fichier:
fichier.write(reponse.content)
print("PDF généré : facture.pdf")
else:
print(f"Erreur {reponse.status_code} : {reponse.text}")
Points clés : json_data doit être une chaîne JSON
(d'où json.dumps), la réponse est binaire (mode
"wb"), et un timeout évite de bloquer
votre application si le service tarde. Ce script tient en une
vingtaine de lignes et n'a besoin que de la dépendance
requests : aucune librairie de mise en page, aucun
binaire système à installer. Pour intégrer la génération dans une
API web (FastAPI, Flask, Django), il suffit de renvoyer le contenu
binaire avec l'en-tête Content-Type: application/pdf.
Générer un PDF en Node.js
En Node.js, on construit un corps de formulaire avec
URLSearchParams et on récupère la réponse en binaire.
Voici la version avec fetch (disponible nativement
depuis Node 18) :
import { writeFile } from "node:fs/promises";
const CLE_API = "VOTRE_CLE_API";
const URL = "https://docx.layerone.fr/render-document";
const donnees = {
client_nom: "Boulangerie Martin",
numero: "F-2026-0042",
date: "19/06/2026",
total_ttc: "1 250,00 €",
};
const corps = new URLSearchParams({
template_id: "facture-standard",
json_data: JSON.stringify(donnees),
output_filename: "facture.pdf",
});
const reponse = await fetch(URL, {
method: "POST",
headers: { "X-API-Key": CLE_API },
body: corps,
});
if (reponse.ok) {
const pdf = Buffer.from(await reponse.arrayBuffer());
await writeFile("facture.pdf", pdf);
console.log("PDF généré : facture.pdf");
} else {
console.error(`Erreur ${reponse.status} : ${await reponse.text()}`);
}
La même logique avec axios est tout aussi directe
: il suffit de préciser
responseType: "arraybuffer" pour récupérer le PDF
binaire.
import axios from "axios";
import { writeFile } from "node:fs/promises";
const corps = new URLSearchParams({
template_id: "facture-standard",
json_data: JSON.stringify({ client_nom: "Boulangerie Martin" }),
output_filename: "facture.pdf",
});
const reponse = await axios.post("https://docx.layerone.fr/render-document", corps, {
headers: { "X-API-Key": "VOTRE_CLE_API" },
responseType: "arraybuffer",
});
await writeFile("facture.pdf", Buffer.from(reponse.data));
Récupérer le PDF et gérer les erreurs
Dans les deux langages, le principe est identique : la réponse n'est pas du texte JSON mais le fichier lui-même, renvoyé en flux binaire. On l'écrit sur le disque, on le renvoie à l'utilisateur, ou on l'archive. Pensez à traiter les cas d'erreur :
-
401 / 403 : clé API absente, invalide ou
expirée. Vérifiez l'en-tête
X-API-Key. -
404 : le
template_idn'existe pas ou a été supprimé. -
429 : quota mensuel atteint sur le plan
gratuit. Le code
response.textprécise la cause. - 5xx : erreur côté service. Prévoyez un nouvel essai avec temporisation (retry).
Toujours vérifier le code HTTP avant d'écrire le
fichier : un corps d'erreur écrit en .pdf donnerait
un fichier illisible.
Factures électroniques : l'endpoint Factur-X
Pour les factures, DocX expose un second endpoint,
POST /render-facturx, qui produit directement une
facture Factur-X (un PDF/A-3 contenant les
données structurées), conforme à la réforme française de la
facture électronique. Le principe d'appel est le même qu'avec
/render-document : en-tête X-API-Key,
corps formulaire avec template_id,
json_data et output_filename. Vous
générez ainsi des factures à la fois lisibles par un humain et
exploitables par un logiciel comptable, sans bibliothèque
supplémentaire.
Cas d'usage concrets
- Factures : génération automatique à chaque vente, en PDF classique ou en Factur-X pour la conformité 2026.
- Devis : un modèle, des données, un devis prêt à envoyer en quelques millisecondes.
- Rapports : rapports d'intervention, comptes rendus, bilans périodiques générés en masse.
- Contrats et conventions : remplissez les clauses variables depuis votre base de données.
Intégrable partout, gratuit pour démarrer
Au-delà de Python et Node.js, DocX est aussi disponible via npm, MCP (pour Claude, ChatGPT, Cursor), Zapier, Make, n8n, Pipedream, Bubble, Adalo et Postman. Une spécification OpenAPI publique permet de générer un client dans le langage de votre choix.
Le plan gratuit offre 20 documents par mois, sans carte bancaire : largement de quoi valider votre intégration en conditions réelles avant de passer à l'échelle.
Questions fréquentes
Générer un PDF par API en Python ou Node.js, est-ce gratuit ?
Oui pour démarrer : le plan gratuit de DocX offre 20 documents par mois, sans carte bancaire. De quoi valider votre intégration Python ou Node.js en conditions réelles avant de passer à l'échelle.
Où obtenir la clé API utilisée dans les exemples de code ?
Sur l'espace développeur https://dev.layerone.fr, après inscription. Cette clé s'envoie dans l'en-tête X-API-Key de chaque requête vers https://docx.layerone.fr. Conservez-la côté serveur, jamais dans du code front-end public.
Faut-il envoyer du JSON ou un formulaire à l'API ?
L'endpoint render-document attend un corps au format formulaire application/x-www-form-urlencoded, et non du JSON brut. Vous passez trois champs : template_id, json_data (vos données sérialisées en chaîne JSON, via json.dumps en Python ou JSON.stringify en Node.js) et output_filename.
Peut-on générer des PDF sans écrire de code Python ni Node.js ?
Oui : au-delà du code, DocX se branche sur des outils no-code comme Zapier, Make, n8n, Pipedream, Bubble et Adalo, ainsi que sur npm, MCP et Postman. Une spécification OpenAPI publique permet aussi de générer un client dans le langage de votre choix.