Obsidian OCR, tested on a real scanned PDF
0
of 1,955 scan words, searchable in Omnisearch
Omnisearch reads PDF text, not scans
Omnisearch reads PDFs and images through the Text Extractor plugin. "PDFs content indexing" and "Images OCR indexing" are off by default.
Text Extractor reads PDFs with pdf-extract, with no OCR. I ran the PDF code from its 0.7.0 release on a 10-page scan. It gave back 10 empty pages.
In the 11-page file, it read the typed cover page, 13 of 13 words, and nothing on the scanned pages.
The fix: OCRmyPDF first
fix.sh adds a hidden text layer. --skip-text leaves typed
pages as they are:
ocrmypdf --skip-text --jobs 2 book.pdf book-ocr.pdf
Then put book-ocr.pdf in your vault.
1,864 of 1,955 words, in order
29 s for 10 pages
The 11-page file kept all 13 cover words. Text Extractor caches by file path. If you replace a PDF under the same name, right-click it: Text Extractor, then Clear cache for this file.
Page images: turn on system OCR
Text Extractor reads images with tesseract.js 3.0.3. On a Mac, its "Use system OCR" setting uses Apple's OCR instead. I gave both the scan's 10 page JPGs.
| Setting | Words in order | Time |
|---|---|---|
| Default (tesseract.js) | 1,857 | 61 s |
| Use system OCR | 1,929 | 23 s |
System OCR is for Macs only. On phones, Text Extractor reads no files. It uses text that a computer read and synced.
German: set the language first
The default OCR language is English. I gave it 3 German pages. One is a magazine page with two columns.
| Setting | Umlauts, of 206 | Two columns, of 972 |
|---|---|---|
| English (default) | 0 | 398 |
| German | 146 | 486 |
| Use system OCR | 153 | 595 |
System OCR finds the language by itself.
Apple's OCR beat our Actor on English
Our Actor makes Markdown from a file URL, with no install:
curl -s -X POST "https://api.apify.com/v2/acts/brasspage~pdf-ocr-to-markdown/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"documentUrls": ["https://api.apify.com/v2/key-value-stores/sTnmNrGoSsi7tLQvs/records/anythingllm-mixed-11-pages.pdf"]}' \
| jq -r '.[].markdown' > mixed.md
| Test | System OCR | Actor |
|---|---|---|
| Scan words in order | 1,929 | 1,874 |
| Umlauts | 153 | 192 |
| Two columns, in order | 595 | 954 |
| Time a page | 2.3 s | 12.1 s |
Apple's OCR is free and stays on your Mac. The Actor works on any computer, read German and two columns better, and costs $0.006 a page.
How I tested it
- Scan: the 10 pages of OCR in n8n, proofread Wikisource book scans, 1,955 true words. The 11-page file adds the 13-word typed cover page of AnythingLLM OCR.
- German: the 3 pages of Paperless-ngx OCR, 1,887 words, 206 umlauts. Page images: the scans' own JPGs, from pdfimages.
- Obsidian itself did not run. I ran Text Extractor 0.7.0's code in Node: the PDF worker from its main.js, its tesseract.js 3.0.3 calls, and its system OCR AppleScript.
- Score: true words found in order, with the scorer of the tessdata test. German: the scorer of Tesseract German.
- OCRmyPDF 17.13.0, Tesseract 5.5.4, macOS 26.6, Apple Silicon. One worker at the lowest priority. The code blocks above are the files that ran. The Actor: two real runs, build 0.1.65.
What I did not test
- The Obsidian app, phones, Windows and Linux.
- AI plugins that send images to a model service.
- Handwriting.
Two ways to skip the work
Run it yourself. Our Apify Actor turns scanned PDFs into Markdown, tables included.
Or send us the scan. Tack, our AI, does the job for $29, up to 50 pages. First page free.
Questions people ask
Can Omnisearch search scanned PDFs?
Not as they are. Text Extractor, which reads PDFs for Omnisearch, has no OCR for PDFs. It found 0 of 1,955 words in a 10-page scan, and 1,864 after OCRmyPDF.
Which Text Extractor setting reads images best?
On a Mac, Use system OCR. On 10 page images it read 1,929 of 1,955 words in order in 23 s. The default, tesseract.js, read 1,857 in 61 s.
How do I OCR German in Obsidian?
Add German to Text Extractor's OCR languages, or turn on system OCR on a Mac. With the default English, 3 German pages kept 0 of 206 umlauts. German kept 146, system OCR 153.
Related guides
- OCRmyPDF "page already has text": which flag to use
- Apple Vision OCR vs Tesseract, same book scans
- Tesseract OCR in Node.js, tested on 55 scans
- Zotero OCR plugin, tested: steps, languages, file size
- Marker OCR for scanned PDFs: setup and results, tested
- Surya OCR on a scanned PDF: setup and results, tested
- Joplin OCR for scanned PDFs: what it reads, tested