ITC Scanner
A Flutter plugin for extracting data from Ghana vehicle documents using ML Kit text recognition.
Features
- π Extract data from Ghana vehicle licensing documents
- π± Cross-platform support (Android/iOS)
- π§ Simple integration with image bytes input
- π Structured output with confidence scores
Screenshots
| iOS - Document Scanning | iOS - Extraction Results | 
|---|---|
|  |  | 
| iOS - App Interface | Android - Full Experience | 
|---|---|
|  |  | 
Cross-platform support - works on both iOS and Android
Installation
dependencies:
  itc_scanner: ^0.0.1
flutter pub get
Usage
import 'package:itc_scanner/itc_scanner.dart';
import 'dart:typed_data';
final scanner = ItcScanner();
// Extract document data from image bytes
Future<void> scanDocument(Uint8List imageBytes) async {
  try {
    final result = await scanner.extractDocument(imageBytes);
    if (result?['success'] == true) {
      final fields = result!['fields'] as List<dynamic>;
      for (var field in fields) {
        print('${field['label']}: ${field['value']}');
      }
    }
  } catch (e) {
    print('Error: $e');
  }
}
Example with Image Picker
import 'package:image_picker/image_picker.dart';
final picker = ImagePicker();
// Pick from camera with optimized settings
final image = await picker.pickImage(
  source: ImageSource.camera,
  maxWidth: 1024,
  maxHeight: 1024,
  imageQuality: 90,
);
if (image != null) {
  final bytes = await File(image.path).readAsBytes();
  await scanDocument(bytes);
}
// Pick from gallery with same optimization
final galleryImage = await picker.pickImage(
  source: ImageSource.gallery,
  maxWidth: 1024,
  maxHeight: 1024,
  imageQuality: 90,
);
Complete Example
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:itc_scanner/itc_scanner.dart';
import 'dart:typed_data';
import 'dart:io';
class DocumentScannerWidget extends StatefulWidget {
  @override
  _DocumentScannerWidgetState createState() => _DocumentScannerWidgetState();
}
class _DocumentScannerWidgetState extends State<DocumentScannerWidget> {
  final _scanner = ItcScanner();
  final _picker = ImagePicker();
  Map<String, dynamic>? _result;
  bool _isLoading = false;
  Future<void> _scanFromCamera() async {
    final XFile? image = await _picker.pickImage(
      source: ImageSource.camera,
      maxWidth: 1024,
      maxHeight: 1024,
      imageQuality: 90,
    );
    if (image != null) {
      await _processImage(File(image.path));
    }
  }
  Future<void> _processImage(File imageFile) async {
    setState(() => _isLoading = true);
    try {
      final Uint8List imageBytes = await imageFile.readAsBytes();
      final result = await _scanner.extractDocument(imageBytes);
      setState(() => _result = result);
    } catch (e) {
      print('Error: $e');
    } finally {
      setState(() => _isLoading = false);
    }
  }
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        ElevatedButton(
          onPressed: _isLoading ? null : _scanFromCamera,
          child: Text(_isLoading ? 'Processing...' : 'Scan Document'),
        ),
        if (_result != null) ...[
          Text('Fields found: ${(_result!['fields'] as List).length}'),
          // Display your results here
        ],
      ],
    );
  }
}
Response Format
{
  "success": true,
  "documentType": "VEHICLE_REGISTRATION",
  "processingTime": 1250,
  "fields": [
    {
      "label": "Document Number",
      "value": "GB 5803-12",
      "confidence": 0.95,
      "fieldType": "ID_NUMBER"
    },
    {
      "label": "Document ID",
      "value": "A371750335192",
      "confidence": 0.85,
      "fieldType": "ID_NUMBER"
    },
    {
      "label": "Make",
      "value": "TOYOTA",
      "confidence": 0.9,
      "fieldType": "TEXT"
    },
    {
      "label": "Model",
      "value": "COROLLA",
      "confidence": 0.9,
      "fieldType": "TEXT"
    },
    {
      "label": "Color",
      "value": "WHITE",
      "confidence": 0.9,
      "fieldType": "TEXT"
    },
    {
      "label": "Use",
      "value": "PRIVATE",
      "confidence": 0.9,
      "fieldType": "TEXT"
    },
    {
      "label": "Expiry Date",
      "value": "2026-06-19",
      "confidence": 0.9,
      "fieldType": "DATE"
    }
  ]
}
Requirements
- Android: API 24+
- iOS: 15.5+
- Flutter: 3.3.0+
Field Types
- TEXT: General text (Make, Model, Color)
- ID_NUMBER: Document identifiers
- DATE: Date fields
- NUMBER: Numeric values
Tips
- Use good lighting when capturing documents
- Keep document flat and properly aligned
- Optimize image size: Use maxWidth: 1024, maxHeight: 1024, imageQuality: 90for better performance
- Recommended image size: 1024x1024 or higher (but not too large)
- Smaller images = faster processing and better app performance
Support
ITC Consortium Ghana
Email: apps@itconsortiumgh.com
License
Proprietary - Internal use only