agentleFS
jtepejtepe/slopclub/skills/pdf-reader/SKILL.md

pdf-reader

Skill0 starsChanged 4 months agoApache-2.0View on GitHub

Read PDF files without flooding context — extract page-range text as markdown, pull out figures by ID, render pages to images. Use whenever the user asks about the contents of a PDF file.

  • Installs packages

13 other projects use a version of this.

Adopted by

Most recently taken up by

The file

We split this skill into the rules it gives an agent

4 rules. 0 are common, 1 is distinctive, and 3 are very specific to this project.

  • 0

    Common

    Most of the 10 edited versions we read keep these.

  • 1

    Distinctive

    This author's own choices. Worth a look.

  • 3

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Use the pdfread.py tool next to this file to read PDFs.

    line 7
  2. Very specific:

    Run pdfread.py --help for full usage.

    line 18
  3. Very specific:

    Run info to get the page count and outline, and partition the document into sensible ranges (by chapter, or ~15–25 pages).

    line 45
  4. Distinctive:

    Keep only the summaries/answers in the main conversation and synthesize from those.

    line 51

“Common” is measured: kept by at least 6 in 10 of the 10 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Use the pdfread.py tool next to this file to read PDFs. Run it either way:

  • With uv 0.11+ (preferred): invoke pdfread.py directly — the shebang runs it via uv run, and the first invocation downloads dependencies and may take a minute.
  • Without uv: python3 pdfread.py … works on any Python 3.10+ that has pymupdf4llm>=0.0.17 installed (pip install pymupdf4llm).

The search command needs SQLite with FTS5; uv-managed and nearly all modern system Pythons include it, and the script errors clearly if not.

Run pdfread.py --help for full usage. In short:

  • pdfread.py info FILE — page count, metadata, outline/TOC. Start here.
  • pdfread.py search FILE "terms" — pages mentioning the keywords, BM25-ranked with a snippet per hit. The first search builds a cached index (seconds); later searches are instant. Terms are ANDed, term* matches prefixes, --raw unlocks full FTS5 syntax ("exact phrase", OR, NEAR). Text layer only — scanned pages are invisible to search.
  • pdfread.py text FILE --pages 10-25 — markdown text for a 1-based page range. Figures appear as [image: p12-img2 640x480px] placeholders.
  • pdfread.py image FILE p12-img2 — write that figure as a PNG and print its path; view it with your file-reading tool.
  • pdfread.py images FILE --pages 12 — list figure IDs on pages.
  • pdfread.py render FILE 7 — render a whole page (or --rect x0,y0,x1,y1 crop) to a PNG; the fallback for scanned pages and anything the text layer misses.

Preserving context on large PDFs

For pinpoint questions ("where does the contract mention termination fees?"), run search first and read only the hit pages with text --pages — no subagent fan-out needed. The index cache is shared, so subagents can search too without rebuilding.

For broad synthesis, do not dump a whole document into the main conversation. Instead:

  1. Run info to get the page count and outline, and partition the document into sensible ranges (by chapter, or ~15–25 pages).
  2. Spawn a subagent per range with instructions like: "Run <path>/pdfread.py text <file> --pages 10-25 and answer <the user's question> / summarize in at most N words. If a [image: ...] placeholder looks relevant, extract it with the image command and look at it."
  3. Keep only the summaries/answers in the main conversation and synthesize from those. Re-target specific pages yourself only when a summary indicates the answer lives there.

Notes

  • There is no OCR: a page with no text layer comes back as just its full-page [image: ...] placeholder (or a "no extractable text" note) — extract or render it and read the image visually.
  • Extraction is deterministic: image IDs are stable across runs, so a subagent's reported ID can be extracted later from the main conversation.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.