\usepackage{golang}
Compilez du LaTeX en PDF depuis Go avec l'API REST FormaTeX. Le net/http standard : aucun binaire externe, aucune installation de TeX Live requise.
\section{Pourquoi Go}
Inutile d'embarquer TeX Live dans votre image Docker. FormaTeX gère la compilation côté serveur : votre binaire Go reste léger.
L'API FormaTeX est un simple point de terminaison HTTP. Utilisez la bibliothèque standard : pas de SDK spécial, pas de nouvelle dépendance dans votre go.mod.
Utilisez des goroutines et sync.WaitGroup pour compiler plusieurs documents en parallèle. L'API gère les requêtes concurrentes sans limiter le débit de vos goroutines.
\section{Démarrage rapide}
L'exemple ci-dessous compile un document LaTeX minimal et écrit le PDF obtenu sur le disque. Remplacez your-api-key par une clé de votre tableau de bord . En production, lisez-la depuis 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{Gestionnaire HTTP}
Intégrez ce gestionnaire à votre serveur net/http. Il accepte un corps JSON avec les champs source et engine, transmet la requête à FormaTeX et renvoie la réponse PDF directement au client.
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}
Stockez votre clé API dans l'environnement, sans jamais l'écrire en dur dans les fichiers source :
apiKey := os.Getenv( "FORMATEX_API_KEY" )
FORMATEX_API_KEY dans votre shell, votre environnement Docker ou votre gestionnaire de secrets. X-API-Key: <key> .\section{Concurrency}
Utilisez des goroutines et sync.WaitGroup pour compiler plusieurs documents en parallèle. Chaque goroutine effectue une requête HTTP indépendante : le modèle de concurrence de Go s'adapte naturellement à l'API REST FormaTeX.
Pour les gros lots, utilisez le point de terminaison de compilation asynchrone qui renvoie un ID de job que vous pouvez interroger, idéal pour compiler des centaines de documents sans garder de connexions HTTP ouvertes.
\section{Reference}
| Champ | Type | Requis | Description |
|---|---|---|---|
| latex | string | Oui | Code source LaTeX complet sous forme de chaîne |
| engine | string | Non | Moteur à utiliser. Par défaut : "pdflatex". Options : pdflatex, xelatex, lualatex, latexmk |
POST https://api.formatex.io/api/v1/compile : renvoie les octets bruts du PDF en cas de succès ( 200), ou une erreur JSON en cas d'échec (422/ 401).
\section{Gestion des erreurs}
L'API renvoie des codes de statut HTTP. Vérifiez resp.StatusCode avant de lire le corps :
200 : octets bruts du PDF. À lire avec io.ReadAll(resp.Body) .422 : erreur de compilation LaTeX. Le corps JSON contient un champ error avec un extrait du journal TeX.401 : clé API invalide ou manquante.\end{golang}
Obtenez votre clé API et générez des PDF depuis Go en quelques minutes, sans TeX Live.