flutter_ocr_native 0.3.3
flutter_ocr_native: ^0.3.3 copied to clipboard
Flutter plugin for on-device OCR using ML Kit (Android), Vision (iOS/macOS), WinRT (Windows), Tesseract (Linux). Document parsing, validation, and masking.
0.3.3 #
Improvements #
-
Old & new document format support — all parsers now handle both legacy and current Indian document layouts:
- Aadhaar: new bilingual format (
नाम / Name,पिता का नाम / Father's Name,जन्म की तारीख / DOB,पता / Address) detected alongside old English-only labels. DOB value on next line supported - PAN: bilingual layout already supported from 0.3.1 — no change
- Driving License: new smart card format (
COV,DOI,NT VALIDITY,NON-TRANSPORTvalidity dates on separate lines) + improved DL number regex covering all Indian state formats including 6-digit serial and compact no-separator variants - Voter ID: new format (
Name:,Father's Name:,Husband's Name:,Sex:,Age:) parsed alongside oldELECTOR'S NAME/FATHER'S NAMEformat.Agefield converted to approximate birth year when full DOB is absent.M/Fsingle-char gender values normalised toMale/Female - Passport: MRZ (Machine Readable Zone) parsing added —
P<IND<SURNAME<<GIVENand digit line parsed to extract surname, given name, nationality, DOB, gender, expiry and passport number directly from MRZ. MRZ dateYYMMDDconverted toDD/MM/YYYYwith correct century. Old labeled-field booklet format unchanged - Cheque: new CTS printed format —
A/C No.,Account No.,Acc No.,Account Numberlabel patterns parsed before falling back to raw digit scanning. Account number on next line after label also handled
- Aadhaar: new bilingual format (
-
Smart handwriting detection — per-document-type policy prevents false rejections:
- Passport and Cheque and Driving License use
allowMixedpolicy — only rejected if zero printed keywords found (truly blank handwritten paper). Signatures on passports and handwritten amounts/payees on cheques no longer causeHandwrittenTextException - Aadhaar, PAN, Voter ID keep strict
rejectIfHandwrittenpolicy — fully handwritten documents correctly rejected docTypehint parameter added to allOcrReaderread methods (readFromPath,readFromBytes,readFromFile,readFromPdf,readFromPdfFile) — pass known type to skip auto-detection and apply correct policy immediately
- Passport and Cheque and Driving License use
-
Document type detector — passport MRZ scoring added:
P<IND<pattern scores +5, MRZ digit line pattern scores +5 — ensures MRP passports detected even without the word "PASSPORT" in OCR text -
API surface reduced — package now exports only what app developers need:
- Removed from public API:
OcrPlatformInterface,OcrMethodChannel(internal channel wiring),AadhaarDetails,ChequeDetails,DrivingLicenseDetails,PassportDetails,VoterIdDetails(useDocumentDetailsinstead),OcrExceptionbase class (catchEmptyImageException/HandwrittenTextExceptiondirectly),OcrDetailsCard,VoterIdDetailsCard(build UI fromDocumentDetails.toDisplayMap()),HandwritingPolicy(internal enum) - All removed classes still exist in the package source and are used internally — only their re-export from the barrel is removed
- Removed from public API:
-
DocumentDetailsinternal refactor — removed redundant_parse()indirection;fromResultSyncnow owns the dispatch switch directly._hasPhotohelper inlined.fromTextsimplified to single expression
Bug Fixes #
- Fixed
NOT_INITIALIZEDcrash on re-upload (Android, Windows, Linux) — scanning a second image after the first scan threwPlatformException(NOT_INITIALIZED, Recognizer not initialized)- Android:
processImage()now lazily recreatesTextRecognizerif null — seamless re-use afterdispose() - Windows:
RecognizeFromBytes()now lazily recreatesOcrEngineif null — recovers from failed init or unexpected null state - Linux:
recognize()now lazily reinitializesTessBaseAPIif null — recovers from failed init or dispose - iOS/macOS: unaffected — Vision framework creates a fresh
VNRecognizeTextRequestper call with no persistent state
- Android:
0.3.1 #
Bug Fixes #
-
Critical PAN detection fix (Android, iOS, macOS) — bilingual PAN cards (Hindi + English) with no-vowel PAN numbers like
BWPPM8548Fwere silently dropped by theisEnglish()filter- Root cause: vowel check
letters.count >= 4 && !hasVowelincorrectly rejected valid PAN tokens that contain no vowels (e.g.BWPPM,BWPPMF) - Fix applied to all three Vision/ML Kit platforms: Android (
OcrPlugin.kt), iOS (OcrPlugin.swift), macOS (OcrPlugin.swift) - Any token containing digits (IDs, codes, PAN numbers, dates) now always passes through the English filter
- Vowel check now only applies to pure-letter strings of 5+ characters (rejects Hindi/non-Latin words)
- Threshold raised from 4 → 5 letters to avoid rejecting short English abbreviations (
DEPT,GOVT,CARD) - Windows (WinRT) and Linux (Tesseract) were unaffected — their
isEnglishonly checks for[A-Za-z0-9]presence with no vowel filter - PAN cards with vowels in the number (e.g.
AXEPN1010E) were unaffected on all platforms
- Root cause: vowel check
-
PAN extraction — space-tolerant matching —
extractPAN()now handles OCR splitting PAN intoBWPPM 8548F(space between letter-block and digit-block)- Added Strategy 2:
([A-Z]{5})\s+(\d{4})\s*([A-Z])pattern - Added Strategy 3: OCR misread correction (O→0, I→1, S→5) with space tolerance
- Added Strategy 4: relaxed 4th-char fallback for OCR-misread holder type character
- Added Strategy 2:
-
PAN name/father parsing — bilingual layout —
_fromPan()now correctly extracts name and father name from bilingual cards where Hindi labels are stripped to/ Name,/ Father's Name- Added
_extractNameValue()helper — checks text after/on same line first, then next line - Handles both old format (name on next line after label) and new bilingual format (label + value on same line separated by
/)
- Added
-
Raw OCR text copy button — example app now shows a copy icon on the Raw OCR Text card for easy debugging
-
Native PDF to image conversion — render PDF pages to images without any third-party Dart package
- Android:
PdfRenderer(API 21+) - iOS:
CGPDFDocument(CoreGraphics) - macOS:
CGPDFDocument(CoreGraphics) - Windows:
Windows.Data.Pdf(WinRT) - Linux: not supported (returns null gracefully)
- Android:
-
Added
OcrDocumentSaver.renderPdfPage()— renders a single PDF page to JPEG bytes -
Added
OcrDocumentSaver.getPdfPageCount()— returns total pages in a PDF -
Added
OcrDocumentSaver.renderAllPdfPages()— renders all pages to a list of image bytes -
Added
OcrReader.readFromPdf()— single-call PDF to OCR text -
Added
OcrReader.readFromPdfFile()— OCR directly from a PDF file -
Capture instructions widget —
OcrCaptureInstructionsshows best practices before scan/uploadshowAsBottomSheet()— modal bottom sheet with tipsshowAsDialog()— dialog with tips- Inline widget mode — embed directly in your UI
- Customizable instructions via
OcrInstructionmodel
-
Enhanced PAN card detection — OCR misread correction (O→0, I→1, S→5), uppercase fallback, name/DOB/father name parsing
-
OOM crash fix (Android) —
correctOrientationnow uses 1024px downscaled test bitmaps for rotation detection instead of full-size images -
OOM crash fix (all platforms) — PDF rendering capped at 3000px max dimension
-
Background thread rendering — PDF rendering runs off main thread on Android, iOS, and macOS
-
Fixed
FlutterImageDecoderImplDefaultcrash — PDF bytes no longer passed to image decoder; detected and rendered to JPEG first -
Fixed Windows compile error — added
Windows.UI.hinclude, fixedColorHelperusage with direct struct -
Fixed Windows stream crash —
DataWriter.DetachStream()prevents premature stream closure -
Linux graceful fallback —
renderPdfPagereturns null,getPdfPageCountreturns 0 (no crash) -
Example app now supports PDF file picking and processing
-
Example app shows capture instructions before camera/gallery
-
Added
_isPdf()detection in example flow -
File picker now accepts PDF alongside image formats
-
correctOrientationskips images >10MB to prevent OOM -
Windows compile fix — resolves all 3 MSVC build errors:
- Added
#define NOMINMAXand(std::max)(...)parenthesization to preventerror C2589from Windowsmaxmacro - Replaced broad
using namespaceWinRT imports with namespace aliases (ocr::,streams::,imaging::,pdf::) to fixerror C2872: 'IUnknown' ambiguous symbol - Added
#include <winrt/Windows.Globalization.h>to fix linker error forWindows::Globalization::Language
- Added
0.2.1 #
- Smart auto-orientation — only rotates if original is unreadable; keeps already-readable images untouched
- Cheque MICR fix — MICR line (special font at bottom) no longer triggers handwriting rejection
- Cheque parser rewrite — case-insensitive IFSC extraction, spaced account numbers, 30+ bank name patterns, address extraction from branch lines
- Added
addressfield toChequeDetailsandDocumentDetailsfor cheques - Improved
detectPrintedon all platforms — excludes low-confidence numeric elements at image bottom from scoring
0.2.0 #
- Auto-orientation correction — detects correct image rotation using OCR confidence scoring across all 4 rotations (0°, 90°, 180°, 270°). Works even without EXIF data
- Image cropper with rotate — added rotate button (90° clockwise) to crop UI
- Document type auto-detection — scores OCR text against keywords/patterns for Aadhaar, PAN, Passport, Driving License, Voter ID, Cheque
- Unified
DocumentDetailsmodel — singlefromResult()API handles all doc types, face extraction, validation, andtoDisplayMap(maskAadhaar: true) - Face extraction — ML Kit Face Detection (Android), Vision (iOS/macOS). Returns cropped face bytes
- Document parsers —
PassportDetails,DrivingLicenseDetails,VoterIdDetails,ChequeDetails - Extended validation — Passport, Driving License, Voter ID (EPIC), IFSC, Account number
- Added
OcrDocumentSaver.correctOrientation()— auto-corrects image orientation before display - Added
OcrDocumentSaver.extractFace()andextractFaceFromPath() - Added
OcrDocumentSaver.isFaceExtractionSupportedgetter - Added
result.docTypeandresult.docTypeLabelgetters onOcrResult - Added
DocumentTypeDetector.detect(),.label(),.icon()static methods - Added
OcrDocumentViewersupport fororiginalBytesparameter - Fixed Voter ID extraction — NFKD normalization for Unicode lookalike characters
- Fixed false Voter ID matches from date strings (e.g., "biRTH 15/07/199x")
- Added macOS platform support — Apple Vision framework
- Added Windows platform support — WinRT OCR engine + GDI+
- Added Linux platform support — Tesseract OCR + Leptonica
- Added
DocumentNumberValidator— validates Aadhaar (Verhoeff checksum) and PAN (format + holder type) - Added
AadhaarDetailsmodel — parses OCR text into structured fields - Added
OcrDetailsCardwidget - Fixed Aadhaar masking regex — requires separators, won't mask pincodes
- Fixed validation working on masked text — validates against raw text internally
0.0.7 #
- Added
OcrImageFormatenum — configurable output format (JPEG or PNG) - Added
imageQualityparameter to all save/download methods — JPEG compression 1-100 - Added
formatparameter to all save/download methods — choose JPEG or PNG output downloadFromPathauto-detects output format from original file extension (.png → PNG, others → JPEG)- Added
compressImage()standalone method — compress any image bytes natively - Accepts any input image format (JPEG, PNG, WEBP, BMP, GIF, HEIC, TIFF) — decoded natively
- Native compression via Android
Bitmap.compressand iOSjpegData/pngData - Watermark is now fully optional — omit or pass null to skip
0.0.6 #
- Lowered SDK constraint to
>=3.2.4 <4.0.0(Flutter 3.19.0+) for broader compatibility - Fixed
Color.toARGB32()not available on older Dart versions — replaced with version-safe_colorToArgb()helper using.a/.r/.g/.bfloat API - Zero deprecation warnings on all Dart 3.x versions (3.2.4 through 3.11+)
0.0.5 #
- Updated README with complete usage documentation for all features
- Added examples for Basic OCR, Validation & Aadhaar Masking, Document Viewer, Download with Watermark, Custom Validator, and Runtime Toggle
- Added full architecture tree in README covering all source files
- Added Supported Platforms table and Flutter Compatibility section
- Updated Getting Started version to
^0.0.4
0.0.4 #
- Fixed watermark not appearing in downloaded images
- Moved watermark rendering from
dart:uiCanvas to native platform (Android Canvas / iOS CoreGraphics) for reliable text rendering - Added
burnWatermarknative method channel — watermark is now burned into images on the native side - Auto-scaled watermark font size to 3% of image width (minimum 36px) — always readable regardless of image resolution
- Bold watermark text with 1.5x line height for better readability
- Added
downloadBytes()method toOcrDocumentSaverfor saving raw bytes directly - Added
path_provideras plugin dependency — platform-specific download paths handled internally - Removed
path_providerdependency from example app — package handles it - Simplified
OcrDocumentViewersave — uses nativeburnWatermarkinstead of unreliableRepaintBoundarycapture
0.0.3 #
- Added
OcrWatermarkmodel — configurable watermark with key-value lines (Lead ID, Lat, Long, Agent, Date, etc.), customizable text color, background color, font size, and padding - Added
OcrDocumentViewerwidget — full-screen document viewer with pinch-to-zoom (0.5x–5x), watermark overlay below image, configurable save button, andOcrDocumentViewer.show()for one-liner navigation - Added
OcrDocumentSaverutility — saves masked/original image to file with watermark burned into the image using Canvas, supports save from file path or raw bytes - Viewer save captures the watermark in the exported image via
RepaintBoundary - Updated example app with View and Download buttons using the new package utilities
0.0.2 #
- Renamed package from
ocrtoflutter_ocr_native - Lowered SDK constraint to support Flutter 3.27.1+
- Fixed Aadhaar image masking for different card positions and orientations
- Improved handwriting detection using ML Kit confidence signals
- Added
maskedImageBytes— image with Aadhaar digits blacked out - Added
hasAadhaargetter onOcrResult
0.0.1 #
- Initial release
- On-device OCR using ML Kit (Android) and Vision framework (iOS)
- English-only text extraction — non-Latin scripts auto-filtered
- Structured results: blocks → lines → elements with bounding boxes & confidence
- Aadhaar number masking (text + image) — configurable
- Handwriting detection — rejects non-printed documents
- Empty/blank image detection