Communitygithub.com

jtepe/slopclub

Ferramentas para leitura e extração de texto de PDFs, com suporte a busca, imagens e renderização.

O que é slopclub?

A habilidade `jtepe/slopclub` fornece um utilitário `pdfread.py` para ler e extrair informações de arquivos PDF diretamente do terminal ou em fluxos de trabalho multiagente. Ela oferece comandos para obter metadados (número de páginas, sumário), buscar por termos com ranqueamento BM25 (usando SQLite FTS5), extrair texto formatado em Markdown por intervalo de páginas, listar e extrair imagens de figuras, e renderizar páginas ou regiões como PNG. A ferramenta é otimizada para preservar contexto em documentos grandes: em vez de despejar o PDF inteiro na conversa principal, recomenda-se particionar o documento e delegar subagentes para ler trechos, mantendo apenas os resumos na conversa. Suporta execução via `uv` (recomendado) ou Python 3.10+ com `pymupdf4llm`. Não possui OCR, portanto páginas escaneadas são retornadas como placeholders de imagem. Cache de índice FTS5 acelera buscas repetidas e é compartilhado entre subagentes.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add jtepe/slopclub

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Use a ferramenta pdfread.py ao lado deste arquivo para ler PDFs. Execute de qualquer uma das seguintes formas:

  • Com uv 0.11+ (preferencial): invoque pdfread.py diretamente — o shebang executa via uv run, e a primeira invocação baixa dependências e pode levar um minuto.
  • Sem uv: python3 pdfread.py … funciona em qualquer Python 3.10+ que tenha pymupdf4llm>=0.0.17 instalado (pip install pymupdf4llm).

O comando search precisa de SQLite com FTS5; Pythons gerenciados por uv e quase todos os Pythons modernos de sistema o incluem, e o script exibe um erro claro caso contrário.

Execute pdfread.py --help para uso completo. Em resumo:

  • pdfread.py info ARQUIVO — contagem de páginas, metadados, sumário/índice. Comece por aqui.
  • pdfread.py search ARQUIVO "termos" — páginas que mencionam as palavras-chave, ranqueadas por BM25 com um trecho por resultado. A primeira busca constrói um índice em cache (segundos); buscas posteriores são instantâneas. Os termos são combinados com E, termo* corresponde a prefixos, --raw ativa a sintaxe completa do FTS5 ("frase exata", OU, PERTODE). Apenas camada de texto — páginas escaneadas são invisíveis para busca.
  • pdfread.py text ARQUIVO --pages 10-25 — texto Markdown para um intervalo de páginas baseado em 1. Figuras aparecem como placeholders [image: p12-img2 640x480px].
  • pdfread.py image ARQUIVO p12-img2 — salva essa figura como PNG e imprime seu caminho; visualize-a com sua ferramenta de leitura de arquivos.
  • pdfread.py images ARQUIVO --pages 12 — lista os IDs das figuras nas páginas.
  • pdfread.py render ARQUIVO 7 — renderiza uma página inteira (ou --rect x0,y0,x1,y1 recorte) como PNG; a alternativa para páginas escaneadas e qualquer coisa que a camada de texto não capturou.

Preservando contexto em PDFs grandes

Para perguntas pontuais ("onde o contrato menciona taxas de resgate?"), execute search primeiro e leia apenas as páginas com resultados com text --pages — sem necessidade de subagentes. O cache do índice é compartilhado, então subagentes também podem usar search sem reconstruí-lo.

Para síntese ampla, não despeje um documento inteiro na conversa principal. Em vez disso:

  1. Execute info para obter a contagem de páginas e o sumário, e divida o documento em intervalos sensatos (por capítulo, ou ~15–25 páginas).
  2. Crie um subagente por intervalo com instruções como: "Execute <caminho>/pdfread.py text <arquivo> --pages 10-25 e responda <à pergunta do usuário> / resuma em no máximo N palavras. Se um placeholder [image: ...] parecer relevante, extraia-o com o comando image e examine-o."
  3. Mantenha apenas os resumos/respostas na conversa principal e sintetize a partir deles. Reconsulte páginas específicas você mesmo apenas quando um resumo indicar que a resposta está ali.

Notas

  • Não há OCR: uma página sem camada de texto retorna apenas seu placeholder [image: ...] de página inteira (ou uma nota "nenhum texto extraível") — extraia ou render a página e leia a imagem visualmente.
  • A extração é determinística: os IDs das imagens são estáveis entre execuções, então o ID reportado por um subagente pode ser extraído posteriormente da conversa principal.

Habilidades Relacionadas