\ai{pdf-generation}

Generación de PDF con IA y LLM

Use GPT-4, Claude o cualquier LLM para generar código fuente LaTeX y luego compílelo a un PDF profesional con la API de FormaTeX. Dos llamadas a la API, tipos de documento ilimitados, resultado perfecto al píxel.

\section{El patrón}

El LLM genera LaTeX, FormaTeX lo compila

El patrón es sencillo: pida a un LLM que produzca código fuente LaTeX sin procesar y luego envíe ese código mediante POST al endpoint de compilación de FormaTeX. El LLM se encarga de la estructura y el contenido del documento; FormaTeX se encarga de todo el pipeline de compilación de TeX Live. Obtiene un PDF de calidad de producción sin tener que gestionar una instalación de LaTeX.

El LLM escribe el LaTeX

Los LLM modernos producen LaTeX sintácticamente correcto de forma fiable, sobre todo con un prompt de sistema bien enfocado. GPT-4o, Claude Opus y Gemini Pro funcionan bien.

FormaTeX compila

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.

Guarde o transmita el PDF

Escriba los bytes de la respuesta en un archivo, transmítalos como descarga en el navegador o súbalos a un almacenamiento en la nube, según lo requiera su flujo de trabajo.

\section{LaTeX frente a HTML}

Por qué LaTeX supera a HTML a PDF para la salida de la IA

CriterioLaTeX + FormaTeXHTML a PDF
MatemáticasRenderizado nativo de ecuaciones con amsmathSoluciones alternativas con MathJax, fuentes inconsistentes
TipografíaSaltos de línea Knuth–Plass, kerning profesionalCalidad de navegador, renderizado variable
Diseño de páginaMárgenes precisos, encabezados, pies de página, varias columnasAproximado con CSS, rarezas de impresión
Cross-references\ref, \cite, \label — automatic numberingManual o frágil, basado en JS
Documentos largosCapítulos, secciones, índice, bibliografíaDifícil de gestionar a escala
Fiabilidad del LLMLos LLM producen LaTeX válido con mayor consistenciaLos LLM producen CSS en línea inconsistente

\section{Ejemplo en Python}

GPT-4 + FormaTeX en Python

Ejemplo completo y ejecutable con el SDK de OpenAI para Python y la biblioteca requests. Llame a generate_pdf() con cualquier instrucción en lenguaje natural para recibir un archivo .pdf en disco.

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{Consejos para el prompt}

Ingeniería de prompts para obtener LaTeX fiable

Exija LaTeX sin procesar en el prompt de sistema

Incluya "respond ONLY with valid LaTeX source code — no markdown fences, no explanation" en el mensaje de sistema. Sin esto, los modelos suelen envolver la salida en bloques ```latex que hay que eliminar.

Especifique la clase de documento de forma explícita

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

Mantenga la temperatura baja

Ajuste la temperatura entre 0.1 y 0.3 para generar LaTeX. Una temperatura alta aumenta la probabilidad de comandos inventados o llaves faltantes que impiden la compilación.

Indique los paquetes que necesita

Indique explícitamente al modelo qué paquetes incluir: amsmath, graphicx, booktabs, hyperref. Los modelos a veces importan paquetes inexistentes cuando se les deja elegir libremente.

Valide antes de compilar

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.

Use xelatex para contenido 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}

Empiece a generar PDF con IA

Obtenga una clave de API de FormaTeX, copie el ejemplo de Python anterior y publique PDF profesionales generados por IA en menos de diez minutos.