\ai{pdf-generation}

Génération de PDF par IA avec les LLM

Utilisez GPT-4, Claude ou n'importe quel LLM pour générer du code source LaTeX, puis compilez-le en PDF professionnel avec l'API FormaTeX. Deux appels d'API, tous types de documents, un rendu au pixel près.

\section{Le principe}

Le LLM génère le LaTeX, FormaTeX le compile

Le principe est simple : demandez à un LLM de produire du code source LaTeX brut, puis envoyez ce code en POST au point de terminaison de compilation de FormaTeX. Le LLM s'occupe de la structure et du contenu du document ; FormaTeX gère toute la chaîne de compilation TeX Live. Vous obtenez un PDF de qualité production sans avoir à gérer d'installation LaTeX.

Le LLM écrit le LaTeX

Les LLM modernes produisent du LaTeX syntaxiquement correct de façon fiable, surtout avec un prompt système ciblé. GPT-4o, Claude Opus et Gemini Pro fonctionnent tous bien.

FormaTeX compile

POST the LaTeX string to https://api.formatex.io/api/v1/compile with your API key. Choose the engine: pdflatex and xelatex on every plan, lualatex and latexmk on Pro and above. Receive raw PDF bytes in the response.

Enregistrez ou diffusez le PDF

Écrivez les octets de la réponse dans un fichier, diffusez-les en téléchargement vers un navigateur ou envoyez-les vers un stockage cloud, selon votre flux de travail.

\section{LaTeX ou HTML}

Pourquoi LaTeX l'emporte sur HTML vers PDF pour les sorties d'IA

CritèreLaTeX + FormaTeXHTML vers PDF
MathématiquesRendu natif des équations avec amsmathContournement MathJax, polices incohérentes
TypographieCésure de Knuth–Plass, crénage professionnelRendu de type navigateur, variable
Mise en pageMarges, en-têtes, pieds de page et multicolonnes précisApproximations CSS, particularités d'impression
Cross-references\ref, \cite, \label — automatic numberingManuel ou fragile, basé sur du JS
Documents longsChapitres, sections, table des matières, bibliographieDifficile à gérer à grande échelle
Fiabilité du LLMLes LLM produisent du LaTeX valide de façon plus constanteLes LLM produisent du CSS en ligne incohérent

\section{Exemple Python}

GPT-4 + FormaTeX en Python

Exemple complet et exécutable utilisant le SDK Python d'OpenAI et la bibliothèque requests. Appelez generate_pdf() avec n'importe quel prompt en langage naturel pour obtenir un fichier .pdf sur disque.

ai_pdf_generation.py
import openai
import requests

openai_client = openai.OpenAI(api_key="your-openai-key")
FORMATEX_URL = "https://api.formatex.io/api/v1/compile"
FORMATEX_API_KEY = "your-formatex-key"

SYSTEM_PROMPT = """You are a LaTeX expert. When asked to create a document,
respond ONLY with valid LaTeX source code. No markdown fences, no explanation.
Always include \\documentclass, a complete preamble, and
\\begin{document}...\\end{document}. Use standard packages only."""

def generate_latex(prompt: str) -> str:
    """Ask GPT-4 to write a complete LaTeX document."""
    response = openai_client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {"role": "system", "content": SYSTEM_PROMPT},
            {"role": "user", "content": prompt},
        ],
        temperature=0.2,  # Low temperature for deterministic LaTeX output
    )
    return response.choices[0].message.content

def compile_to_pdf(latex_source: str, engine: str = "pdflatex") -> bytes:
    """Compile LaTeX source with FormaTeX and return PDF bytes."""
    response = requests.post(
        FORMATEX_URL,
        headers={
            "X-API-Key": FORMATEX_API_KEY,
            "Content-Type": "application/json",
        },
        json={"latex": latex_source, "engine": engine},
        timeout=30,
    )
    response.raise_for_status()
    return response.content

def generate_pdf(prompt: str, output_path: str, engine: str = "pdflatex") -> None:
    """End-to-end: prompt → LaTeX → PDF saved to disk."""
    print(f"Generating LaTeX for: {prompt[:60]}...")
    latex_source = generate_latex(prompt)

    print("Compiling PDF with FormaTeX...")
    pdf_bytes = compile_to_pdf(latex_source, engine)

    with open(output_path, "wb") as f:
        f.write(pdf_bytes)
    print(f"PDF saved to {output_path} ({len(pdf_bytes):,} bytes)")


# Example usage
generate_pdf(
    prompt=(
        "Write a 3-page LaTeX technical report on transformer neural networks. "
        "Include an abstract, introduction, the scaled dot-product attention "
        "equation, a comparison table of model sizes, and a conclusion."
    ),
    output_path="transformer_report.pdf",
    engine="pdflatex",
)

\section{Conseils de prompt}

Ingénierie de prompt pour un LaTeX fiable

Imposez du LaTeX brut dans le prompt système

Incluez « respond ONLY with valid LaTeX source code — no markdown fences, no explanation » dans le message système. Sans cela, les modèles enveloppent souvent la sortie dans des blocs ```latex qu'il faut ensuite retirer.

Précisez explicitement la classe de document

Tell the model which documentclass to use: "Use \documentclass{article}" or "\documentclass[12pt,a4paper]{report}". This prevents the model from choosing an inappropriate class.

Gardez une température basse

Réglez la température entre 0.1 et 0.3 pour la génération de LaTeX. Une température élevée augmente le risque de commandes inventées ou d'accolades manquantes qui font échouer la compilation.

Listez les paquets dont vous avez besoin

Indiquez explicitement au modèle les paquets à inclure : amsmath, graphicx, booktabs, hyperref. Laissés libres de choisir, les modèles importent parfois des paquets inexistants.

Validez avant de compiler

Strip markdown fences with a simple regex before POSTing. Check that the output contains \documentclass and \begin{document} — if not, re-prompt rather than wasting a compile request.

Utilisez xelatex pour le contenu Unicode

If the document may contain non-ASCII characters (names, accents, CJK), set engine to xelatex and instruct the model to use \usepackage{fontspec} instead of inputenc.

\end{pdf-generation}

Commencez à générer des PDF avec l'IA

Obtenez une clé API FormaTeX, copiez l'exemple Python ci-dessus et livrez des PDF professionnels générés par IA en moins de dix minutes.