Skip to main content

Scanning a generic document from an image | Android Document Scanner

The Scanbot SDK Document Data Extractor is not only capable of live detection of Passports, ID Cards, etc., but it can also extract content from still images imported from the gallery or any other source.

Integration

The Example Apps are available to see the Document Data Extractor in action and to gain a comprehensive understanding of how to integrate it into your project:

Feature Dependency

The DocumentDataExtractor feature is available with SDK Package 3 (Data Capture Modules). The following dependencies need to be added:

implementation("io.scanbot:sdk-package-3:$latestSdkVersion")
implementation("io.scanbot:sdk-documentdata-assets:$latestSdkVersion")

SDK Initialization

Before use, the Scanbot SDK needs to be initialized. The following code snippet should be added to your Application class:

Initialize SDK
loading...

Image Processing

To select an image from the photo library and run detection on it, a class for an image import contract is created using the modern Android result API.

class ImportImageContract(private val context: Context) : ActivityResultContract<Unit, Bitmap?>() {
override fun createIntent(context: Context, input: Unit): Intent {
// An image is selected from the photo library and document detection is run on it:
val imageIntent = Intent()
imageIntent.type = "image/*"
imageIntent.action = Intent.ACTION_GET_CONTENT
imageIntent.putExtra(Intent.EXTRA_LOCAL_ONLY, false)
imageIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false)

return Intent.createChooser(imageIntent, "Select a picture")
}

private fun processGalleryResult(data: Intent): Bitmap? {
val imageUri = data.data
return MediaStore.Images.Media.getBitmap(context.contentResolver, imageUri)
}

override fun parseResult(resultCode: Int, intent: Intent?): Bitmap? {
return if (resultCode == Activity.RESULT_OK && intent != null) {
return processGalleryResult(intent)
} else {
null
}
}
}

To run the gallery call and get a Bitmap using ImportImageContract, the following code is used:

 val galleryImageLauncher =
registerForActivityResult(ImportImageContract(this)) { resultEntity ->
lifecycleScope.launch(Dispatchers.Default) {
val activity = this@MainActivity
val sdk = ScanbotSDK(activity)
if (!sdk.licenseInfo.isValid) {
withContext(Dispatchers.Main) {
Toast.makeText(
activity,
"License has expired!",
Toast.LENGTH_LONG
).show()
}
} else {
resultEntity?.let { bitmap ->
// Image processing is carried out
// processImage()
}
}
}
}
findViewById<View>(R.id.import_image).setOnClickListener {
galleryImageLauncher.launch(Unit)
}

Scanner Creation

Create Document Data Extractor
loading...
caution

Each call to createDocumentDataExtractor() will create a new DocumentDataExtractor and initialize memory for it. If more than one import operation is expected, do not create new scanners for each operation.

Detection

The Scanbot SDK is used to detect the desired element on the imported bitmap.

Extracting document data from an image
loading...

Want to scan longer than one minute?

Generate a free trial license to test the Scanbot SDK thoroughly.

Get your free Trial License

What do you think of this documentation?