The Flutter plugin is a wrapper for Dynamsoft's Document Normalizer SDK. It enables you to build document rectification applications for Windows, Linux, web, Android and iOS.

Try Document Rectification Example

Desktop: Windows & Linux


cd example
flutter run -d windows

Flutter windows document edge detection and normalization


cd example
flutter run -d linux

Flutter Linux document edge detection and normalization


cd example
flutter run -d chrome

Flutter web document edge detection and normalization

Mobile: Android & iOS

cd example
flutter run 

Flutter document rectification for Android and iOS

Getting a License Key for Dynamsoft Document Normalizer

Supported Platforms

  • Web
  • Windows
  • Linux
  • Android
  • iOS


Add flutter_document_scan_sdk as a dependency in your pubspec.yaml file.


One More Step for Web

Include the JavaScript library of Dynamsoft Document Normalizer in your index.html file:

<script src="https://cdn.jsdelivr.net/npm/dynamsoft-document-normalizer@1.0.12/dist/ddn.js"></script>

API Compatibility

Methods Android iOS Windows Linux Web
Future<int?> init(String key) :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:
Future<List<DocumentResult>?> detectFile(String file) :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:
Future<NormalizedImage?> normalizeFile(String file, dynamic points) :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:
Future<int?> setParameters(String params) :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:
Future<String?> getParameters() :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:
Future<List<DocumentResult>?> detectBuffer(Uint8List bytes, int width, int height, int stride, int format) :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:
Future<NormalizedImage?> normalizeBuffer(Uint8List bytes, int width, int height, int stride, int format, dynamic points) :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:


  • Initialize the document rectification SDK with a valid license key:

    final _flutterDocumentScanSdkPlugin = FlutterDocumentScanSdk();
    await _flutterDocumentScanSdkPlugin.init(
    await _flutterDocumentScanSdkPlugin.setParameters(Template.grayscale);
  • Do document edge detection and return quadrilaterals:

    List<DocumentResult>? detectionResults =
            await _flutterDocumentScanSdkPlugin
  • Detect document edges from a buffer:

    List<DocumentResult>? detectionResults =
            await _flutterDocumentScanSdkPlugin
                .detectBuffer(bytes, width, height, stride, format);
  • Rectify the document based on document corners:

    NormalizedImage? normalizedImage = await _flutterDocumentScanSdkPlugin.normalizeFile(
        file, detectionResults[0].points);
  • Rectify the document based on document corners from a buffer:

    NormalizedImage? normalizedImage = await _flutterDocumentScanSdkPlugin.normalizeBuffer(
        bytes, width, height, stride, format, detectionResults[0].points);
  • Save the rectified document image to a file:

    if (normalizedUiImage != null) {
        const String mimeType = 'image/png';
        ByteData? data = await normalizedUiImage!
            .toByteData(format: ui.ImageByteFormat.png);
        if (data != null) {
            final XFile imageFile = XFile.fromData(
                mimeType: mimeType,
            await imageFile.saveTo(path);