\usepackage{ruby}
Compile LaTeX a PDF desde Ruby con la API REST de FormaTeX. Con el Net::HTTP estándar: sin gemas y sin necesidad de instalar TeX Live.
\section{Por qué Ruby}
La API de FormaTeX es un endpoint HTTPS sencillo. Use la biblioteca estándar de Ruby: sin httparty, sin faraday y sin nada que añadir a su Gemfile.
Incluya una sola acción de controlador en su aplicación Rails para enviar PDF directamente al navegador; no se necesita un trabajo en segundo plano para documentos pequeños.
Olvídese de añadir TeX Live al buildpack de Heroku o a su imagen de Docker. FormaTeX se encarga por completo de la infraestructura de compilación.
\section{Inicio rápido}
El siguiente ejemplo compila un documento LaTeX mínimo y escribe el PDF resultante en disco con el Net::HTTP integrado de Ruby. Sustituya FORMATEX_API_KEY por una clave de su panel .
require 'net/http'
require 'json'
require 'uri'
API_KEY = ENV.fetch('FORMATEX_API_KEY')
API_URL = URI.parse('https://api.formatex.io/api/v1/compile')
def compile_latex(source, engine: 'pdflatex')
http = Net::HTTP.new(API_URL.host, API_URL.port)
http.use_ssl = true
request = Net::HTTP::Post.new(API_URL.path)
request['X-API-Key'] = API_KEY
request['Content-Type'] = 'application/json'
request.body = { latex: source, engine: engine }.to_json
response = http.request(request)
raise "API error #{response.code}: #{response.body}" unless response.code == '200'
response.body
end
latex = <<~'LATEX'
\documentclass{article}
\usepackage{amsmath}
\begin{document}
Hello from Ruby! $E = mc^2$
\end{document}
LATEX
pdf = compile_latex(latex)
File.binwrite('output.pdf', pdf)
puts 'PDF saved to output.pdf'\section{Integración con Rails}
Añada un DocumentsController a su aplicación Rails. La acción compile acepta un cuerpo JSON con los campos source y, opcionalmente, engine, y devuelve el PDF compilado mediante send_data.
# app/controllers/documents_controller.rb
require 'net/http'
require 'json'
require 'uri'
class DocumentsController < ApplicationController
FORMATEX_URL = URI.parse('https://api.formatex.io/api/v1/compile').freeze
# POST /documents/compile
def compile
source = params.require(:source)
engine = params.fetch(:engine, 'pdflatex')
pdf_bytes = call_formatex(source, engine)
send_data pdf_bytes,
type: 'application/pdf',
disposition: 'inline',
filename: 'document.pdf'
rescue => e
render json: { error: e.message }, status: :unprocessable_entity
end
private
def call_formatex(source, engine)
http = Net::HTTP.new(FORMATEX_URL.host, FORMATEX_URL.port)
http.use_ssl = true
http.open_timeout = 5
http.read_timeout = 60
req = Net::HTTP::Post.new(FORMATEX_URL.path)
req['X-API-Key'] = ENV.fetch('FORMATEX_API_KEY')
req['Content-Type'] = 'application/json'
req.body = { latex: source, engine: engine }.to_json
res = http.request(req)
raise "FormaTeX error #{res.code}: #{res.body}" unless res.code == '200'
res.body
end
end\section{Authentication}
Guarde su clave de API en el entorno; nunca la incluya en el control de versiones. Use ENV.fetch para que su aplicación genere un error al iniciar si falta la clave:
API_KEY = ENV.fetch( 'FORMATEX_API_KEY' )
Shell / .env
export FORMATEX_API_KEY=fmtx_…Credenciales de Rails
rails credentials:editHeroku
heroku config:set FORMATEX_API_KEY=fmtx_…\section{Engines}
| Motor | Ideal para |
|---|---|
| pdflatex | Predeterminado. Rápido, ampliamente compatible y adecuado para la mayoría de los documentos |
| xelatex | Texto Unicode, fuentes de sistema personalizadas, escrituras árabe/CJK |
| lualatex | Tipografía avanzada, scripts con Lua, documentos grandes |
| latexmk | Ejecuta automáticamente el número correcto de pasadas para las referencias cruzadas |
\section{Reference}
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| latex | string | Sí | 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 bytes de PDF sin procesar si tiene éxito ( 200), o un error JSON si falla (422/ 401).
\section{Gestión de errores}
Compruebe response.code antes de leer el cuerpo. La API devuelve códigos de estado HTTP estándar:
200 — bytes de PDF sin procesar. Léalos con response.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{ruby}
Obtenga su clave de API y tenga PDF desde Ruby en minutos, sin necesidad de TeX Live.