\usepackage{golang}

API de LaTeX a PDF para Go

Compile LaTeX a PDF desde Go con la API REST de FormaTeX. Con el net/http estándar: sin binarios externos y sin instalar TeX Live.

Also available in:Python·Node.js·Go·PHP·Ruby·Rust·cURL|Full API reference

\section{Por qué Go}

Por qué Go + FormaTeX

No se necesita ningún binario externo

Olvídese de incluir TeX Live en su imagen de Docker. FormaTeX se encarga de la compilación en el servidor y su binario de Go se mantiene ligero.

net/http nativo

La API de FormaTeX es un endpoint HTTP sencillo. Use la biblioteca estándar: sin SDK especial y sin nuevas dependencias en su go.mod.

Compilación concurrente

Use goroutines y sync.WaitGroup para compilar varios documentos en paralelo. La API gestiona solicitudes concurrentes sin limitar la tasa de las goroutines.

\section{Inicio rápido}

Inicio rápido

El siguiente ejemplo compila un documento LaTeX mínimo y escribe el PDF resultante en disco. Sustituya your-api-key por una clave de su panel . En producción, léala con os.Getenv("FORMATEX_API_KEY") .

main.go
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"os"
)

const (
	apiKey = "your-api-key" // use os.Getenv in production
	apiURL = "https://api.formatex.io/api/v1"
)

func main() {
	latex := `\documentclass{article}
\usepackage{amsmath}
\begin{document}
Hello from Go! $E = mc^2$
\end{document}`

	pdf, err := compileLaTeX(latex, "pdflatex")
	if err != nil {
		fmt.Fprintf(os.Stderr, "error: %v\n", err)
		os.Exit(1)
	}

	if err := os.WriteFile("output.pdf", pdf, 0644); err != nil {
		fmt.Fprintf(os.Stderr, "write error: %v\n", err)
		os.Exit(1)
	}
	fmt.Println("PDF saved to output.pdf")
}

func compileLaTeX(source, engine string) ([]byte, error) {
	body, _ := json.Marshal(map[string]string{
		"latex": source,
		"engine": engine,
	})

	req, _ := http.NewRequest("POST", apiURL+"/compile", bytes.NewReader(body))
	req.Header.Set("X-API-Key", apiKey)
	req.Header.Set("Content-Type", "application/json")

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		errBody, _ := io.ReadAll(resp.Body)
		return nil, fmt.Errorf("API error %d: %s", resp.StatusCode, errBody)
	}

	return io.ReadAll(resp.Body)
}

\section{Handler HTTP}

Ejemplo de handler HTTP

Incorpore este handler a su servidor net/http. Acepta un cuerpo JSON con los campos source y engine, reenvía la solicitud a FormaTeX y transmite la respuesta PDF directamente al cliente.

handler.go
package main

import (
	"bytes"
	"encoding/json"
	"io"
	"net/http"
	"os"
)

func generatePDFHandler(w http.ResponseWriter, r *http.Request) {
	var req struct {
		Source string `json:"source"`
		Engine string `json:"engine"`
	}
	if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
		http.Error(w, "invalid request", http.StatusBadRequest)
		return
	}
	if req.Engine == "" {
		req.Engine = "pdflatex"
	}

	body, _ := json.Marshal(map[string]string{
		"latex":  req.Source,
		"engine": req.Engine,
	})
	apiReq, _ := http.NewRequest("POST",
		"https://api.formatex.io/api/v1/compile",
		bytes.NewReader(body),
	)
	apiReq.Header.Set("X-API-Key", os.Getenv("FORMATEX_API_KEY"))
	apiReq.Header.Set("Content-Type", "application/json")

	resp, err := http.DefaultClient.Do(apiReq)
	if err != nil {
		http.Error(w, "upstream error", http.StatusBadGateway)
		return
	}
	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		w.WriteHeader(http.StatusInternalServerError)
		io.Copy(w, resp.Body)
		return
	}

	w.Header().Set("Content-Type", "application/pdf")
	w.Header().Set("Content-Disposition", "attachment; filename=output.pdf")
	io.Copy(w, resp.Body)
}

\section{Authentication}

Variables de entorno

Guarde su clave de API en el entorno; nunca la escriba directamente en los archivos de código:

apiKey := os.Getenv( "FORMATEX_API_KEY" )
  • → Genere claves de API desde su panel después de registrarse.
  • → Defina FORMATEX_API_KEY en su shell, en el entorno de Docker o en su gestor de secretos.
  • → Todas las solicitudes deben incluir X-API-Key: <key> .

\section{Concurrency}

Compilación concurrente

Use goroutines y sync.WaitGroup para compilar varios documentos en paralelo. Cada goroutine realiza una solicitud HTTP independiente: el modelo de concurrencia de Go encaja de forma natural con la API REST de FormaTeX.

Para lotes grandes, use el endpoint de compilación asíncrona , que devuelve un ID de trabajo que puede consultar periódicamente; es ideal cuando necesita compilar cientos de documentos sin mantener abiertas conexiones HTTP.

\section{Reference}

Referencia de la API

CampoTipoObligatorioDescripción
latexstringSíEl código fuente LaTeX completo como cadena de texto
enginestringNoMotor que se usará. Valor predeterminado: "pdflatex". Opciones: pdflatex, xelatex, lualatex, latexmk

POST https://api.formatex.io/api/v1/compile — Devuelve los bytes del PDF sin procesar si tiene éxito ( 200), o un error JSON si falla (422/ 401).

\section{Gestión de errores}

Gestión de errores

La API devuelve códigos de estado HTTP. Compruebe resp.StatusCode antes de leer el cuerpo:

  • → 200 — bytes del PDF sin procesar. Léalos con io.ReadAll(resp.Body) .
  • → 422 — error de compilación de LaTeX. El cuerpo JSON contiene un campo error con un extracto del registro de TeX.
  • → 401 — clave de API no válida o ausente.

\end{golang}

Empiece a compilar LaTeX desde Go

Obtenga su clave de API y consiga un PDF desde Go en minutos, sin TeX Live.