Volver a la consola · OpenAPI

API de OCR

Base: https://ocr.argentech.online. Esta API habla con los motores ya instalados. No los reemplaza.

Todas las llamadas de lectura piden Authorization: Bearer <OCR_API_KEY>. También se acepta X-Api-Key. GET /health, GET /docs y GET /openapi.json no piden clave.

El campo file de Paddle, en esta API, es el archivo en base64. No se aceptan URLs: el gateway no descarga documentos.

Límites

POST /v1/ocr

Un solo endpoint para la consola y para clientes. Cuerpo multipart/form-data con el campo file y engine (tesseract o paddle). El resto de los campos son los de cada motor, documentados abajo.

Respuesta 200:

{
  "engine": "tesseract",
  "text": "texto reconocido",
  "pages": 1,
  "raw": {}
}

raw es la respuesta original del motor.

curl -sS -H "Authorization: Bearer $OCR_API_KEY" \
  -F "engine=tesseract" -F "lang=spa" -F "psm=3" \
  -F "file=@pagina.png" \
  https://ocr.argentech.online/v1/ocr

POST /v1/tesseract/ocr

Los mismos argumentos que POST /v1/ocr de ocrt.argentech.online. El cuerpo puede ser el archivo en crudo o multipart/form-data con el campo file (o image). lang y psm van en la query o en el formulario.

ArgumentoValoresPor defecto
langspa, eng, spa+eng, eng+spaspa
psm0 a 13, los modos de segmentación de Tesseract3

El servicio instalado fija --oem 1 (LSTM). Ese argumento no se puede cambiar desde la API.

psmSignificado
0Solo orientación y escritura
1Automática, con orientación
2Automática, sin orientación
3Automática, sin más datos
4Una columna de texto variable
5Un bloque vertical uniforme
6Un bloque uniforme
7Una línea
8Una palabra
9Una palabra dentro de un círculo
10Un carácter
11Texto disperso
12Texto disperso, con orientación
13Una línea, sin el modelo de Tesseract

Respuesta 200, igual que ocrt: {"text","lang","pages"}.

curl -sS -H "Authorization: Bearer $OCR_API_KEY" \
  -H "Content-Type: image/png" \
  --data-binary @pagina.png \
  "https://ocr.argentech.online/v1/tesseract/ocr?lang=spa&psm=6"

POST /v1/paddle/ocr

Los campos de InferRequest que publica el OpenAPI de PaddleX en el contenedor (POST /ocr). Cuerpo application/json.

CampoTipoNotas
filestring, obligatorioContenido en base64. PNG, JPEG, TIFF, GIF, BMP, WEBP o PDF.
fileType0 o 10 = PDF, 1 = imagen. Si se omite, Paddle lo infiere.
useDocOrientationClassifybooleanClasifica la orientación. El servicio arranca con esto apagado.
useDocUnwarpingbooleanEndereza el documento. Apagado en el servicio instalado.
useTextlineOrientationbooleanOrienta cada línea. Apagado en el servicio instalado.
textDetLimitSideLenentero 32–4000Lado al que se redimensiona antes de detectar. Instalado: 64.
textDetLimitTypemin o maxSi ese lado es el corto o el largo. Instalado: min.
textDetThreshnúmero 0–1Umbral del mapa de detección. Instalado: 0.3.
textDetBoxThreshnúmero 0–1Umbral para conservar una caja. Instalado: 0.6.
textDetUnclipRationúmero 0.1–5Cuánto se agranda la caja. Instalado: 1.5.
textRecScoreThreshnúmero 0–1Puntaje mínimo para devolver un texto. Instalado: 0.
returnWordBoxbooleanCajas por palabra, además de la línea.
visualizebooleanImágenes en base64 dentro de la respuesta. Conviene dejarlo en false.
logIdstringIdentificador opcional, hasta 128 caracteres imprimibles.

La respuesta 200 es la de PaddleX: logId, errorCode 0, errorMsg y result.ocrResults[]. El texto de cada página está en prunedResult.rec_texts, con rec_scores y rec_boxes.

B64=$(base64 < pagina.png | tr -d '\n')
curl -sS -H "Authorization: Bearer $OCR_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{\"file\":\"$B64\",\"fileType\":1,\"textDetLimitSideLen\":64,\"textDetLimitType\":\"min\"}" \
  https://ocr.argentech.online/v1/paddle/ocr

Errores

CódigoCuándo
400Falta un campo, el idioma o un parámetro no está permitido.
401Falta el bearer o no coincide.
411Falta Content-Length.
413El archivo supera el tope del motor.
415El formato no es una imagen o un PDF reconocible.
422El motor no pudo leer el archivo, o se quedó sin tiempo.
429Ya hay dos lecturas en curso, o el proxy cortó por ritmo.
502El motor no respondió.

El cuerpo de error de esta API es {"error":"mensaje"}. Si el motor responde con su propio JSON de error, /v1/tesseract/ocr y /v1/paddle/ocr lo reenvían tal cual.

Estado

curl -sS https://ocr.argentech.online/health

status vale ok cuando los dos motores responden, y degraded si alguno no. engines.tesseract y engines.paddle pueden ser ok, starting o down.

Desde otro contenedor

En la red proxy-net: http://api-ocr:8080 con la misma clave. Los motores siguen en http://api-ocrt:8080 y http://api-paddleocr:8080, cada uno con su propia clave.