Pular para o conteúdo principal
Guia para desenvolvedores

Execute o Tesseract como API
ou serviço auto-hospedado.

Envolva o Tesseract em um serviço HTTP com confiança: um endpoint FastAPI de produção, concorrência com pool de processos, uma imagem Docker com pacotes de idioma e verificações de integridade, escalonamento e contrapressão, e implantação serverless — com os trade-offs de privacidade e custo em relação às API OCR gerenciadas.

TL;DR — um serviço mínimo

Envolva a CLI ou o binding pytesseract atrás de HTTP. A imagem nunca sai da sua infraestrutura.

bash
pip install fastapi uvicorn python-multipart pytesseract pillow
# instale primeiro o motor + os pacotes de idioma (ver o guia de instalação)
uvicorn app:app --host 0.0.0.0 --port 8000

Depois chame: curl -F "file=@fatura.png" "http://localhost:8000/ocr?lang=por". O Tesseract é instalado conforme o guia de instalação.

Primeiro, as decisões de design

Três escolhas definem todo o serviço.

DecisãoOpçõesOrientação
Síncrono vs assíncronoRequisição bloqueante vs fila de tarefasSíncrono para imagens individuais de poucos segundos; IDs de tarefa assíncronos para documentos grandes ou em lote.
EntradaUpload multipart vs JSON base64Prefira multipart para imagens binárias; base64 só quando o cliente não pode enviar arquivos (adiciona ~33% de tamanho).
SaídaTexto simples, JSON, hOCR/ALTO, PDF pesquisávelRetorne JSON por padrão; ofereça hOCR para layout e uma URL de download de PDF para arquivos.

Uma intenção principal por endpoint. Mantenha /ocr retornando texto e adicione endpoints separados para PDFs e dados de layout em vez de sobrecarregar uma resposta.

Um serviço Python de produção (FastAPI)

Validação, limites de tamanho, um timeout e OCR fora do event loop.

app.py
import asyncio, io
from concurrent.futures import ProcessPoolExecutor
from fastapi import FastAPI, File, UploadFile, HTTPException, Query
from PIL import Image
import pytesseract

app = FastAPI(title="Tesseract OCR API")
pool = ProcessPoolExecutor(max_workers=4)
MAX_BYTES = 10 * 1024 * 1024  # 10 MB
LANGS = {"eng", "deu", "fra", "por"}

def _ocr(data: bytes, lang: str) -> str:
    image = Image.open(io.BytesIO(data))
    return pytesseract.image_to_string(image, lang=lang)

@app.get("/health")
def health():
    return {"status": "ok"}

@app.post("/ocr")
async def ocr(file: UploadFile = File(...), lang: str = Query("por")):
    if lang not in LANGS:
        raise HTTPException(400, "Idioma não suportado")
    data = await file.read()
    if len(data) > MAX_BYTES:
        raise HTTPException(413, "Arquivo muito grande")
    loop = asyncio.get_running_loop()
    try:
        text = await asyncio.wait_for(loop.run_in_executor(pool, _ocr, data, lang), timeout=30)
    except asyncio.TimeoutError:
        raise HTTPException(504, "O OCR excedeu o tempo")
    return {"text": text, "lang": lang}

Detalhes-chave: lista de idiomas permitidos, aplique um limite de bytes antes de decodificar, execute o OCR em um pool de processos e limite o tempo de relógio. Veja o guia de Python para a API completa do pytesseract.

Coloque em contêiner

Inclua o Tesseract e os pacotes de idioma na imagem para que as réplicas sejam idênticas.

Dockerfile
FROM python:3.12-slim
RUN apt-get update && apt-get install -y --no-install-recommends \
      tesseract-ocr tesseract-ocr-eng tesseract-ocr-por \
      libgl1 libglib2.0-0 && rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
EXPOSE 8000
HEALTHCHECK CMD python -c "import urllib.request;urllib.request.urlopen('http://localhost:8000/health')"
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "2"]

Adicione apenas os pacotes de idioma necessários para manter a imagem pequena. O guia de instalação cobre Docker e a localização do tessdata com mais detalhes.

Concorrência e escalonamento

O OCR é intensivo em CPU: paralelize com processos, não com threads.

Segurança e privacidade

A auto-hospedagem é o principal motivo pelo qual as equipes escolhem o Tesseract.

Plataformas serverless e de contêineres

Tesseract auto-hospedado vs API OCR gerenciadas

DimensãoTesseract auto-hospedadoAPI OCR gerenciada
CustoInfraestrutura fixa; sem taxa por páginaPagamento por requisição/página; escala com o volume
PrivacidadeOs documentos nunca saem da sua redeOs documentos são enviados a terceiros
PrecisãoForte em impressão limpa; ajustável por domínioFrequentemente mais forte em digitalizações difíceis e escrita à mão
ControleTotal: versões, idiomas, modelos personalizadosRoadmap e cotas do fornecedor
OperaçõesVocê opera: escalonamento, atualizações, monitoramentoTotalmente gerenciado

Muitas equipes auto-hospedam o Tesseract para trabalhos de alto volume e sensíveis à privacidade e recorrem a uma API gerenciada apenas para a minoria difícil de documentos.

Perguntas frequentes sobre a API

Como executo o Tesseract OCR como API?

Envolva a CLI ou o pytesseract em FastAPI/Flask, exponha POST /ocr e coloque em contêiner. As imagens permanecem na sua infraestrutura.

Threads ou processos?

Processos. O OCR é intensivo em CPU e o GIL bloqueia o paralelismo de threads; use ProcessPoolExecutor ou subprocessos da CLI.

Uma API auto-hospedada é privada?

Sim: as imagens enviadas são processadas localmente e nunca enviadas a terceiros, ao contrário das API OCR gerenciadas.

Pode rodar serverless?

Sim, em plataformas de contêiner como Cloud Run, imagens de contêiner do Lambda ou Fly.io; cuide das inicializações a frio e do tamanho da imagem com pacotes de idioma.

Que formatos posso retornar?

Texto simples, JSON com confiança, hOCR/ALTO ou um PDF pesquisável via URL de download.