Apresentação
Parsing e Ingestão de PDFs — studyAI
Decisões práticas: biblioteca, fallbacks, OCR, tabelas, páginas, scans.
Índice
- Biblioteca
- Fallback para PDFs problemáticos
- OCR
- Tabelas
- Marcação de páginas
- Scans e imagens
- Pipeline resumido
Biblioteca
Decisão: pypdf + pdfplumber (ou PyMuPDF)
| Biblioteca | Prós | Contras |
|---|---|---|
| pypdf (PyPDF2) | Leve, texto simples | Tabelas mal extraídas |
| pdfplumber | Boa extração de tabelas, layout | Mais lento |
| PyMuPDF (fitz) | Rápido, imagens | Licença AGPL (cuidado em SaaS) |
| pdf2image + Tesseract | OCR para scans | Pesado, 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ção | Ação |
|---|---|
| pdfplumber falha (exceção) | Tentar pypdf |
| pypdf falha | Marcar file status=error, last_error="PDF não suportado" |
| PDF extrai texto vazio | Verificar se é scan → tentar OCR |
| PDF corrompido | status=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 |
- Ex:
- Chunking: Tabela inteira como chunk (não partir)
- Metadata:
type: "table",page: N
Marcação de páginas
- Cada chunk deve ter
pageoupage_start,page_endem 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.