About this tool
This page pulls Khmer text out of a picture. Drop in a photo or a screenshot of a menu, a sign, a receipt, a printed page or a scanned form, and the recognised text appears in an editable box you can correct, copy, or translate into English in one more click. It handles mixed Khmer and English, keeps each image as a separate output so you can work through several in one session, and lets you delete the ones you no longer need. It is for the everyday case where the words exist only as pixels: a menu you want to read before ordering, a notice photographed in a corridor, a supplier invoice, a page of a textbook, or a screenshot of a chat. The recognition runs in your browser and the image is never uploaded. The translation step is different and does leave your device: the text you have extracted is sent to Google translation, which is why the privacy question below is worth reading before you use it on anything sensitive.
How it works
The extraction is `extractTextFromImage` in `translation-source-input.client.ts`. It loads `tesseract.js`, creates a worker with the English and Khmer language data (`createWorker([eng, khm])`), passes the file to `worker.recognize`, trims the result and terminates the worker in a `finally` block so a failed run does not leave one behind. Because that happens in the page rather than on a server, the image is read locally, and the language data and the WebAssembly engine are downloaded to the browser the first time you use it. The accepted types are JPEG, PNG, WebP and GIF, and the size limit is 10 MB, checked before the worker starts. Recognised text goes into a per-image output object that also holds the file name and size, and the box is editable so you can fix a misread letter before doing anything else. The translate button calls `translateHtml` from `translate-api.client.ts`, which posts the text to `translate-pa.googleapis.com` in chunks of about 1,024 characters with the public API key configured for the site. The copy button copies whichever side you choose, extracted or translated.
Use cases
- Reading a Khmer menu photographed on a phone before ordering
- Turning a photographed notice or sign into text you can search and paste
- Digitising a printed Khmer invoice or receipt so the amounts can be copied into a spreadsheet
- Getting the text out of a screenshot of a Khmer chat to reply to it in a document
- Extracting a page of a Khmer textbook to translate and study sentence by sentence
- Copying an address written in Khmer from a photo into a form without retyping it
- Capturing a page of a locked PDF by screenshot and recovering the text from the image
Frequently asked questions
Does my image leave the browser?
No, not for the recognition step. The OCR runs in your browser with Tesseract.js, so the image itself is never uploaded to this site or to any OCR service. What does leave your device is the text, and only if you press translate: that sends the extracted characters to Google translation. If the image contains something confidential, extract and copy without translating, and the picture stays local.
Which OCR engine does it use?
Tesseract.js, the WebAssembly build of Tesseract, loaded with both the English and the Khmer language data. It is created fresh for each image and terminated afterwards, which is why the first run of a session takes longer than the next. Nothing is sent to a cloud OCR vendor, and there is no account, quota or key needed for the recognition itself.
How accurate is Khmer OCR?
It depends heavily on the image. Clean, well-lit, high-contrast printed Khmer scans well. Low-resolution phone photos, shadowed pages and photographed screens lose accuracy quickly. Khmer is harder than Latin script for OCR because consonants stack into subscripts, vowels wrap around the consonant cluster and words are not separated by spaces, so the engine has fewer cues to recover from. Expect to correct the output rather than accept it.
Can it read handwriting?
Poorly. Tesseract is trained on printed text, and cursive or informal Khmer handwriting is far outside what it handles well; a handwritten note usually comes back as fragments. Printed text photographed at an angle is a better bet than a clean handwritten page. If the source is handwriting, plan on typing it rather than correcting the output.
What are the file limits?
Images must be 10 MB or smaller, and the accepted formats are JPEG, PNG, WebP and GIF. The size is checked before the worker starts, so an oversized file fails immediately with a message rather than after a long wait. Very large dimensions are not resized for you, so a 50-megapixel photo will be slow even under the size limit; cropping to the text area is the quickest fix.
Where exactly does the translated text go?
To Google. The translate button posts the extracted characters to `translate-pa.googleapis.com` using the public translation key configured for this site, in batches of about 1,024 characters. That is a third-party service, so the text is subject to Google handling rather than staying on your device. The recognition step and the translation step therefore have different privacy answers, and the copy buttons work without either.
What if the document is set in the Limon font?
Legacy Limon is a different encoding from Khmer Unicode, and the Khmer model is trained on Unicode script, so a Limon-typeset page usually comes back as nonsense. The fix is to convert the source to Unicode first with the Limon to Unicode converter, or to paste the output into that converter if the letters came out as Latin-looking glyphs. A Unicode document scans far better.
Can I process several images at once?
One at a time, but each result is kept. Every upload or paste adds a new output with its own file name, size, editable text and translation, so you can work through a stack of photos in one session and compare the results. Each output has its own delete control, and nothing is saved when you leave the page, so copy anything you want to keep before closing it.
Data and accuracy
Recognition is `extractTextFromImage` in `translation-source-input.client.ts`, which runs Tesseract.js in the browser with the English and Khmer language data; no image is uploaded. Translation is `translateHtml` in `translate-api.client.ts`, which posts the extracted text to `translate-pa.googleapis.com` in chunks of about 1,024 characters. The output list, editing, copying and deleting are in `khmer-image-to-text-client.tsx`. Content reviewed on 21 October 2026.
Sources
Content last reviewed 21 October 2026