DEV Community

vmodal_ai
vmodal_ai

Posted on

Build an AI-Powered Document Scanner and OCR Pipeline with Kotlin

Build an AI-Powered Document Scanner and OCR Pipeline with Kotlin

A document scanner can do much more than capture an image. Modern Android applications can detect document boundaries, correct perspective, recognize text, classify documents, extract fields, and generate summaries.

In this tutorial, we will design an AI-powered document processing pipeline using Kotlin.

Pipeline Architecture

CameraX
   ↓
Document Detection
   ↓
Perspective Correction
   ↓
Image Enhancement
   ↓
OCR
   ↓
Text Processing
   ↓
Field Extraction
   ↓
AI Classification / Summary
Enter fullscreen mode Exit fullscreen mode

CameraX Setup

Use CameraX for camera lifecycle and image analysis.

val analysis = ImageAnalysis.Builder()
    .setBackpressureStrategy(
        ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST
    )
    .build()
Enter fullscreen mode Exit fullscreen mode

This keeps the processing pipeline responsive when OCR or image processing takes longer than the camera frame interval.

Detecting a Document

A document detector can identify the four corners of a page.

Represent the result:

data class DocumentCorners(
    val topLeft: PointF,
    val topRight: PointF,
    val bottomRight: PointF,
    val bottomLeft: PointF
)
Enter fullscreen mode Exit fullscreen mode

The detection stage can use computer vision techniques or a machine-learning model.

Perspective Correction

A photo taken at an angle does not have the same geometry as a scanned page.

The four detected corners can be used to calculate a perspective transformation.

Conceptually:

Camera Image
     ↓
Four Document Corners
     ↓
Perspective Transform
     ↓
Flat Document Image
Enter fullscreen mode Exit fullscreen mode

Perspective correction significantly improves OCR quality.

Image Enhancement

Before OCR, improve the image where necessary.

Common operations include:

  • Grayscale conversion
  • Contrast enhancement
  • Noise reduction
  • Sharpening
  • Adaptive thresholding

Avoid excessive processing because it can remove characters or create artifacts.

OCR with ML Kit

Google ML Kit Text Recognition can recognize text from an image.

The high-level flow is:

val image = InputImage.fromBitmap(
    bitmap,
    0
)

recognizer.process(image)
    .addOnSuccessListener { result ->
        val text = result.text
    }
Enter fullscreen mode Exit fullscreen mode

For production applications, move processing away from the UI thread where appropriate and handle lifecycle cancellation.

Extracting Structured Fields

OCR gives you text, but applications often need structured information.

For example, a receipt might contain:

Store: Example Shop
Date: 2026-08-12
Total: 42.50 EUR
Enter fullscreen mode Exit fullscreen mode

Create a data model:

data class Receipt(
    val store: String?,
    val date: String?,
    val total: Double?
)
Enter fullscreen mode Exit fullscreen mode

A rule-based extractor can handle predictable formats.

For more flexible documents, an AI model can transform OCR text into structured JSON.

Document Classification

The application can classify documents such as:

Invoice
Receipt
Contract
Identity Document
Business Card
Other
Enter fullscreen mode Exit fullscreen mode

A lightweight classifier can run locally, while a larger AI model can run on a backend.

AI-Based Field Extraction

Send OCR text to a backend model with a constrained schema.

For example:

{
  "documentType": "invoice",
  "invoiceNumber": "INV-1001",
  "supplier": "Example Ltd",
  "total": 1250.50
}
Enter fullscreen mode Exit fullscreen mode

Validate the response before storing it.

Never assume that generated JSON is automatically correct.

Confidence Scores

OCR engines and classifiers can provide confidence information. Keep confidence values when available.

data class ExtractedField<T>(
    val value: T?,
    val confidence: Float
)
Enter fullscreen mode Exit fullscreen mode

Low-confidence fields can be presented to the user for verification.

Processing Large Images

Large camera images consume considerable memory.

Avoid repeatedly creating multiple full-resolution bitmap copies.

Prefer:

Capture
 ↓
Resize
 ↓
Process
 ↓
Release temporary resources
Enter fullscreen mode Exit fullscreen mode

Use appropriate bitmap configurations and release resources as soon as possible.

Exporting Searchable PDFs

After OCR, you can create a searchable PDF by combining the original page image with an invisible text layer.

The result allows users to search for recognized words without changing the visual appearance of the scanned page.

Privacy

Documents may contain highly sensitive information.

For privacy-focused applications:

  • Process OCR locally when practical.
  • Encrypt stored documents.
  • Use HTTPS for network requests.
  • Avoid logging document contents.
  • Delete temporary images.
  • Apply strict server-side authorization.

Production Architecture

A scalable design can separate responsibilities:

Android
 ├── Camera
 ├── Scanner UI
 ├── Local OCR
 └── Secure API Client

Backend
 ├── Authentication
 ├── AI Extraction
 ├── Document Storage
 └── Audit / Processing
Enter fullscreen mode Exit fullscreen mode

Conclusion

An AI document scanner combines computer vision, OCR, mobile development, and structured AI extraction.

The most valuable improvement over a basic scanner is the transition from pixels to structured information. Once text is extracted, the application can classify documents, extract fields, validate data, create summaries, and export searchable documents.

This architecture can be adapted for invoices, receipts, forms, contracts, logistics documents, and business workflows.

Useful Links

SDK Flutter: https://github.com/v-modal/vmodal_sdk_flutter

SDK Android: https://github.com/v-modal/vmodal_sdk_android

Discord: https://discord.gg/K72z28KUx

Top comments (0)