92 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
import 'dart:io';
 | 
						|
import 'dart:math';
 | 
						|
import 'dart:typed_data';
 | 
						|
 | 
						|
import 'package:flutter/material.dart';
 | 
						|
import 'package:path/path.dart' as p;
 | 
						|
import 'package:path_provider/path_provider.dart';
 | 
						|
import 'package:pdf_image_renderer/pdf_image_renderer.dart';
 | 
						|
import 'package:scanbot_sdk/scanbot_sdk.dart';
 | 
						|
import 'package:scanbot_sdk/scanbot_sdk_ui_v2.dart' hide IconButton, EdgeInsets;
 | 
						|
 | 
						|
/// Scan document as PDF
 | 
						|
Future<Uint8List> scanDocAsPDF() async {
 | 
						|
  var configuration = DocumentScanningFlow(
 | 
						|
    appearance: DocumentFlowAppearanceConfiguration(
 | 
						|
      statusBarMode: StatusBarMode.DARK,
 | 
						|
    ),
 | 
						|
    cleanScanningSession: true,
 | 
						|
    outputSettings: DocumentScannerOutputSettings(pagesScanLimit: 1),
 | 
						|
    screens: DocumentScannerScreens(
 | 
						|
      review: ReviewScreenConfiguration(enabled: false),
 | 
						|
    ),
 | 
						|
  );
 | 
						|
  var documentResult = await ScanbotSdkUiV2.startDocumentScanner(configuration);
 | 
						|
 | 
						|
  if (documentResult.status != OperationStatus.OK) {
 | 
						|
    throw Exception("Scanner failed with status ${documentResult.status}");
 | 
						|
  }
 | 
						|
 | 
						|
  // Convert result to PDF
 | 
						|
  var result = await ScanbotSdk.document.createPDFForDocument(
 | 
						|
    PDFFromDocumentParams(
 | 
						|
      documentID: documentResult.data!.uuid,
 | 
						|
      pdfConfiguration: PdfConfiguration(),
 | 
						|
    ),
 | 
						|
  );
 | 
						|
  final pdfPath = result.pdfFileUri.replaceFirst("file://", "");
 | 
						|
  return File(pdfPath).readAsBytes();
 | 
						|
}
 | 
						|
 | 
						|
/// Render PDF to image bits
 | 
						|
Future<Uint8List> renderPdf({String? path, Uint8List? pdfBytes}) async {
 | 
						|
  assert(path != null || pdfBytes != null);
 | 
						|
 | 
						|
  // Create temporary file if required
 | 
						|
  var isTemp = false;
 | 
						|
  if (path == null) {
 | 
						|
    path = p.join(
 | 
						|
      (await getTemporaryDirectory()).absolute.path,
 | 
						|
      "render-${Random().nextInt(10000).toString()}+.pdf",
 | 
						|
    );
 | 
						|
 | 
						|
    await File(path).writeAsBytes(pdfBytes!);
 | 
						|
    isTemp = true;
 | 
						|
  }
 | 
						|
 | 
						|
  try {
 | 
						|
    final pdf = PdfImageRenderer(path: path);
 | 
						|
    await pdf.open();
 | 
						|
    await pdf.openPage(pageIndex: 0);
 | 
						|
 | 
						|
    // get the render size after the page is loaded
 | 
						|
    final size = await pdf.getPageSize(pageIndex: 0);
 | 
						|
 | 
						|
    // get the actual image of the page
 | 
						|
    final img = await pdf.renderPage(
 | 
						|
      pageIndex: 0,
 | 
						|
      x: 0,
 | 
						|
      y: 0,
 | 
						|
      width: size.width,
 | 
						|
      // you can pass a custom size here to crop the image
 | 
						|
      height: size.height,
 | 
						|
      // you can pass a custom size here to crop the image
 | 
						|
      scale: 1,
 | 
						|
      // increase the scale for better quality (e.g. for zooming)
 | 
						|
      background: Colors.white,
 | 
						|
    );
 | 
						|
 | 
						|
    // close the page again
 | 
						|
    await pdf.closePage(pageIndex: 0);
 | 
						|
 | 
						|
    // close the PDF after rendering the page
 | 
						|
    pdf.close();
 | 
						|
 | 
						|
    return img!;
 | 
						|
  } finally {
 | 
						|
    if (isTemp) {
 | 
						|
      await File(path).delete();
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 |