API de OCR
Base: https://ocr.argentech.online. Esta API habla con los motores ya instalados. No los reemplaza.
- Tesseract 5, en
ocrt.argentech.online. Contrato dePOST /v1/ocr. - PaddleOCR 3.7 (PP-OCRv6 small), en
ocrp.argentech.online. Contrato dePOST /ocrde PaddleX.
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
- Tesseract: 8 MB, PDF hasta 3 páginas, idiomas
spa,eng,spa+eng,eng+spa. - PaddleOCR: 20 MB de archivo, PDF hasta 5 páginas.
- Formatos: PNG, JPEG, TIFF, GIF, BMP, WEBP y PDF.
- Como máximo dos lecturas a la vez. El proxy permite unas 10 por minuto y por IP.
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.
| Argumento | Valores | Por defecto |
|---|---|---|
lang | spa, eng, spa+eng, eng+spa | spa |
psm | 0 a 13, los modos de segmentación de Tesseract | 3 |
El servicio instalado fija --oem 1 (LSTM). Ese argumento no se puede cambiar desde la API.
| psm | Significado |
|---|---|
| 0 | Solo orientación y escritura |
| 1 | Automática, con orientación |
| 2 | Automática, sin orientación |
| 3 | Automática, sin más datos |
| 4 | Una columna de texto variable |
| 5 | Un bloque vertical uniforme |
| 6 | Un bloque uniforme |
| 7 | Una línea |
| 8 | Una palabra |
| 9 | Una palabra dentro de un círculo |
| 10 | Un carácter |
| 11 | Texto disperso |
| 12 | Texto disperso, con orientación |
| 13 | Una 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.
| Campo | Tipo | Notas |
|---|---|---|
file | string, obligatorio | Contenido en base64. PNG, JPEG, TIFF, GIF, BMP, WEBP o PDF. |
fileType | 0 o 1 | 0 = PDF, 1 = imagen. Si se omite, Paddle lo infiere. |
useDocOrientationClassify | boolean | Clasifica la orientación. El servicio arranca con esto apagado. |
useDocUnwarping | boolean | Endereza el documento. Apagado en el servicio instalado. |
useTextlineOrientation | boolean | Orienta cada línea. Apagado en el servicio instalado. |
textDetLimitSideLen | entero 32–4000 | Lado al que se redimensiona antes de detectar. Instalado: 64. |
textDetLimitType | min o max | Si ese lado es el corto o el largo. Instalado: min. |
textDetThresh | número 0–1 | Umbral del mapa de detección. Instalado: 0.3. |
textDetBoxThresh | número 0–1 | Umbral para conservar una caja. Instalado: 0.6. |
textDetUnclipRatio | número 0.1–5 | Cuánto se agranda la caja. Instalado: 1.5. |
textRecScoreThresh | número 0–1 | Puntaje mínimo para devolver un texto. Instalado: 0. |
returnWordBox | boolean | Cajas por palabra, además de la línea. |
visualize | boolean | Imágenes en base64 dentro de la respuesta. Conviene dejarlo en false. |
logId | string | Identificador 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ódigo | Cuándo |
|---|---|
| 400 | Falta un campo, el idioma o un parámetro no está permitido. |
| 401 | Falta el bearer o no coincide. |
| 411 | Falta Content-Length. |
| 413 | El archivo supera el tope del motor. |
| 415 | El formato no es una imagen o un PDF reconocible. |
| 422 | El motor no pudo leer el archivo, o se quedó sin tiempo. |
| 429 | Ya hay dos lecturas en curso, o el proxy cortó por ritmo. |
| 502 | El 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.