OCR de PDFs

Open In Colab

Versão notebook (rodável no Colab): examples/notebooks/ocr.ipynb.

labdados.ocr extrai texto de PDFs nativos ou escaneados. Aceita um PDF único, uma lista de PDFs ou uma pasta inteira (varre subpastas).

Receita 1 — Pasta inteira na nuvem

Caso típico: você baixou 200 acórdãos de um tribunal e quer todos virarem arquivos de texto.

import os
import labdados

labdados.ocr(
    arquivos="acordaos_tjsp/",
    api_key=os.environ["LABDADOS_API_KEY"],
    saida="acordaos_txt/",
    formato="md",                 # txt ou md
    idiomas="por",                # apenas português
)
# acordaos_txt/ocr_<id>.zip

Extraia o .zip no mesmo lugar:

cd acordaos_txt && unzip ocr_*.zip

Na nuvem, o modelo padrão é o Azure Document Intelligence (OCR da Microsoft no Azure AI Foundry da FGV). O processamento fica no Brasil.

Receita 2 — PDFs com tabelas e layout complexo (Mistral OCR)

Quando o documento tem várias colunas, formulários ou tabelas, o Mistral OCR devolve markdown e preserva a estrutura:

labdados.ocr(
    arquivos="peticoes/",
    api_key=os.environ["LABDADOS_API_KEY"],
    saida="peticoes_md/",
    modelo="mistral-ocr",
    formato="md",
)
Nota

A primeira chamada depois de um tempo sem uso pode levar alguns minutos (o serviço do escritório “acorda”). As seguintes são rápidas.

Receita 3 — Local, sem API key

Para 5–10 PDFs, dá pra rodar local sem custo nenhum:

pip install labdados[ocr]
# macOS:
brew install tesseract tesseract-lang
# Ubuntu:
sudo apt-get install tesseract-ocr tesseract-ocr-por
import labdados

labdados.ocr(
    arquivos=["sentenca1.pdf", "sentenca2.pdf"],
    local=True,
    idiomas="por+eng",
    formato="md",
    saida="resultados/",
    deskew=True,                 # endireita scans tortos
)
# resultados/sentenca1.md, resultados/sentenca2.md

Receita 4 — Reuso de cliente

Quando o script encadeia várias chamadas:

import os
import labdados

cli = labdados.Client(api_key=os.environ["LABDADOS_API_KEY"])

cli.ocr(arquivos="docs_pdf/", saida="textos/", formato="md")
cli.estruturacao(
    arquivos="textos/",          # textos extraídos pelo OCR acima
    schema={"type": "object", "properties": {"valor_causa": {"type": "number"}}},
    saida="estruturado/",
)

Quando algum PDF dá pau no OCR remoto

O serviço processa todos os PDFs e zip o resultado, mesmo que alguns falhem. Se houver falhas parciais, o error_message da Request guarda o resumo. Para inspecionar:

import os, httpx, labdados

cli = labdados.Client(api_key=os.environ["LABDADOS_API_KEY"])
ultimas = cli._get("/api/v1/requests?limit=5")
for req in ultimas:
    if req.get("error_message"):
        print(req["id"], "→", req["error_message"])

Parâmetros principais

Veja a referência completa para todos os argumentos.

Parâmetro Default Quando mexer
modelo "azure-document-intelligence" (nuvem) / "pymupdf-tesseract" (local) "mistral-ocr" para tabelas e layouts complexos
formato "txt" "md" se quiser preservar listas/títulos
idiomas "por+eng" Para outros idiomas, ver lista do Tesseract
dpi 200 300 para scans pequenos / 150 para PDFs grandes
deskew False True para scans tortos