quickcapture 1.0.15  quickcapture: ^1.0.15 copied to clipboard
quickcapture: ^1.0.15 copied to clipboard
QuickCapture AI Based Mobile Document Scanning plugin for Flutter From Extrieve.
QuickCapture Mobile Document Scanning & Imaging #
Extrieve Technologies - Your Expert in Document Management & AI Solutions
The Quickcapture Flutter plugin enables document scanning & imaging using mobile devices. It can integrates seamlessly with mobile applications, providing high-quality document capture, compression, optimization, and conversion into PDF and TIFF formats.
Key Features #
- High-Quality Capture: Optimized focus control for document scanning.
- Compression & Optimization: Generate small, high-quality outputs for fast uploads.
- DPI and Layout Control: Adjust DPI, layouts, and output sizes for PDF/TIFF.
- Multi-Format Output: Supports output in both PDF and TIFF format output build.
- Developer-Friendly: Easy integration into your Flutter applications.
Note: It's not "just" a scanning SDK. It's a document scanning SDK built with Best Quality, Highest Possible Compression, and Image Optimization on in mind that works fully offline & on device.
Compatibility #
- Java: Requires Java 17 or later.
- Android:
- Minimum SDK: API 21
- Target SDK: API 35
- Compiled SDK: API 34
 
- iOS: Requires iOS 11 or later.
Other Available Platform Options #
API Methods #
1. activateLicense #
Activates the license for the Quickcapture plugin.
Future<bool?> activateLicense(String,String);
Example
Future<bool?> activateLicense({
  required String android,
  required String ios,
});
// Parameters
// - `android`: License string for Android.
// - `ios`: License string for iOS.
// Return Value
// - `true` if the license was successfully activated.
// - `false` or `null` otherwise.
2. initialize #
Initializes the Quickcapture plugin. This is required before calling other methods.
Future<String?> initialize();
Example
@override
void initState() {
  super.initState();
  _quickCapturePlugin.initialize();
}
3. startCapture #
Starts the document capture process and returns the details of the captured images.
_quickCapturePlugin.startCapture();
Example
Future<void> startCapture() async {
  String? response = await _quickCapturePlugin.startCapture();
  
  if (response != null) {
    Map<String, dynamic> jsonResponse = jsonDecode(response);
    List<String> capturedImages = List<String>.from(jsonResponse['fileCollection']);
    print("Captured Images: $capturedImages");
  } else {
    print("Capture failed or cancelled.");
  }
}
4. buildPDFForLastCapture #
Generates a PDF file from the images captured in the last session.
Future<String?> buildPDFForLastCapture();
Example
Future<void> buildPDF() async {
  String? pdfFilePath = await _quickCapturePlugin.buildPDFForLastCapture(); 
  if (pdfFilePath != null) {
    print("PDF generated at: $pdfFilePath");
  } else {
    print("Failed to generate PDF.");
  }
}
5. buildTIFFForLastCapture #
Generates a TIFF file from the images captured in the last session.
_quickCapturePlugin.buildTIFFForLastCapture();
Example
Future<void> buildTIFF() async {
  String? tiffPath = await _quickCapturePlugin.buildTIFFForLastCapture();
  if (tiffPath != null) {
    print("TIFF generated at: $tiffPath");
  } else {
    print("Failed to generate TIFF.");
  }
}
6. compressToJPEG #
Generates an optimized and compressed output image path in JPEG format.
Future<String?> compressToJPEG(String imagePath);
Example
Future<void> compressImage() async {
  String imagePath = "path/to/image.jpg";
  String? compressedImagePath = await _quickCapturePlugin.compressToJPEG(imagePath);
  if (compressedImagePath != null) {
    print("Compressed image at: $compressedImagePath");
  } else {
    print("Failed to compress image.");
  }
}
7. setCustomLayout #
Customizes layout dimensions, such as setting specific dimensions like 200x300 pixels, which can impact the quality of the output image.
Future<bool?> setCustomLayout(int customWidth, int customHeight);
Example
bool? isCustomLayoutSet = await _quickCapturePlugin.setCustomLayout(500, 900); // in pixels
if (isCustomLayoutSet == true) {
  print("Custom layout set successfully.");
}
8. buildPDF #
Create a compressed & optimised single PDF output file by merging provided collection of input images.
Future<String?> buildPDF(List<String> imagePaths);
Example
 // Extract paths of selected images
final List<String> imagePaths = "<image path list>";
// Pass the image paths to the buildPDF function
final String? jsonResponse = await _quickcapturePlugin.buildPDF(imagePaths);
Response:
//On Success:
{
  "status": true,
  "description": "PDF created successfully",
  "filePath": "/path/to/generated.pdf"
}
// On Failure :
{
  "status": false,
  "description": "No images provided",
  "filePath": null
}
9. buildTiff #
Create a compressed & optimised single TIFF output file by merging provided collection of input images.
Future<String?> buildTiff(List<String> imagePaths);
Example
 // Extract paths of selected images
