\usepackage{golang}
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.
\section{Por qué Go}
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.
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.
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}
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") .
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}
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.
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}
Guarde su clave de API en el entorno; nunca la escriba directamente en los archivos de código:
apiKey := os.Getenv( "FORMATEX_API_KEY" )
FORMATEX_API_KEY en su shell, en el entorno de Docker o en su gestor de secretos. X-API-Key: <key> .\section{Concurrency}
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}
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| latex | string | Sí | El código fuente LaTeX completo como cadena de texto |
| engine | string | No | Motor 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}
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}
Obtenga su clave de API y consiga un PDF desde Go en minutos, sin TeX Live.