Skip to main content

Native OCR library using platform-specific frameworks (macOS Vision, Windows Runtime OCR)

Project description

natocr

natocr (native ocr) is a small Python wrapper around the OCR engines that already ship with macOS and Windows: Vision framework on macOS and Windows Runtime OCR on Windows.

These built-in engines are generally faster, more efficient, and more accurate than third-party alternatives like Tesseract. natocr makes reaching for them painless via one clean Python API instead of wrangling with Objective-C bridges or WinRT async plumbing.

Install

pip install natocr[macos]      # on macOS
pip install natocr[windows]    # on Windows

Quick start

from natocr import OCR

ocr = OCR()                    # defaults to english
result = ocr.recognize("invoice.png")

print(result.text)
Invoice #1042 Total $58.20 Thank you!

Confidence Scores and Bounding Boxes

recognize() returns an OCRResult. Beyond the flat .text, you get a per-detection breakdown with bounding boxes and (on macOS) confidence scores:

result = ocr.recognize("receipt.png")

print(result.confidence)          # average confidence, or None if unavailable

for element in result.elements:
    box = element.bounds.bounds   # (x, y, width, height) in pixels
    print(f"{element.text!r} @ {box} conf={element.confidence}")
0.93
'Acme Coffee' @ (24.0, 18.0, 180.0, 32.0) conf=0.97
'Latte' @ (24.0, 70.0, 96.0, 28.0) conf=0.95
'$4.50' @ (220.0, 70.0, 80.0, 28.0) conf=0.88

Lines and Words

There's also convenience views for grouping results by reading order:

result.lines      # ['Acme Coffee', 'Latte $4.50']  - elements grouped into lines
result.words      # list of TextElement with non-empty text

Detection Language

Pick a different recognition language, and inspect what the current platform supports:

ocr = OCR(language="fr")
print(ocr.platform)               # 'darwin' or 'win32'
print(ocr.supported_languages)    # ['en-US', 'fr-FR', 'de-DE', ...]

The supported set is decided by the OS and queried live, so supported_languages always reflects the current machine. On macOS it's Vision's built-in set for your macOS version; on Windows it's whatever OCR language packs are installed. See the Usage guide for the full list and how to add Windows language packs.

Alternative Inputs

recognize() accepts more than file paths - hand it whatever you already have in memory:

from PIL import Image
import numpy as np

ocr.recognize("page.png")              # a file path
ocr.recognize(Image.open("page.png"))  # a PIL image
ocr.recognize(np.array(image))         # a numpy array (e.g. from OpenCV)
ocr.recognize(open("page.png", "rb").read())  # raw image bytes

Supported File Types

Images are decoded with Pillow, so any raster format Pillow can open works as an input file or byte string.

Format Extensions Notes
PNG .png recommended - lossless
JPEG .jpg, .jpeg great for photos of documents
TIFF .tif, .tiff common for scans
BMP .bmp uncompressed bitmap
GIF .gif first frame is used
WebP .webp modern lossy/lossless
PPM/PGM .ppm, .pgm netpbm bitmaps

In addition to file paths, recognize() accepts these in-memory types:

Input type Example
str (file path) ocr.recognize("page.png")
PIL.Image.Image ocr.recognize(Image.open("page.png"))
numpy.ndarray ocr.recognize(np.array(image))
bytes (encoded image) ocr.recognize(data)

[!NOTE] PDFs and other multi-page documents aren't decoded directly - rasterize a page to one of the formats above first (e.g. with pdf2image or pymupdf).

Testing

Install the dev dependencies (in a virtualenv), then run the suite. The tests mock the native macOS Vision and Windows Runtime backends, so they run anywhere without those frameworks installed.

python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"

Run everything with coverage (coverage is wired up in pyproject.toml, so plain pytest already reports it):

pytest

Other handy invocations:

# run a single test file
pytest tests/test_models.py

# run one test by name
pytest -k test_lines_groups_close_y_into_single_line

# verbose output
pytest -v

Coverage reports land in the terminal, in htmlcov/index.html, and in coverage.xml.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

natocr-1.3.3.tar.gz (18.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

natocr-1.3.3-py3-none-any.whl (11.7 kB view details)

Uploaded Python 3

File details

Details for the file natocr-1.3.3.tar.gz.

File metadata

  • Download URL: natocr-1.3.3.tar.gz
  • Upload date:
  • Size: 18.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for natocr-1.3.3.tar.gz
Algorithm Hash digest
SHA256 a2801c9109906e458bfb4823bec459b402e814ef195b5094c42b0b0f79b72e66
MD5 14a0fe37dcb5558eeaa990946151c40e
BLAKE2b-256 55337590e12814d42c1e8393b311f9ed828c8e173bb92b08bf85d655b4fc20b0

See more details on using hashes here.

File details

Details for the file natocr-1.3.3-py3-none-any.whl.

File metadata

  • Download URL: natocr-1.3.3-py3-none-any.whl
  • Upload date:
  • Size: 11.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for natocr-1.3.3-py3-none-any.whl
Algorithm Hash digest
SHA256 d1646b251b8f0fa60a52e7000791cd8c09d58006c454947db11e140d4f8d62bf
MD5 daa1bb251838b4c34f45efafaeff74d0
BLAKE2b-256 9a8a3587d219dd81f368aa6bb98f428cd4057f79cda294b6fde086f62e37c7d2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page