PictorLab Tools API

Conversión de documentos · local

tools.pictorlab.ai /health
🔑
Autenticación — todas las rutas /api/* requieren el header X-API-Key: <key>. Las peticiones sin key o con key incorrecta reciben 401 Unauthorized.
Base URL
HTTPS https://tools.pictorlab.ai
Pipeline · Word a PDF
📄
Archivo .docx/.doc
cliente
🔢
Base64 encode
cliente
🌐
POST /api/word-to-pdf
JSON · X-API-Key
Validación
filename · b64 · ext
📂
tmpdir aislado
/tmp/word2pdf_*
⚙️
LibreOffice
headless · timeout 120s
📕
application/pdf
bytes · Content-Disposition
El tmpdir se elimina automáticamente al terminar, con independencia del resultado. Cada request tiene su propio perfil de usuario LibreOffice para evitar conflictos entre llamadas concurrentes.
Pipeline · PDF a imágenes
📕
Archivo .pdf
cliente
🔢
Base64 encode
cliente
🌐
POST /api/pdf-to-image
JSON · X-API-Key
Validación
filename · density 72-300 · format
⚙️
ImageMagick
density DPI · fondo blanco · timeout 180s
🖼️
N imágenes PNG/JPG
page-001, page-002…
🗜️
ZIP comprimido
ZIP_DEFLATED
📦
JSON · zip_b64
+ pages · duration_ms
Las imágenes se generan con fondo blanco opaco. PDFs con transparencias quedan sobre blanco. El ZIP se retorna como Base64 dentro del JSON de respuesta.
POST /api/word-to-pdf Word a PDF

Convierte un archivo .docx o .doc a PDF usando LibreOffice headless. Retorna el PDF directamente como application/pdf.

CampoTipoReq.Descripción
file_b64stringContenido del archivo codificado en Base64
filenamestringNombre del archivo con extensión .docx o .doc
project_idstringIdentificador del proyecto (para auditoría)
requested_bystringEmail o ID del solicitante (para auditoría)
sourcestringOrigen de la llamada (default: "api")
Content-Disposition: attachment; filename="documento.pdf" X-Tool: word-to-pdf X-Duration-Ms: 1240 X-Project-Id: <project_id>

Body: bytes del PDF generado

StatusCondición
400Falta file_b64, extensión inválida, o base64 malformado
401API key ausente o incorrecta
500LibreOffice retornó error o no generó el PDF
504Timeout — conversión superó 120 segundos
DOC_B64=$(base64 -w 0 contrato.docx)

curl -X POST https://tools.pictorlab.ai/api/word-to-pdf \
  -H "X-API-Key: <key>" \
  -H "Content-Type: application/json" \
  -d "{
    \"filename\": \"contrato.docx\",
    \"file_b64\": \"${DOC_B64}\",
    \"project_id\": \"mi-proyecto\",
    \"requested_by\": \"usuario@empresa.com\"
  }" \
  --output contrato.pdf
POST /api/pdf-to-image PDF a imágenes

Convierte cada página de un PDF a una imagen PNG o JPG usando ImageMagick. Retorna un JSON con todas las imágenes empaquetadas en un ZIP codificado en Base64.

CampoTipoReq.Descripción
file_b64stringContenido del PDF codificado en Base64
filenamestringNombre del archivo, debe terminar en .pdf
image_formatstring"png" (default) o "jpg"
densityintegerDPI de salida, 72–300 (default: 200)
project_idstringIdentificador del proyecto (para auditoría)
requested_bystringEmail o ID del solicitante (para auditoría)
sourcestringOrigen de la llamada (default: "api")
{
  "ok": true,
  "tool": "pdf-to-image",
  "filename_in": "catalogo.pdf",
  "filename_out": "catalogo_images.zip",
  "image_format": "png",
  "density": 200,
  "pages": 12,
  "duration_ms": 3420,
  "project_id": "mi-proyecto",
  "requested_by": "usuario@empresa.com",
  "zip_b64": "<base64 del ZIP con page-001.png … page-012.png>"
}
StatusCondición
400Falta file_b64, extensión inválida, image_format inválido, o density fuera de rango (72–300)
401API key ausente o incorrecta
500ImageMagick retornó error o no generó imágenes
504Timeout — conversión superó 180 segundos
PDF_B64=$(base64 -w 0 catalogo.pdf)

RESPONSE=$(curl -s -X POST https://tools.pictorlab.ai/api/pdf-to-image \
  -H "X-API-Key: <key>" \
  -H "Content-Type: application/json" \
  -d "{
    \"filename\": \"catalogo.pdf\",
    \"file_b64\": \"${PDF_B64}\",
    \"image_format\": \"png\",
    \"density\": 200
  }")

# Extraer y guardar el ZIP
echo "$RESPONSE" | python3 -c "
import sys, json, base64
d = json.load(sys.stdin)
open(d['filename_out'], 'wb').write(base64.b64decode(d['zip_b64']))
print(f'{d[\"pages\"]} páginas · {d[\"duration_ms\"]}ms')
"
Notas de implementación