Pipeline OCR: detection + recognition
Separe mentalmente dois problemas: onde está o texto (detection, responde com polígonos) e o que o texto diz (recognition, responde com string). Soluções end-to-end (PaddleOCR, Tesseract) escondem isso; soluções híbridas (DBNet + TrOCR) expõem e dão mais controle.
PaddleOCR: default sensato em 2026
from paddleocr import PaddleOCR
ocr = PaddleOCR(use_angle_cls=True, lang="pt")
result = ocr.ocr("nota-fiscal.jpg", cls=True)
for line in result[0]:
box, (text, conf) = line
print(f"[{conf:.2f}] {text}")PaddleOCR é open-source (Apache-2.0), rápido em CPU, suporta 80+ idiomas, detection DBNet + recognition CRNN + classifier de ângulo. Para 80% dos casos (notas fiscais, placas, menus), é o ponto de partida correto.
TrOCR para manuscritos
from transformers import TrOCRProcessor, VisionEncoderDecoderModel
from PIL import Image
import torch
processor = TrOCRProcessor.from_pretrained("microsoft/trocr-base-handwritten")
model = VisionEncoderDecoderModel.from_pretrained("microsoft/trocr-base-handwritten").to("cuda")
def recognize_line(crop_pil):
pixel_values = processor(images=crop_pil, return_tensors="pt").pixel_values.to("cuda")
ids = model.generate(pixel_values, max_length=128)
return processor.batch_decode(ids, skip_special_tokens=True)[0]
line_crop = Image.open("manuscrito-linha.png")
print(recognize_line(line_crop))AWS Textract: extração estruturada
import boto3
textract = boto3.client("textract", region_name="us-east-1")
with open("fatura.pdf", "rb") as f:
resp = textract.analyze_document(
Document={"Bytes": f.read()},
FeatureTypes=["FORMS", "TABLES"],
)
# Extrair key-value pairs
blocks = resp["Blocks"]
kv = {b["Id"]: b for b in blocks}
for b in blocks:
if b["BlockType"] == "KEY_VALUE_SET" and "KEY" in b.get("EntityTypes", []):
# resolver relationships pra achar VALUE correspondente
passLayout analysis e tabelas
Tabela é o pesadelo do OCR: linhas implícitas, células mescladas, headers em múltiplos níveis. Ferramentas especializadas: Textract (Tables feature), PaddleOCR Structure, Docling (IBM 2024), LayoutLMv3 para classificar tokens em header/row/cell.
Jamais confie 100% em OCR de documento fiscal/legal sem validação — sempre tenha confidence threshold + regra de negócio (ex.: CPF válido, soma de tabela fecha). OCR é probabilístico; contabilidade não é.
Árvore de decisão 2026
Texto impresso limpo e volume baixo: PaddleOCR. Manuscrito ou fonte rara: DBNet + TrOCR. Documento estruturado com campos (KV, tabelas) em produção: Textract/Azure DI. Scale >10M páginas/mês: vale investigar pipeline custom com PaddleOCR fine-tuned + LayoutLMv3.