📄 advanced_document_scanner

Camera-based document scanner for Flutter with a built-in editor (highlight, crop/cut, rotate) and advanced export options (JPG/PNG/GIF + low/medium/high/max presets).

Platforms: ✅ Android | ✅ iOS


✨ Features

📷 Scan

  • Uses the camera plugin
  • Captures at maximum supported resolution (best source)
  • Multi-page capture

🤖 Native document scanner (optional)

  • Android: Google ML Kit Document Scanner (Play services)
    • Uses dependency com.google.android.gms:play-services-mlkit-document-scanner:16.0.0
  • iOS: VisionKit document scanner (VNDocumentCameraViewController)
  • Returns page images and (when available) a generated PDF

✍️ Edit

  • Highlight (marker)
  • Crop / Cut
  • Rotate

📤 Export

  • Formats: JPG / PNG / GIF
  • Presets: low / medium / high / max
  • Optional overrides: targetWidth, targetHeight, jpgQuality

🚀 Installation

dependencies:
  advanced_document_scanner: ^0.0.1

🔐 Permissions

Android

Add in android/app/src/main/AndroidManifest.xml:

<uses-permission android:name="android.permission.CAMERA"/>

iOS

Add in ios/Runner/Info.plist:

<key>NSCameraUsageDescription</key>
<string>We need camera access to scan documents.</string>

✅ Usage

1) Capture + Edit

final scanner = AdvancedDocumentScanner();

final result = await scanner.captureAndEdit(
  pageLimit: 10,
  multiPage: true,
);

final source = (result.editedImagePaths?.isNotEmpty ?? false)
    ? result.editedImagePaths!
    : result.originalImagePaths;

2) Scan + Edit (ML Kit Android / VisionKit iOS)

final scanner = AdvancedDocumentScanner();

final result = await scanner.scanWithMlKit(
  pageLimit: 10,
  allowGallery: true,
  returnJpeg: true,
  returnPdf: true,
  openEditorAfterScan: true,
);

// Optional:
final pdfPath = result.pdfPath;

📤 Export (ALL options)

A) Export with preset (low / medium / high / max)

final outputDir = await scanner.getDefaultExportDir(
  folderName: 'advanced_document_scanner_exports',
);

final files = await scanner.exportImages(
  imagePaths: source,
  outputDir: outputDir,
  options: const AdsExportOptions(
    format: AdsImageFormat.jpg,
    preset: AdsQualityPreset.high,
  ),
);

B) Export as PNG (lossless)

final pngFiles = await scanner.exportImages(
  imagePaths: source,
  outputDir: outputDir,
  options: const AdsExportOptions(
    format: AdsImageFormat.png,
    preset: AdsQualityPreset.high,
  ),
);

C) Export as GIF (single-frame)

final gifFiles = await scanner.exportImages(
  imagePaths: source,
  outputDir: outputDir,
  options: const AdsExportOptions(
    format: AdsImageFormat.gif,
    preset: AdsQualityPreset.medium,
  ),
);

D) Custom width/height override

final customSize = await scanner.exportImages(
  imagePaths: source,
  outputDir: outputDir,
  options: const AdsExportOptions(
    format: AdsImageFormat.jpg,
    preset: AdsQualityPreset.high,
    targetWidth: 1600,
    targetHeight: 2200,
  ),
);

E) Override JPG quality (0–100)

final customQuality = await scanner.exportImages(
  imagePaths: source,
  outputDir: outputDir,
  options: const AdsExportOptions(
    format: AdsImageFormat.jpg,
    preset: AdsQualityPreset.high,
    jpgQuality: 85,
  ),
);

🧩 Open editor for existing images

final editedPaths = await scanner.openEditor(
  imagePaths: source,
  enableHighlight: true,
  enableCrop: true,
  enableCut: true,
  enableRotate: true,
);

☕ Sponsor a cup of tea

If this package saves your time, consider supporting development ❤️


📄 License

MIT