Android에서 ML Kit를 사용한 문서 스캐너

ML Kit 문서 스캐너 API를 사용하여 문서 스캐너 기능을 앱에 쉽게 추가할 수 있습니다.

기능 세부정보
SDK 이름 play-services-mlkit-document-scanner
구현 모델, 스캔 로직 및 UI 흐름은 Google Play 서비스에 의해 동적으로 다운로드됩니다.
앱 크기의 영향 최대 300KB의 다운로드 크기 증가
초기화 시간 사용자는 처음 사용하기 전에 모델, 로직, UI 흐름이 다운로드될 때까지 기다려야 할 수도 있습니다.

사용해 보기

샘플 앱을 살펴보고 이 API의 사용 예를 확인합니다.

시작하기 전에

  1. 프로젝트 수준의 build.gradle 파일에서 buildscript 및 allprojects 섹션에 Google의 Maven 저장소가 포함되어야 합니다.

  2. 모듈의 앱 수준 Gradle 파일(일반적으로 app/build.gradle)에 ML Kit 문서 스캐너 라이브러리의 종속 항목을 추가합니다.

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

Document Scanner 구성

문서 스캐너 사용자 흐름 (전용 뷰파인더 화면 및 미리보기 화면 포함)은 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의 인스턴스를 가져옵니다. 그런 다음 AndroidX에 도입된 Activity Result API에 따라 스캐너 활동을 시작할 수 있습니다.

문서 스캔이 완료되면 GmsDocumentScanningResult 객체가 스캔된 페이지 수, JPEG 형식의 이미지 URI, setResultFormats를 통해 정의된 내용에 따라 PDF에 대한 액세스 권한을 부여합니다.

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 또는 둘 다)만 요청하세요.