Pull the text out of any PDF, in your own browser. Nothing is uploaded.
No subscription. The download link is yours to keep — re-download any time.
Everything below is in the app you download — no add-ons, no upsell.
The PDF is parsed in the tab with PDF.js. No upload, no account, no tracking code, no server bill.
Progress bar while it walks the document, then one editable text block you can clean up.
One click for a file, one for the clipboard.
Point it at a local model and it will clean up OCR noise or translate into 16 languages, 1,500 characters at a time, with pause and stop.
Not every source is a PDF — the paste box takes notes, e-mails, anything.
The whole package, nothing hidden behind a plan:
CHANGELOG.md
LICENSE
README.md
VERSION
docs/USAGE.md
src/index.html
vendor/pdf.min.js
vendor/pdf.worker.min.js
Any modern browser. Python 3 only to serve the folder — or any static host.
No OCR: a scanned PDF with no text layer comes out empty.
One file at a time — there is no batch mode.
Browsers refuse to start a Web Worker from file://, so serve the folder (python3 -m http.server). Double-clicking the file extracts nothing.
Straight answers, including the ones that cost a sale.
No. The PDF never leaves the browser tab. Translation is the only step that talks to anything, and only to a model endpoint you point it at.
No account. Only if you use the optional translation and point it at a hosted endpoint do you need that endpoint's key.
PDF.js runs as a Web Worker and browsers block workers on file://. Serve the folder over HTTP — one command, no install.
Only if the scanner already added a text layer. There is no OCR.
Yes — set API Source to Local, run ollama pull translategemma:latest, and pick that model. Fully offline.
A bug, a missing feature, a question before you buy — this goes to the operator, not to a ticket system. How feedback works →