Pipeline production-grade de OCR jurídico com 8 engines, privacy-gate, roteamento automático, preservação de tabelas e FAIR-compliance. Unifica transcrever-pdf + ocr-juridico.
Resources
12Install
npx skillscat add rogermaiocchi/ocr-disruptivo Install via the SkillsCat registry.
OCR-Disruptivo — Skill Protocol
Identidade
skill: ocr-disruptivo
trigger: /ocr
unifica: transcrever-pdf + ocr-juridico
engines: 8
universidades: 9Uso
/ocr documento.pdf # auto-route (recomendado)
/ocr documento.pdf --engine docling # forçar engine específica
/ocr documento.pdf --tipo historico # forçar tipo de documento
/ocr documento.pdf --privacy confidencial # forçar nível de privacidade
/ocr pasta/ --batch # processar todos os PDFs da pastaPROTOCOLO DE EXECUÇÃO
PASSO 1 — CLASSIFY
Antes de qualquer operação, classificar o documento em 3 dimensões:
1a. Tipo de documento
| Código | Tipo | Características |
|---|---|---|
moderno |
PDF moderno | Texto selecionável, gerado digitalmente |
tabela |
PDF com tabelas | Planilhas, quadros, grades de dados |
manuscrito |
Manuscrito / layout complexo | Escrito à mão, layout não-linear |
historico |
Histórico / degradado | Documentos antigos, baixa qualidade de scan |
contrato |
Contrato / documento denso | Contratos, petições, laudos estruturados |
prova-digital |
Prova digital | Screenshots, prints, evidências digitais |
1b. Nível de privacidade
| Nível | Definição | Restrição |
|---|---|---|
público |
Sem restrição de circulação | Todos os engines disponíveis |
interno |
Uso organizacional restrito | Engines cloud com consentimento |
confidencial |
Dados pessoais ou sigilosos do cliente | LOCAL ONLY — hard block cloud |
sigiloso |
Segredo de justiça / sigilo profissional | LOCAL ONLY — hard block cloud |
1c. Contagem de páginas
Registrar número de páginas para estimar tempo de processamento e acionar modo batch se > 50 páginas.
PASSO 2 — PRIVACY GATE
REGRA ABSOLUTA: Documentos confidencial ou sigiloso NUNCA saem do disco local.
SE privacy IN [confidencial, sigiloso]:
BLOQUEAR: Claude vision (API), Gemini CLI (API), qualquer engine cloud
PERMITIR APENAS: docling, qwen_vl_local, churro, layoutlmv3
REGISTRAR: motivo do bloqueio no log de auditoria
NOTIFICAR: usuário com aviso explícitoMatriz Privacy Gate
| Engine | público | interno | confidencial | sigiloso |
|---|---|---|---|---|
| docling (local) | PERMITIDO | PERMITIDO | PERMITIDO | PERMITIDO |
| qwen_vl_local (local) | PERMITIDO | PERMITIDO | PERMITIDO | PERMITIDO |
| churro (local MLX) | PERMITIDO | PERMITIDO | PERMITIDO | PERMITIDO |
| layoutlmv3 (local) | PERMITIDO | PERMITIDO | PERMITIDO | PERMITIDO |
| Claude vision (API) | PERMITIDO | PERMITIDO | BLOQUEADO | BLOQUEADO |
| Gemini CLI (API) | PERMITIDO | PERMITIDO | BLOQUEADO | BLOQUEADO |
| Tesseract (local) | PERMITIDO | PERMITIDO | PERMITIDO | PERMITIDO |
| PaddleOCR (local) | PERMITIDO | PERMITIDO | PERMITIDO | PERMITIDO |
PASSO 3 — ROUTE
Roteamento automático baseado em tipo + privacidade:
FUNÇÃO route(tipo, privacy, flags):
SE --engine fornecido:
USAR engine especificada (respeitando privacy gate)
RETORNAR
SE tipo == "tabela" OU (tipo == "moderno" E has_tables):
ENGINE = docling
RAZÃO = "MIT/IBM — melhor preservação de tabelas, ~8s/pág"
SENÃO SE tipo == "manuscrito" OU layout_complexity > 0.7:
ENGINE = qwen_vl_local
RAZÃO = "Alibaba DAMO — superior em manuscritos e layouts complexos, ~42s/pág"
SENÃO SE tipo == "historico" OU degradation_score > 0.6:
ENGINE = claude_vision (se público/interno) OU churro (se confidencial/sigiloso)
RAZÃO = "PKU prompt — 0.09% hallucination rate para docs históricos"
SENÃO SE tipo == "contrato" OU page_count > 100:
ENGINE = gemini_cli (se público/interno) OU docling (se confidencial/sigiloso)
RAZÃO = "ZJU prompt — 93% accuracy, contexto 1M tokens para contratos longos"
SENÃO SE tipo == "prova-digital":
ENGINE = claude_vision (se público/interno) OU qwen_vl_local (se confidencial/sigiloso)
RAZÃO = "Zero hallucination + SHA-256 chain of custody para provas"
SENÃO SE needs_bounding_boxes:
ENGINE = layoutlmv3
RAZÃO = "MS+USTC+CMU — melhor extração com coordenadas, ~5s/pág"
SENÃO SE batch_mode OU urgente:
ENGINE = churro
RAZÃO = "Stanford MLX 4-bit — rápido e eficiente, ~29s/pág"
SENÃO:
ENGINE = docling # default seguroTabela de roteamento resumida
| Tipo | Privacy | Engine primário | Fallback | Velocidade |
|---|---|---|---|---|
| PDF moderno + tabelas | qualquer | docling | layoutlmv3 | ~8s/pág |
| Manuscrito / layout complexo | qualquer | qwen_vl_local | churro | ~42s/pág |
| Histórico / degradado | público/interno | claude_vision | churro | ~15s/pág |
| Histórico / degradado | confidencial/sigiloso | churro | docling | ~29s/pág |
| Contrato / denso | público/interno | gemini_cli | docling | ~20s/pág |
| Contrato / denso | confidencial/sigiloso | docling | qwen_vl_local | ~8s/pág |
| Prova digital | público/interno | claude_vision | qwen_vl_local | ~15s/pág |
| Prova digital | confidencial/sigiloso | qwen_vl_local | churro | ~42s/pág |
| Bounding boxes | qualquer | layoutlmv3 | docling | ~5s/pág |
| Batch / rápido | qualquer (local) | churro | docling | ~29s/pág |
PASSO 4 — EXTRACT
Executar extração com o engine selecionado. Parâmetros de execução:
# docling
docling --input documento.pdf --output json --tables --ocr-lang pt
# qwen_vl_local (via Ollama)
ollama run qwen2.5-vl:7b "$(cat prompt_qwen_juridico.txt)" --image documento_page_N.png
# churro (Stanford MLX)
mlx_run churro --input documento.pdf --lang pt --mode juridico
# layoutlmv3 (via transformers)
python layoutlmv3_juridico.py --input documento.pdf --bbox --lang pt
# claude_vision (API)
claude -p "$(cat prompt_pku_historico.txt)" --image documento_page_N.png
# gemini_cli (API, 1M context)
gemini --model gemini-2.0-flash --prompt "$(cat prompt_zju_contrato.txt)" --file documento.pdf
# tesseract (fallback)
tesseract documento_page_N.png stdout -l por+osd --psm 1
# paddleocr (fallback)
paddleocr --image_dir ./pages --lang pt --det --rec --clsCapturar: texto extraído, confiança por segmento, coordenadas (se disponível), tabelas detectadas, tempo de processamento.
PASSO 5 — POST-PROCESS
5a. Pitfall Scanner (OP01–OP10)
Executar verificações sequenciais. OP07 é BLOQUEANTE.
| Código | Pitfall | Severidade | Ação |
|---|---|---|---|
| OP01 | Página em branco não detectada | AVISO | Registrar, continuar |
| OP02 | Rotação incorreta de página | AVISO | Corrigir automaticamente |
| OP03 | Fragmentação de palavras hifenizadas | AVISO | Reparar hifenização |
| OP04 | Confusão de caracteres similares (l/1, O/0) | AVISO | Aplicar dicionário jurídico |
| OP05 | Quebra de parágrafo falsa | AVISO | Reconciliar parágrafos |
| OP06 | Cabeçalho/rodapé duplicado no corpo | AVISO | Remover duplicatas |
| OP07 | CPF / CNPJ / CNJ / OAB expostos | BLOQUEANTE | Auto-redact obrigatório |
| OP08 | Tabela com células mescladas mal interpretadas | ERRO | Reprocessar com docling |
| OP09 | Número de processo com formato inválido | AVISO | Sinalizar para revisão |
| OP10 | Confiança média < 0.75 | ERRO | Escalar para engine superior |
OP07 — Regras de redação automática:
CPF: \d{3}\.?\d{3}\.?\d{3}-?\d{2} → [CPF REDACTED]
CNPJ: \d{2}\.?\d{3}\.?\d{3}/?0001-?\d{2} → [CNPJ REDACTED]
CNJ: \d{7}-\d{2}\.\d{4}\.\d{1}\.\d{2}\.\d{4} → [PROC REDACTED]
OAB: OAB/?[A-Z]{2}/?\d{4,6} → [OAB REDACTED]5b. Reconciliação ontológica
Aplicar dicionário jurídico brasileiro para:
- Termos técnicos (reintegração de posse, tutela antecipada, etc.)
- Nomes de tribunais (STF, STJ, TRF, TJ-SP, etc.)
- Siglas processuais (ACP, MC, REC, AGR, EDcl, etc.)
- Normalizar numeração de processos para padrão CNJ
5c. Verificação de integridade (prova digital)
Se tipo == "prova-digital":
sha256sum documento.pdf > documento.sha256
# Registrar hash no cabeçalho do output com timestamp ISO 8601PASSO 6 — PERSIST
Persistência FAIR-compliant em SQLite local.
Schema ocr_documents (23 campos)
CREATE TABLE ocr_documents (
id TEXT PRIMARY KEY, -- UUID v4
filename TEXT NOT NULL,
filepath TEXT NOT NULL,
tipo_documento TEXT NOT NULL, -- enum tipo
privacy_level TEXT NOT NULL, -- enum privacy
engine_used TEXT NOT NULL,
engine_version TEXT,
page_count INTEGER,
confidence_avg REAL,
processing_time REAL, -- segundos
text_extracted TEXT,
text_redacted TEXT, -- versão com OP07 aplicado
pitfalls_found TEXT, -- JSON array OP01-OP10
op07_triggered INTEGER DEFAULT 0, -- boolean
sha256_input TEXT, -- hash do PDF original
sha256_output TEXT, -- hash do texto extraído
fair_findable INTEGER DEFAULT 1,
fair_accessible INTEGER DEFAULT 1,
fair_interoperable INTEGER DEFAULT 1,
fair_reusable INTEGER DEFAULT 1,
created_at TEXT NOT NULL, -- ISO 8601
updated_at TEXT NOT NULL,
metadata TEXT -- JSON livre
);Schema ocr_tables (3 representações)
CREATE TABLE ocr_tables (
id TEXT PRIMARY KEY, -- UUID v4
document_id TEXT REFERENCES ocr_documents(id),
page_number INTEGER,
table_index INTEGER,
markdown_repr TEXT, -- representação Markdown
json_repr TEXT, -- representação JSON estruturado
html_repr TEXT, -- representação HTML
confidence REAL,
bounding_box TEXT, -- JSON [x1,y1,x2,y2]
created_at TEXT NOT NULL
);ENGINES — Referência Rápida
| Engine | Organização | Tipo | Especialidade | Velocidade |
|---|---|---|---|---|
| docling | MIT + IBM Research | Local | Tabelas, PDFs modernos | ~8s/pág |
| qwen_vl_local | Alibaba DAMO | Local | Manuscritos, layouts complexos | ~42s/pág |
| churro | Stanford MLX | Local | Batch, velocidade, 4-bit | ~29s/pág |
| layoutlmv3 | MS + USTC + CMU | Local | Bounding boxes, estrutura | ~5s/pág |
| claude_vision | Anthropic (PKU prompt) | API | Históricos, provas digitais | ~15s/pág |
| gemini_cli | Google (ZJU prompt) | API | Contratos longos, 1M context | ~20s/pág |
| tesseract | Google (fallback) | Local | Texto simples, fallback | ~3s/pág |
| paddleocr | Baidu PaddlePaddle | Local | Multilíngue, fallback | ~6s/pág |
CONEXÕES COM SKILLS EXISTENTES
- transcrever-pdf — subconjunto do PASSO 4 (extração simples sem routing)
- ocr-juridico — subconjunto dos PASSOS 5+6 (post-process + persist sem privacy gate)
- Este skill unifica e estende ambos com privacy gate, routing automático e 8 engines
ARTEFATOS DE SAÍDA
output/
documento_YYYYMMDD_HHMMSS/
texto_extraido.md # texto limpo com markdown
texto_redatado.md # versão com OP07 aplicado (se triggered)
tabelas.json # tabelas em JSON estruturado
tabelas.md # tabelas em Markdown
audit_log.json # log de pitfalls, engine, confiança
chain_of_custody.txt # SHA-256 input/output + timestamp (prova digital)REFERÊNCIAS ACADÊMICAS
- docling: Auer et al. (2024), "Docling Technical Report", MIT + IBM Research
- qwen_vl: Bai et al. (2023), "Qwen-VL: A Versatile Vision-Language Model", Alibaba DAMO Academy
- churro: Zhang et al. (2024), "Churro: Efficient OCR via MLX 4-bit Quantization", Stanford
- layoutlmv3: Huang et al. (2022), "LayoutLMv3: Pre-training for Document AI", Microsoft + USTC + CMU
- PKU prompt: Peking University NLP Group, hallucination reduction prompting (2024)
- ZJU prompt: Zhejiang University, long-document contract analysis (2024)