סורק מסמכים עם ML Kit ב-Android

כדי להוסיף בקלות תכונה של סורק מסמכים לאפליקציה, משתמשים ב-ML Kit Scanner API.

Feature פרטים
שם Sdk play-services-mlkit-document-scanner
הטמעה Google Play Services מורידה באופן דינמי את המודלים, את לוגיקת הסריקה ואת התהליך בממשק המשתמש.
ההשפעה של גודל האפליקציה הגדלה של כ-300KB בגודל ההורדה.
זמן האתחול יכול להיות שהמשתמשים יצטרכו להמתין עד להורדת המודלים, הלוגיקה ותהליך ממשק המשתמש לפני השימוש הראשון.

אני רוצה לנסות

תוכלו להתנסות באפליקציה לדוגמה כדי לראות דוגמה לשימוש ב-API הזה.

לפני שמתחילים

  1. בקובץ build.gradle ברמת הפרויקט, חשוב לכלול את מאגר Maven של Google בקטע ה-buildscript ובקטע allprojects.

  2. מוסיפים את התלות של ספריית סורק המסמכים של ML Kit לקובץ gradle ברמת האפליקציה של המודול, שהוא בדרך כלל app/build.gradle:

dependencies {
   // …
   implementation 'com.google.android.gms:play-services-mlkit-document-scanner:16.0.0-beta1'
}

תצורה של סורק מסמכים

ה-SDK מספק את תהליך העבודה של המשתמש בסורק המסמכים (שכולל מסך ייעודי של העינית ומסך התצוגה המקדימה). העינית ומסך התצוגה המקדימה תומכים בפקדים הבאים שניתן להתאים אישית:

  • יבוא מגלריית התמונות
  • הגדרת מגבלה למספר העמודים בסריקה
  • מצב סורק (לשליטה בקבוצות התכונות בתהליך)

אפשר לאחזר קובצי PDF וגם JPEG למסמכים הסרוקים.

יוצרים מופע של GmsDocumentScannerOptions כדי להגדיר את אפשרויות הסורק:

Kotlin

val options = GmsDocumentScannerOptions.Builder()
    .setGalleryImportAllowed(false)
    .setPageLimit(2)
    .setResultFormats(RESULT_FORMAT_JPEG, RESULT_FORMAT_PDF)
    .setScannerMode(SCANNER_MODE_FULL)
    .build()

Java

GmsDocumentScannerOptions options = new GmsDocumentScannerOptions.Builder()
    .setGalleryImportAllowed(false)
    .setPageLimit(2)
    .setResultFormats(RESULT_FORMAT_JPEG, RESULT_FORMAT_PDF)
    .setScannerMode(SCANNER_MODE_FULL)
    .build();

סריקת מסמכים

אחרי שיוצרים את GmsDocumentScannerOptions, מקבלים מכונה של GmsDocumentScanner. לאחר מכן תוכלו להתחיל את הפעילות של הסורק בהתאם להנחיות של Activity results API ב-AndroidX.

כשסריקת המסמך מסתיימת, אובייקט GmsDocumentScanningResult מעניק גישה למספר הדפים שנסרקו, מזהי ה-URI של התמונות בפורמט JPEG ו-PDF, בהתאם למה שהוגדר באמצעות setResultFormats:

Kotlin

val scanner = GmsDocumentScanning.getClient(options)
val scannerLauncher = registerForActivityResult(StartIntentSenderForResult()) {
  result -> {
    if (result.resultCode == RESULT_OK) {
      val result =
        GmsDocumentScanningResult.fromActivityResultIntent(result.data)
      result.getPages()?.let { pages ->
        for (page in pages) {
          val imageUri = pages.get(0).getImageUri()
        }
      }
      result.getPdf()?.let { pdf ->
        val pdfUri = pdf.getUri()
        val pageCount = pdf.getPageCount()
      }
    }
  }
}

scanner.getStartScanIntent(activity)
  .addOnSuccessListener { intentSender ->
     scannerLauncher.launch(IntentSenderRequest.Builder(intentSender).build())
   }
  .addOnFailureListener {
    ...
  }

Java

GmsDocumentScanner scanner = GmsDocumentScanning.getClient(options);
ActivityResultLauncher<IntentSenderRequest> scannerLauncher =
  registerForActivityResult(
    new StartIntentSenderForResult(),
      result -> {
        if (result.getResultCode() == RESULT_OK) {
          GmsDocumentScanningResult result = GmsDocumentScanningResult.fromActivityResultIntent(result.getData());
          for (Page page : result.getPages()) {
            Uri imageUri = pages.get(0).getImageUri();
          }

          Pdf pdf = result.getPdf();
          Uri pdfUri = pdf.getUri();
          int pageCount = pdf.getPageCount();
        }
      });

scanner.getStartScanIntent(activity)
  .addOnSuccessListener(intentSender ->
    scannerLauncher.launch(new IntentSenderRequest.Builder(intentSender).build()))
  .addOnFailureListener(...);

טיפים לשיפור הביצועים

חשוב לזכור שיצירת קובצי מסמכים לוקחת זמן ודורשת כוח עיבוד, לכן כדאי לבקש רק את הפורמטים של הפלט (JPEG או PDF או שניהם) שבאמת נחוצים לכם.