final List<String> imagePaths = "<image path list>";
// Pass the image paths to the buildPDF function
final String? jsonResponse = await _quickcapturePlugin.buildTiff(imagePaths);
Response:
//On Success:
{
  "status": true,
  "description": "TIFF created successfully",
  "filePath": "/path/to/generated.tiff"
}
// On Failure :
{
  "status": false,
  "description": "No images provided",
  "filePath": null
}
HumanFaceHelper #
The QuickCapture plugin provides an advanced option to detect and match human faces in images. Below is an overview of these methods with detailed explanations.
API Methods #
1. initHumanFaceHelper #
Initializes the Human Face Helper module required for face detection and matching. An active license should needed for this.
Future<bool?> initHumanFaceHelper()
Example
bool? initialized = await _quickcapturePlugin.initHumanFaceHelper();
if (initialized == true) {
  print("Human Face Helper initialized successfully.");
} else {
  print("Failed to initialize Human Face Helper.");
}
// Returns : 
// true: Initialization successful.
// false: Initialization failed.
2. detectHumanFaces #
Detects human faces in the specified image and provides bounding box coordinates for each detected face.
Future<String?> detectHumanFaces(String imagePath)
Example
String? response = await _quickcapturePlugin.detectHumanFaces(imagePath);
if (response != null) {
  Map<String, dynamic> result = jsonDecode(response);
  if (result["STATUS"] == true) {
    print("Faces detected: ${result["DATA"]}");
  } else {
    print("Face detection failed: ${result["DESCRIPTION"]}");
  }
}
Response:
{
  "STATUS": true,
  "DESCRIPTION": "SUCCESS",
  "CODE": 0,
  "IDENTIFIER": 12456, //Unique Document ID of the image.
  "DATA": [
    {
      "INDEX": 1, //The Face index of the first detected face in the current document : 12456
      "LEFT": 2517,
      "RIGHT": 3963,
      "TOP": 1187,
      "BOTTOM": 2538
    },
     {
      "INDEX": 2,//The Face index of the second detected face in the current document : 12456
      "LEFT": 277,
      "RIGHT": 2963,
      "TOP": 187,
      "BOTTOM": 538
    }
  ]
}
3. matchHumanFaces #
Compares two detected faces and determines their similarity.
  Future<String?> matchHumanFaces(
      {required int firstDocumentID,
      required int firstDocumentFaceIndex,
      required int secondDocumentID,
      required int secondDocumentFaceIndex})
//firstDocumentID: Document ID of the first image.
//firstDocumentFaceIndex: Face index of the first face.
//secondDocumentID: Document ID of the second image.
//secondDocumentFaceIndex: Face index of the second face.
Example
String? matchResponse = await _quickcapturePlugin.matchHumanFaces(
  firstDocumentID,
  firstDocumentFaceIndex,
  secondDocumentID,
  secondDocumentFaceIndex,
);
print("Match result: $matchResponse");
Response:
//On success
{
  "STATUS": true,
  "ACCURACY": 85,
  "DESCRIPTION": "<Standard explanation for match>"
}
// On failure
{
  "STATUS": false,
  "ACCURACY": null,
  "DESCRIPTION": "<Technical reason for failure>"
}
Match Level Descriptions #
The match level is determined based on the accuracy percentage, which reflects the similarity between two facial images. The table below provides detailed descriptions for each match level.
| Match Percentage | Match Level | Description | 
|---|---|---|
| 90% - 100% | Perfect Match | Faces match perfectly! The similarity is extremely high, and they are almost certainly the same person. | 
| 80% - 89% | Strong Match | Faces matched successfully. The similarity is high, indicating a strong likelihood of being the same person. | 
| 65% - 79% | Moderate Match | Faces show a good match. Some features match well, but additional validation may be necessary. | 
| 50% - 64% | Low Confidence Match | Faces share some similarity, but the match is not strong enough to confirm. Results are inconclusive. | 
| 0% - 49% | No Match | Faces do not match. There is minimal similarity, and they are highly unlikely to be the same person. | 
Usage of Results #
- 
Perfect Match (90% - 100%): - Suitable for high-confidence applications such as secure identity verification or critical decision-making scenarios.
 
- 
Strong Match (80% - 89%): - Applicable where a high probability of matching is sufficient, but users may choose to review the results for added assurance.
 
- 
Moderate Match (65% - 79%): - Recommended for use in general-purpose applications. Additional manual validation may be required to confirm the match.
 
- 
Low Confidence Match (50% - 64%): - Results are inconclusive. Users should consider re-evaluating with higher-quality images or alternative methods.
 
