← Voltar a studyAI — Documentação do Projeto

📄 Ingestão de PDFs

studyAI — Documentação do Projeto

Apresentação

Parsing e Ingestão de PDFs — studyAI

Decisões práticas: biblioteca, fallbacks, OCR, tabelas, páginas, scans.


Índice

  1. Biblioteca
  2. Fallback para PDFs problemáticos
  3. OCR
  4. Tabelas
  5. Marcação de páginas
  6. Scans e imagens
  7. Pipeline resumido

Biblioteca

Decisão: pypdf + pdfplumber (ou PyMuPDF)

BibliotecaPrósContras
pypdf (PyPDF2)Leve, texto simplesTabelas mal extraídas
pdfplumberBoa extração de tabelas, layoutMais lento
PyMuPDF (fitz)Rápido, imagensLicença AGPL (cuidado em SaaS)
pdf2image + TesseractOCR para scansPesado, só quando necessário

Escolha: pdfplumber como principal. pypdf como fallback se pdfplumber falhar.

Rationale: pdfplumber extrai texto e tabelas com boa qualidade. pypdf para PDFs que pdfplumber não consegue abrir.


Fallback quando PDF é mau

SituaçãoAção
pdfplumber falha (exceção)Tentar pypdf
pypdf falhaMarcar file status=error, last_error="PDF não suportado"
PDF extrai texto vazioVerificar se é scan → tentar OCR
PDF corrompidostatus=error, não retry (não adianta)

OCR

Quando usar

  • Texto extraído vazio ou muito curto (< 50 chars)
  • PDF é imagem (scan)

Ferramenta

  • Tesseract (pytesseract) — open source
  • pdf2image — converte PDF em imagens por página
  • Pipeline: PDF → imagens → Tesseract por página → texto concatenado

Custo

  • OCR é lento (segundos por página)
  • Usar só quando necessário (texto vazio)
  • Guardar em metadata: parsed_with: "ocr" para analytics

Tabelas

  • pdfplumber: page.extract_tables() devolve listas
  • Conversão: Tabela → Markdown ou texto estruturado
    • Ex: | A | B |\n|---|---|\n| 1 | 2 |
  • Chunking: Tabela inteira como chunk (não partir)
  • Metadata: type: "table", page: N

Marcação de páginas

  • Cada chunk deve ter page ou page_start, page_end em metadata
  • pdfplumber: Iterar pdf.pages, extrair por página
  • Citações: Mostrar "Fonte: documento.pdf, p. 3"

Scans e imagens

  • Detecção: Texto extraído < 10% do tamanho do PDF → provável scan
  • Ação: Tentar OCR (páginas 1–5 como amostra). Se funcionar, processar resto.
  • Limite: PDFs > 50 páginas com OCR podem ser lentos — considerar timeout ou processar em background com prioridade baixa.

Pipeline resumido

PDF file
  → pdfplumber.open()
  → Se falha: pypdf
  → Para cada página:
      → extract_text()
      → Se vazio: pdf2image + Tesseract (OCR)
      → extract_tables() → converter para Markdown
  → Concatenar texto com marcadores de página
  → Chunk (respeitando limites de página em metadata)
  → Embed → Store

Metadata por chunk: page, source, type (text|table), parsed_with (pdfplumber|ocr)

Zona de prática

Sem perguntas. Clica em Editar para adicionar.