Communitygithub.com

jtepe/slopclub

PDF-Werkzeugkasten für LLM-Agenten: Seiteninfo, Volltextsuche, Textextraktion und Bildextraktion aus PDF-Dokumenten – ideal für subagentengestützte Analyse großer PDFs.

Was ist slopclub?

Das Skill `jtepe/slopclub` stellt ein Python-Skript `pdfread.py` bereit, das speziell für den Einsatz durch LLM-Agenten (z. B. Claude Code) entwickelt wurde. Es ermöglicht die effiziente und deterministische Extraktion von Metadaten, Text, Bildern und gerenderten Seiten aus PDF-Dokumenten. Der Fokus liegt auf ressourcenschonender Arbeit mit großen PDFs: Statt das gesamte Dokument in den Kontext zu laden, kann der Agent zuerst eine Volltextsuche (mit FTS5-Indexierung) durchführen, um relevante Seiten zu identifizieren, und dann nur diese gezielt extrahieren. Dadurch werden Tokens gespart und die Antwortgeschwindigkeit erhöht. Das Skript unterstützt sowohl `uv` (bevorzugt) als auch klassisches Python 3.10+. Es ist besonders nützlich für die Beantwortung punktgenauer Fragen (z. B. „Wo steht die Kündigungsfrist?“) oder für die synthetisierende Zusammenfassung großer Dokumente durch parallele Sub-Agenten.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add jtepe/slopclub

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Verwenden Sie das pdfread.py-Tool neben dieser Datei, um PDFs zu lesen. Führen Sie es auf eine der folgenden Arten aus:

  • Mit uv 0.11+ (bevorzugt): Rufen Sie pdfread.py direkt auf – der Shebang führt es via uv run aus. Beim ersten Aufruf werden Abhängigkeiten heruntergeladen, was etwa eine Minute dauern kann.
  • Ohne uv: python3 pdfread.py … funktioniert mit jedem Python 3.10+, das pymupdf4llm>=0.0.17 installiert hat (pip install pymupdf4llm).

Der Befehl search benötigt SQLite mit FTS5. Von uv verwaltete sowie nahezu alle modernen System-Pythons enthalten dies. Das Skript gibt bei Fehlen eine klare Fehlermeldung aus.

Rufen Sie pdfread.py --help auf, um die vollständige Nutzung anzuzeigen. Kurz gefasst:

  • pdfread.py info DATEI – Seitenanzahl, Metadaten, Gliederung/Inhaltsverzeichnis. Hier beginnen.
  • pdfread.py search DATEI "begriffe" – Seiten, die die Schlüsselwörter erwähnen, BM25-gereiht mit einem Ausschnitt pro Treffer. Die erste Suche erstellt einen zwischengespeicherten Index (Dauer: Sekunden); spätere Suchvorgänge sind sofort. Begriffe werden mit UND verknüpft, begriff* erlaubt Präfix-Suche, --raw schaltet die volle FTS5-Syntax frei ("exakter Satz", ODER, NEAR). Es wird nur die Textebene durchsucht – gescannte Seiten sind unsichtbar.
  • pdfread.py text DATEI --pages 10-25 – Markdown-Text für einen 1-basierten Seitenbereich. Abbildungen erscheinen als [image: p12-img2 640x480px]-Platzhalter.
  • pdfread.py image DATEI p12-img2 – Schreibt diese Abbildung als PNG und gibt den Pfad aus; zeigen Sie sie mit Ihrem Dateilesetool an.
  • pdfread.py images DATEI --pages 12 – Listet die Abbildungs-IDs auf den Seiten auf.
  • pdfread.py render DATEI 7 – Rendert eine ganze Seite (oder mit --rect x0,y0,x1,y1 einen Ausschnitt) als PNG. Dies ist der Fallback für gescannte Seiten und alles, was die Textebene nicht erfasst.

Kontext bei großen PDFs erhalten

Bei punktgenauen Fragen („Wo erwähnt der Vertrag Kündigungsgebühren?“) führen Sie zuerst search aus und lesen Sie nur die Trefferseiten mit text --pages – kein Subagenten-Fan-out nötig. Der Index-Cache wird geteilt, sodass auch Subagenten search nutzen können, ohne ihn neu aufzubauen.

Bei breiter Synthese sollten Sie nicht das gesamte Dokument in die Hauptkonversation übernehmen. Gehen Sie stattdessen so vor:

  1. Führen Sie info aus, um Seitenzahl und Gliederung zu erhalten, und teilen Sie das Dokument in sinnvolle Bereiche ein (pro Kapitel oder etwa 15–25 Seiten).
  2. Starten Sie pro Bereich einen Subagenten mit Anweisungen wie: „Führe <pfad>/pdfread.py text <datei> --pages 10-25 aus und beantworte / fasse in höchstens N Wörtern zusammen. Falls ein [image: ...]-Platzhalter relevant aussieht, extrahiere ihn mit dem Befehl image und sieh ihn dir an.“
  3. Übernehmen Sie nur die Zusammenfassungen/Antworten in die Hauptkonversation und synthetisieren Sie daraus. Greifen Sie selbst nur dann auf bestimmte Seiten zurück, wenn eine Zusammenfassung darauf hinweist, dass die Antwort dort liegt.

Hinweise

  • Es gibt keine OCR: Eine Seite ohne Textebene wird nur als [image: ...]-Platzhalter (oder mit einem Hinweis „kein extrahierbarer Text“) zurückgegeben – extrahieren oder render-Sie sie und lesen Sie das Bild visuell.
  • Extraktion ist deterministisch: Bild-IDs sind über mehrere Ausführungen hinweg stabil, sodass eine von einem Subagenten gemeldete ID später aus der Hauptkonversation extrahiert werden kann.

Verwandte Skills