- 
No Match (0% - 49%): - Faces are highly unlikely to match. This can be used as a definitive rejection in most cases.
 
Configurations #
The Config class provides detailed control over the image and capture settings.
1. Image Configuration #
Use ConfigImage to manage image-specific settings.
| Property | Description | 
|---|---|
| ImageQuality | Quality of the output image (e.g., photoQuality,documentQuality,compressedDocument). | 
| DPI | DPI of the output (e.g., 150,200,300). | 
| LayoutType | Document layout (e.g., A3,A4,A5). | 
| ResizeMode | Strategy for resizing the image: | 
| - preserveAspectOnly(default, recommended): Maintains aspect ratio while scaling. | |
| - stretchToExactSize: Forces exact width and height, may distort. | |
| - fitWithAspect: Fits within dimensions, maintaining aspect ratio with padding. | 
Recommended Settings:
- ImageQuality:
documentQuality- DPI:
150or200- LayoutType:
A4- ResizeMode:
preserveAspectOnly
Example
Quickcapture _quickcapturePlugin = Quickcapture();
Config imgConfig = _quickcapturePlugin.config.image;
imgConfig.setImageQuality(ImageQuality.documentQuality);
imgConfig.setDPI(DPI.dpi200);
imgConfig.setLayoutType(LayoutType.A4);
imgConfig.setResizeMode(ResizeMode.preserveAspectOnly);
2. Capture Configuration #
Use ConfigCapture to manage capture-specific settings.
| Property | Description | 
|---|---|
| captureSound | Enables or disables capture sound ( true/false). | 
| enableFlash | Enables or disables flash during capture ( true/false). | 
| showCaptureCountAndLimit | Displays capture count and limit ( true/false). | 
| colorMode | Sets the color mode ( rgb,grayScale). | 
| maxPage | Limits the number of pages to capture. ( 0= unlimited). | 
| cameraToggle | Switch between front/back cameras ( enableBackDefault,enableFrontDefault). | 
| bottomStampData | BottomStampData - This configuration will automatically print the specified text at the bottom of the captured image with correct alignment, font size and DPI. This also supports placeholders, such as {DATETIME}, which will be replaced with the current date and time from the device at the time of stamping. $ - for new line print.This will only support for captured with SDK camera image. | 
Example
Quickcapture _quickcapturePlugin = Quickcapture();
Config captureConfig = _quickcapturePlugin.config.capture;
captureConfig.enableFlash = true;
captureConfig.captureSound = false;
captureConfig.maxPage = 2;
captureConfig.cameraToggle = CameraToggleType.enableBackDefault;
captureConfig.bottomStampData = "Scanned on {DATETIME} $ Scanned User ID :123456";
Method Summary #
| Method | Description | Return Value | 
|---|---|---|
| activateLicense | Activates the plugin license. | trueon success. | 
| initialize | Initializes the plugin. | void. | 
| startCapture | Starts document capture. | JSON with capture details. | 
| buildPDFForLastCapture | Generates a PDF from the last capture. | File path of the generated PDF. | 
| buildTIFFForLastCapture | Generates a TIFF from the last capture. | File path of the generated TIFF. | 
| setCustomLayout | Sets custom layout dimensions. | trueon success. | 
| compressToJPEG | Compresses and optimizes an image. | File path of the JPEG image. | 
| initHumanFaceHelper | Initializes the Human Face Helper module. | void. | 
| detectHumanFaces | Detects human faces from the input image. | JSON reponse of detection | 
| matchHumanFaces | Compares two detected faces and determines their similarity. | JSON reponse of match | 
| buildPDF | Build compressed single PDF output file from a list of provided images. | JSON reponse of the build | 
| buildTiff | Build compressed single TIFF output file from a list of provided images. | JSON reponse of the build | 
Plugin Dependencies #
To ensure smooth functionality and cross-platform compatibility, the plugin relies on the following dependencies.
1. Collection #
- Version: ^1.19.0
- Purpose: Provides advanced collection manipulation utilities in Dart, such as:
- Equality comparison
- Ordering utilities
- Additional helper methods
 
- Documentation: Collection Package
2. Flutter #
- Source: Flutter SDK
- Purpose: Core framework for building the plugin and integrating with Flutter applications.
- Documentation: Flutter Framework
3. Plugin Platform Interface #
- Version: ^2.0.2
- Purpose: Defines platform interface libraries for Flutter plugins, ensuring proper implementation for:
- Android
- iOS
- Other supported platforms
 
- Documentation: Plugin Platform Interface
Notes #
- Initialization: Always call initializebefore using the plugin.
- License Activation: Ensure the license is activated before use for all features.
For more information, refer to the Quickcapture documentation.