IESP-UERJ  ·  LEMEP

Extração de Textos
de Páginas de Jornal

Pipeline automatizado que combina OCR e modelos de visão para digitalizar e estruturar artigos de páginas de jornal digitalizadas.

pytesseract openrouter LLM openpyxl

Como funciona

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.

🗞️ entrada
Imagem JPG

Foto ou scan da página do jornal no formato YYYY-MM-DD_PAGINA.jpg

1 600 × 2 770 px
🔍 etapa 1
OCR

Pytesseract faz a leitura inicial do texto (rápida, mas com erros de ordem e reconhecimento)

pytesseract
🤖 etapa 2
API de Visão

LLM recebe imagem + texto OCR, corrige erros e extrai artigos estruturados em JSON

grok-4-fast
📊 saída
Excel

Uma linha por artigo, com título, autor, texto completo e metadados de publicação

.xlsx

Extrações em ação

Clique nos artigos para expandir o texto extraído. Use as setas para navegar entre as páginas da amostra.

Como rodar o extrator

O projeto tem dois modos de uso: via notebook Jupyter (recomendado para exploração) ou diretamente pelo Python.

  1. Instalar dependências Python

    Todas as bibliotecas estão disponíveis via pip:

    pip install openai pandas pillow pytesseract openpyxl
  2. Instalar o Tesseract OCR no sistema

    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
  3. Obter chave de API do OpenRouter

    Crie uma conta em openrouter.ai e gere uma chave de API. O modelo padrão usado é x-ai/grok-4-fast.

  4. Organizar as imagens

    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
  5. Executar pelo notebook (recomendado)

    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.

  6. Ou executar pelo Python diretamente

    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",
    )

Estrutura do Excel gerado

Coluna Descrição Exemplo
JornalNome do jornal informadoFSP
AnoAno da edição2012
ArquivoNome do arquivo de origem2012-03-01_002.jpg
DataData da edição (datetime)2012-03-01
PáginaNúmero da página2
TítuloTítulo do artigoMuito além do câmbio
AutorAutor ou "Desconhecido"Desconhecido
Texto AssociadoTexto completo do artigo(múltiplos parágrafos)
TipoEditorial ou Artigo de OpiniãoEditorial

Verificação de integridade da coleção

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.