-
Star
(251)
You must be signed in to star a gist -
Fork
(20)
You must be signed in to fork a gist
-
-
Save pnc/b7fb38d70f157cd40595d9e52bebc055 to your computer and use it in GitHub Desktop.
#!/bin/bash | |
set -e | |
CONTENTS=$(tesseract -c language_model_penalty_non_dict_word=0.8 --tessdata-dir /usr/local/share/tessdata/ "$1" stdout -l eng | xml esc) | |
hex=$((cat <<EOF | |
<?xml version="1.0" encoding="UTF-8"?> | |
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |
<plist version="1.0"> | |
<string>$CONTENTS</string> | |
</plist> | |
EOF | |
) | plutil -convert binary1 - -o - | xxd -p | tr -d '\n') | |
xattr -w -x com.apple.metadata:kMDItemFinderComment "$hex" "$1" | |
mdimport "$1" |
To index, say, your whole Desktop in parallel:
chmod a+x ocr-shot.sh
find ~/Desktop -name "Screen Shot*" -print0 | xargs -0 -P 4 -n 1 ./ocr-shot.sh
You can run this automatically for screenshots by enabling this Folder Action with Automator. The only tweak is to fully qualify the paths to tesseract
and xml
, since Automator doesn't know about your user's PATH.
Workflow is here (don't forget to brew install tesseract xmlstarlet
first!): https://philcalvin.s3.amazonaws.com/downloads/ocr-screenshots.workflow.zip
If you screenshot individual windows, the alpha channel prevents Tesseract from scanning properly. Also a lot of UI text is too small to accurately scan. To solve this I preprocessed with ImageMagick like so:
CONTENTS=$(convert "$1" -magnify -alpha remove - | tesseract -c language_model_penalty_non_dict_word=0.8 --tessdata-dir /usr/local/share/ stdin stdout -l eng | xml esc)
Testing with a screenshot of my Terminal, I got better results with -magnify
than -adaptive-resize '200%x200%'
, but YMMV.
This is wonderful. Is there any reason not to run this on all image files on my machine? Are there drawbacks to carrying the extra extended attributes?
@sclarke shouldn't be any downsides, only larger indexes (but not too daunting).
For @amake tip you have to brew install imagemagick
. And if you need other languages than englisch, you need to install brew install --with-all-languages tesseract
and change the -l
argument on tesseract
. For example if you want to recognize english and german use l eng+deu
.
any plan to support ocr pdf files?
This script is very helpful - thank you for sharing it.
I'm running macos 10.13.6 and needed to modify ocr-shot.sh to specify
--tessdata-dir /usr/local/share/tessdata/
vs
--tessdata-dir /usr/local/share/
ocr-shot.sh is now working as designed.
two notes:
- I'm getting
"Warning: Invalid resolution 0 dpi. Using 70 instead."
macos-native and Firefox screenshots are 72 dpi. I'll look into where I can set that explicitly.
- I presumed ocr-shot.sh's file meta additions would 1) change files' modified timestamp and 2) appear in either Finder or Preview Get Info views. Neither is the case. Adding the extracted text to files' Comments or Annotations could be useful.
why cannot Automator run the workflow, asserting "line 4 tesseract command not found"?
Probably needs
brew install tesseract xmlstarlet
.