PDF2TXT + Translator 1.0.0
A single-page, browser-only tool that pulls the text out of a PDF. The document is opened and parsed on your own machine — nothing is uploaded anywhere. There is no server, no account, no sign-up and no tracking code in the app.
What the tool actually does
- Load one file at a time — drag & drop it onto the drop zone or click to choose it. The picker accepts
.pdf,.txt,.mdand.json. - Extract text from a PDF — every page is read with the bundled PDF.js and joined into one plain-text document, with a progress bar (
Page i/total). - Or paste text directly into the paste box and press Load Pasted Text.
- Edit the result in a full-size editor (Select All / Deselect All / Fullscreen).
- Download TXT (
extracted.txt) or Copy All to the clipboard. - Optional language-model steps — Clean, Translate, Validate, or a combined workflow:
Clean → Translate → Validate,Translate → Validate,Clean → Validate,Translate Only,Clean Only. - Translate into 16 target languages offered in the page: English, Spanish, French, German, Italian, Portuguese, Chinese, Japanese, Korean, Russian, Arabic, Hindi, Turkish, Dutch, Polish, Swedish. The text is split at word boundaries and sent one chunk at a time (1,500 characters by default, 2,500 when a
:cloudmodel is chosen), with pause and stop buttons and a token counter. - Settings tab — API source (Proxied
/ollama, Locallocalhost:11434, or a Custom URL), optional API key, Refresh Models (reads/api/tags), and chunk size.
It does not do OCR, batch/multi-file processing, or translation presets. A scanned PDF with no text layer will come out empty.
What you receive
pdf2txt/
├── src/index.html the whole application (HTML + CSS + JS, no build step)
├── vendor/pdf.min.js PDF.js core library
├── vendor/pdf.worker.min.js PDF.js worker
├── docs/USAGE.md step-by-step guide for non-technical users
├── README.md this file
├── CHANGELOG.md
├── LICENSE
└── VERSION
How to run it
The page loads PDF.js as a Web Worker. Some browsers refuse to start a worker from a file:// URL (Chrome blocks it; a headless Chromium on this host happened to allow it), so double-clicking src/index.html may load but extract nothing. If that happens, serve the folder over plain HTTP — no dependencies, Python 3 is enough:
cd products/pdf2txt
python3 -m http.server 8000
Then open http://localhost:8000/src/index.html. Any static web server works the same way; upload the whole pdf2txt folder to any host and open src/index.html.
Optional translation
Translation is off by default in the sense that you must point it at a model. The page talks to an Ollama-compatible API using POST /api/generate. The model used for offline translation is named in the page's Local model list as:
translategemma:latest
To use it entirely offline:
- Install Ollama and run
ollama pull translategemma:latest. - In the app open the Config tab, set API Source to
Local (localhost:11434). - In the Translate section pick
translategemma:latestas the Translation Model. - Choose a target language and press Translate.
Two honest caveats about the shipped defaults:
- The default API Source is
Proxied (/ollama), which expects a server-side proxy at/ollama. On a plain static host useLocalor aCustom URL. - The default Translation Model is
glm-5.3-flash:cloud— a cloud model. For a fully local, offline run you must switch it totranslategemma:latest(or another model you have pulled, such asllama3.2:latestorqwen2.5:7b-instruct).
Without a reachable model endpoint, PDF extraction, editing, copy and TXT download all still work; only the Clean/Translate/Validate buttons fail.
Licence
MIT © 2026 Akan Goksu Valdes — see LICENSE. The files in vendor/ are PDF.js and remain under the Apache License 2.0.