High-performance OCR API using FastAPI and Tesseract / API de OCR de alta performance usando FastAPI e Tesseract
This project provides a robust API for Optical Character Recognition (OCR) capable of extracting text from images and PDF documents. It supports multiple languages (English and Portuguese), mixed-language documents, and offers configurable processing modes for speed or accuracy.
- Multi-language Support: English (
eng), Portuguese (por), and mixed (eng+por). - Processing Modes:
fast: Quick extraction for clear documents.accurate: Enhanced preprocessing (rescaling, contrast adjustment) for better results on difficult images.
- Auto-Detection: Orientation and Script Detection (OSD) to handle rotated images or unknown scripts.
- Strict Validation: Validates file types via magic bytes (MIME type verification) to ensure security.
- PDF Support: Extract text from PDF documents (hybrid approach: converts pages to images for robust OCR).
- Dockerized: Optimized multi-stage Docker build for easy deployment.
# Build the image
docker build -t api_ocr .
# Run the container
docker run -p 8080:8080 api_ocrThe API will be available at http://localhost:8080.
Prerequisites: Python 3.12+, uv (dependency manager), poppler-utils (for PDF processing), and Tesseract OCR installed on your system.
# Install dependencies
uv sync
# Run the server
uv run uvicorn app.main:app --reload --port 8080Endpoint: POST /extract_text
Parameters (Form Data):
input_images: List of image files (JPEG, PNG, WEBP, etc.).lang: Language code. Options:eng,por,eng+por(default), orauto.mode: Processing mode. Options:fast(default),accurate.auto_detect: Boolean (true/false). Explicitly enable OSD.
Example (cURL):
curl -X 'POST' \
'http://localhost:8080/extract_text' \
-H 'accept: application/json' \
-H 'Content-Type: multipart/form-data' \
-F 'input_images=@document.jpg;type=image/jpeg' \
-F 'lang=por' \
-F 'mode=accurate'Endpoint: POST /extract_pdf
Parameters (Form Data):
input_file: Single PDF file.lang,mode,auto_detect: Same as image endpoint.force_processing: Boolean (true/false). By default, PDFs with > 10 pages are rejected to save resources. Set this totrueto override the limit.
Example (cURL):
curl -X 'POST' \
'http://localhost:8080/extract_pdf' \
-H 'accept: application/json' \
-H 'Content-Type: multipart/form-data' \
-F 'input_file=@document.pdf;type=application/pdf' \
-F 'force_processing=true'- FastAPI: Handles HTTP requests and validation.
- Tesseract OCR: The core OCR engine.
- Pillow (PIL): Used for image preprocessing in
accuratemode. - pdf2image / Poppler: Converts PDF pages to images for reliable OCR.
- Filetype: Validates image magic bytes securely.
- AsyncIO: OCR tasks run in thread pools to prevent blocking the event loop.
Run tests using pytest:
uv run pytestEste projeto fornece uma API robusta para Reconhecimento Óptico de Caracteres (OCR) capaz de extrair texto de imagens e documentos PDF. Suporta múltiplos idiomas (Inglês e Português), documentos com idiomas mistos e oferece modos de processamento configuráveis para velocidade ou precisão.
- Suporte Multi-idioma: Inglês (
eng), Português (por) e misto (eng+por). - Modos de Processamento:
fast(Rápido): Extração veloz para documentos nítidos.accurate(Preciso): Pré-processamento aprimorado (redimensionamento, ajuste de contraste) para melhores resultados em imagens difíceis.
- Detecção Automática: Detecção de Orientação e Script (OSD) para lidar com imagens rotacionadas ou scripts desconhecidos.
- Validação Rigorosa: Valida tipos de arquivos via magic bytes (verificação de tipo MIME) para garantir segurança.
- Suporte a PDF: Extrai texto de documentos PDF (abordagem híbrida: converte páginas em imagens para OCR robusto).
- Dockerizado: Build Docker multi-estágio otimizado para fácil implantação.
# Construir a imagem
docker build -t api_ocr .
# Rodar o container
docker run -p 8080:8080 api_ocrA API estará disponível em http://localhost:8080.
Pré-requisitos: Python 3.12+, uv (gerenciador de dependências), poppler-utils (para processamento de PDF) e Tesseract OCR instalado no sistema.
# Instalar dependências
uv sync
# Rodar o servidor
uv run uvicorn app.main:app --reload --port 8080Endpoint: POST /extract_text
Parâmetros (Form Data):
input_images: Lista de arquivos de imagem (JPEG, PNG, WEBP, etc.).lang: Código do idioma. Opções:eng,por,eng+por(padrão) ouauto.mode: Modo de processamento. Opções:fast(padrão),accurate.auto_detect: Booleano (true/false). Habilita explicitamente o OSD.
Exemplo (cURL):
curl -X 'POST' \
'http://localhost:8080/extract_text' \
-H 'accept: application/json' \
-H 'Content-Type: multipart/form-data' \
-F 'input_images=@documento.jpg;type=image/jpeg' \
-F 'lang=por' \
-F 'mode=accurate'Endpoint: POST /extract_pdf
Parâmetros (Form Data):
input_file: Arquivo PDF único.lang,mode,auto_detect: Iguais ao endpoint de imagem.force_processing: Booleano (true/false). Por padrão, PDFs com mais de 10 páginas são rejeitados para economizar recursos. Defina comotruepara ignorar o limite.
Exemplo (cURL):
curl -X 'POST' \
'http://localhost:8080/extract_pdf' \
-H 'accept: application/json' \
-H 'Content-Type: multipart/form-data' \
-F 'input_file=@documento.pdf;type=application/pdf' \
-F 'force_processing=true'- FastAPI: Gerencia requisições HTTP e validação.
- Tesseract OCR: O motor principal de OCR.
- Pillow (PIL): Usado para pré-processamento de imagens no modo
accurate. - pdf2image / Poppler: Converte páginas de PDF em imagens para OCR confiável.
- Filetype: Valida magic bytes de imagens de forma segura.
- AsyncIO: Tarefas de OCR rodam em thread pools para não bloquear o event loop.
Execute os testes usando pytest:
uv run pytest