The Genius Scan SDK can detect and extract barcodes and QR codes from scanned documents. This differs from live barcode scanning as it extracts codes from document images after capture, making it ideal for processing documents that contain embedded codes such as invoices, shipping labels, or tickets.
To enable barcode detection in documents, configure the scan flow with the readable codes structured data type and specify which code types to detect.
let configuration = GSKScanFlowConfiguration()
// Enable readable code extraction
configuration.structuredData = [.readableCode]
// Specify which code types to detect
configuration.structuredDataReadableCodeTypes = [
.qr,
.ean13,
.code128,
.dataMatrix
]
configuration.multiPage = false
configuration.skipPostProcessingScreen = true
// Start scan flow
self.scanFlow = GSKScanFlow(configuration: configuration)
scanFlow.start(from: viewController, onSuccess: { result in
// Access detected codes
if let codes = result.scans.first?.structuredDataResult?.readableCodes {
for code in codes {
print("Type: \(code.type)")
print("Value: \(code.value)")
print("Location: \(code.boundingBox)")
}
}
}, failure: { error in
// Handle error
})
For a complete list of supported code types, see the GSKStructuredDataReadableCodeType in the iOS API documentation.
val configuration = ScanConfiguration().apply {
// Enable readable code extraction
structuredData = EnumSet.of(StructuredData.READABLE_CODE)
// Specify which code types to detect
structuredDataReadableCodeTypes = EnumSet.of(
ReadableCode.Type.QR,
ReadableCode.Type.EAN13,
ReadableCode.Type.CODE128,
ReadableCode.Type.DATA_MATRIX
)
multiPage = false
}
// Start scan flow
ScanFlow.scanWithConfiguration(activity, configuration)
// Handle result
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
data?.let {
val result = ScanFlow.getScanResultFromActivityResult(data)
// Access detected codes
result.scans?.first()?.structuredDataResult?.readableCodes?.forEach { code ->
Log.d("Scanner", "Type: ${code.type}")
Log.d("Scanner", "Value: ${code.value}")
Log.d("Scanner", "Location: ${code.boundingBox}")
}
}
}
For a complete list of supported code types, see the ReadableCode.Type in the Android API documentation.
const configuration = {
// Enable readable code extraction
structuredData: ['readableCode'],
// Specify which code types to detect
structuredDataReadableCodeTypes: ['qr', 'ean13', 'code128', 'dataMatrix'],
multiPage: false,
skipPostProcessingScreen: true
};
// Start scan flow
try {
const result = await RNGeniusScan.scanWithConfiguration(configuration);
// Access detected codes
if (result.scans && result.scans[0].structuredData?.readableCodes) {
const codes = result.scans[0].structuredData.readableCodes;
codes.forEach(code => {
console.log("Type:", code.type);
console.log("Value:", code.value);
});
}
} catch (error) {
// Handle error
console.error("Scan failed:", error);
}
var configuration = {
// Enable readable code extraction
'structuredData': ['readableCode'],
// Specify which code types to detect
'structuredDataReadableCodeTypes': ['qr', 'ean13', 'code128', 'dataMatrix'],
'multiPage': false,
'skipPostProcessingScreen': true
};
// Start scan flow
try {
var result = await FlutterGeniusScan.scanWithConfiguration(configuration);
// Access detected codes
if (result['scans'] != null && result['scans'].isNotEmpty) {
var structuredData = result['scans'][0]['structuredData'];
if (structuredData != null && structuredData['readableCodes'] != null) {
var codes = structuredData['readableCodes'];
for (var code in codes) {
print("Type: ${code['type']}");
print("Value: ${code['value']}");
}
}
}
} catch (error) {
// Handle error
print("Scan failed: $error");
}
var configuration = {
// Enable readable code extraction
structuredData: ['readableCode'],
// Specify which code types to detect
structuredDataReadableCodeTypes: ['qr', 'ean13', 'code128', 'dataMatrix'],
multiPage: false,
skipPostProcessingScreen: true
};
// Start scan flow
cordova.plugins.GeniusScan.scanWithConfiguration(configuration,
function(result) {
// Access detected codes
if (result.scans && result.scans[0].structuredData && result.scans[0].structuredData.readableCodes) {
var codes = result.scans[0].structuredData.readableCodes;
codes.forEach(function(code) {
console.log("Type:", code.type);
console.log("Value:", code.value);
});
}
},
function(error) {
// Handle error
console.error("Scan failed:", error);
}
);
using GeniusScanSDK.ScanFlow;
var scanFlowService = new ScanFlowService();
var configuration = new Dictionary<string, object>
{
// Enable readable code extraction
["structuredData"] = new[] { "readableCode" },
// Specify which code types to detect
["structuredDataReadableCodeTypes"] = new[] { "qr", "ean13", "code128", "dataMatrix" },
["multiPage"] = false,
["skipPostProcessingScreen"] = true
};
var result = await scanFlowService.ScanDocument(configuration);
// Access detected codes
var scans = (IList<object>)result["scans"];
var firstScan = (Dictionary<string, object>)scans[0];
if (firstScan.TryGetValue("structuredData", out var structuredDataObj))
{
var structuredData = (Dictionary<string, object>)structuredDataObj;
if (structuredData.TryGetValue("readableCodes", out var readableCodesObj))
{
var barcodes = (IList<object>)readableCodesObj;
foreach (var barcode in barcodes)
{
var code = (Dictionary<string, object>)barcode;
Console.WriteLine($"Type: {code["type"]}");
Console.WriteLine($"Value: {code["value"]}");
}
}
}
The SDK supports various barcode formats, including:
For each detected code, the SDK provides:
Start with a free trial license to test the SDK, or contact us directly for a custom quote tailored to your needs.
© 2025 The Grizzly Labs. All rights reserved.