IESP-UERJ · LEMEP
Pipeline automatizado que combina OCR e modelos de visão para digitalizar e estruturar artigos de páginas de jornal digitalizadas.
01 — Processo
Para cada imagem de página de jornal, o pipeline executa três etapas em sequência. O OCR faz uma leitura rápida do texto bruto, o modelo de visão corrige erros e estrutura os artigos, e os resultados são consolidados em Excel.
Foto ou scan da página do jornal no formato YYYY-MM-DD_PAGINA.jpg
Pytesseract faz a leitura inicial do texto (rápida, mas com erros de ordem e reconhecimento)
pytesseractLLM recebe imagem + texto OCR, corrige erros e extrai artigos estruturados em JSON
grok-4-fastUma linha por artigo, com título, autor, texto completo e metadados de publicação
.xlsx02 — Exemplos
Clique nos artigos para expandir o texto extraído. Use as setas para navegar entre as páginas da amostra.
03 — Guia de uso
O projeto tem dois modos de uso: via notebook Jupyter (recomendado para exploração) ou diretamente pelo Python.
Todas as bibliotecas estão disponíveis via pip:
pip install openai pandas pillow pytesseract openpyxl
O Tesseract é um binário separado que precisa estar instalado antes de rodar:
# macOS
brew install tesseract tesseract-lang
# Linux (Ubuntu/Debian)
sudo apt install tesseract-ocr tesseract-ocr-por
# Windows
# Baixar instalador em github.com/UB-Mannheim/tesseract/wiki
Crie uma conta em openrouter.ai e gere uma chave de API. O modelo padrão usado é x-ai/grok-4-fast.
Os arquivos devem seguir o padrão YYYY-MM-DD_PAGINA.jpg:
imagens/
├── 2012-03-01_002.jpg → 1 de março de 2012, página 2
├── 2012-03-01_003.jpg → 1 de março de 2012, página 3
└── 2012-03-03_002.jpg → 3 de março de 2012, página 2
Abra extractor.ipynb e preencha as 4 variáveis na célula de configuração:
API_KEY = "sua-chave-aqui"
INPUT_FOLDER = "caminho/para/as/imagens"
OUTPUT_XLSX = "resultados.xlsx"
JORNAL_NAME = "FSP"
Depois execute as células em ordem. O script salva progresso automaticamente a cada 20 imagens — se a execução for interrompida, basta rodar de novo e ele continua de onde parou.
from openai import OpenAI
from extractor import process_folder
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key="sua-chave-aqui",
)
df = process_folder(
input_folder="caminho/para/as/imagens",
output_xlsx="resultados.xlsx",
client=client,
news_name="FSP",
)
| Coluna | Descrição | Exemplo |
|---|---|---|
Jornal | Nome do jornal informado | FSP |
Ano | Ano da edição | 2012 |
Arquivo | Nome do arquivo de origem | 2012-03-01_002.jpg |
Data | Data da edição (datetime) | 2012-03-01 |
Página | Número da página | 2 |
Título | Título do artigo | Muito além do câmbio |
Autor | Autor ou "Desconhecido" | Desconhecido |
Texto Associado | Texto completo do artigo | (múltiplos parágrafos) |
Tipo | Editorial ou Artigo de Opinião | Editorial |
Antes de rodar a extração em lote, use detect_missing_pages.ipynb para verificar se há datas ou páginas faltando na coleção de imagens. O notebook gera um relatório .txt com a lista completa de problemas encontrados.