Skip to content

Repository files navigation

React Native Document Scanner

Npm package versionnpm dev dependency version

This is a React Native plugin that lets you scan documents using Android and iOS. You can use it to create apps that let users scan notes, homework, business cards, receipts, or anything with a rectangular shape.

iOSAndroid
Dollar-iOSDollar Android

Install

npm install react-native-document-scanner-plugin

After installing the plugin, you need to follow the steps below

iOS

  1. iOS requires the following usage description be added and filled out for your app in Info.plist:
  • NSCameraUsageDescription (Privacy - Camera Usage Description)
  1. Install pods by running
cd ios && pod install &&cd ..

Android

Note: You don't need to prompt the user to accept camera permissions for this plugin to work unless you're using another plugin that requires the user to accept camera permissions. See Android Camera Permissions.

Examples

Basic Example

importReact,{useState,useEffect}from'react'import{Image}from'react-native'importDocumentScannerfrom'react-native-document-scanner-plugin'exportdefault()=>{const[scannedImage,setScannedImage]=useState();constscanDocument=async()=>{// start the document scannerconst{ scannedImages }=awaitDocumentScanner.scanDocument()// get back an array with scanned image file pathsif(scannedImages.length>0){// set the img src, so we can view the first scanned imagesetScannedImage(scannedImages[0])}}useEffect(()=>{// call scanDocument on loadscanDocument()},[]);return(<ImageresizeMode="contain"style={{width: '100%',height: '100%'}}source={{uri: scannedImage}}/>)}

Here's what this example looks like with several items

Dollar.iOS.mp4

Dollar.Android.mp4

Business.Card.iOS.mp4

Business.Card.Android.mp4

Sign.iOS.mp4

Sign.Android.mp4

Notes.iOS.mp4

Notes.Android.mp4

Laptop.iOS.mp4

Laptop.Android.mp4

Limit Number of Scans

You can limit the number of scans. For example if your app lets a user scan a business card you might want them to only capture the front and back. In this case you can set maxNumDocuments to 2. This only works on Android.

importReact,{useState,useEffect}from'react'import{Image}from'react-native'importDocumentScannerfrom'react-native-document-scanner-plugin'exportdefault()=>{const[scannedImage,setScannedImage]=useState();constscanDocument=async()=>{// start the document scannerconst{ scannedImages }=awaitDocumentScanner.scanDocument({maxNumDocuments: 2})// get back an array with scanned image file pathsif(scannedImages.length>0){// set the img src, so we can view the first scanned imagesetScannedImage(scannedImages[0])}}useEffect(()=>{// call scanDocument on loadscanDocument()},[]);return(<ImageresizeMode="contain"style={{width: '100%',height: '100%'}}source={{uri: scannedImage}}/>)}

Limit.Num.Scans.Android.mp4

Documentation

scanDocument(...)

scanDocument(options?: ScanDocumentOptions|undefined)=>Promise<ScanDocumentResponse>

Opens the camera, and starts the document scan

ParamType
optionsScanDocumentOptions

Returns:Promise<ScanDocumentResponse>


Interfaces

ScanDocumentResponse

PropTypeDescription
scannedImagesstring[]This is an array with either file paths or base64 images for the document scan.
statusScanDocumentResponseStatusThe status lets you know if the document scan completes successfully, or if the user cancels before completing the document scan.

ScanDocumentOptions

PropTypeDescriptionDefault
croppedImageQualitynumberThe quality of the cropped image from 0 - 100. 100 is the best quality.: 100
maxNumDocumentsnumberAndroid only: The maximum number of photos an user can take (not counting photo retakes): undefined
responseTypeResponseTypeThe response comes back in this format on success. It can be the document scan image file paths or base64 images.: ResponseType.ImageFilePath

Enums

ScanDocumentResponseStatus

MembersValueDescription
Success'success'The status comes back as success if the document scan completes successfully.
Cancel'cancel'The status comes back as cancel if the user closes out of the camera before completing the document scan.

ResponseType

MembersValueDescription
Base64'base64'Use this response type if you want document scan returned as base64 images.
ImageFilePath'imageFilePath'Use this response type if you want document scan returned as inmage file paths.

Expo

This plugin doesn't run in Expo Go. It works with Expo, and you can avoid manually changing iOS and Android files by following these steps.

npx expo install react-native-document-scanner-plugin

Add react-native-document-scanner-plugin to plugins in app.json or app.config.json.

{"name": "my expo app","plugins": [["react-native-document-scanner-plugin",{"cameraPermission": "We need camera access, so you can scan documents"}]]}
npx expo prebuild

or

eas build

Common Mistakes

Android Camera Permissions

You don't need to request camera permissions unless you're using another camera plugin that adds <uses-permission android:name="android.permission.CAMERA" /> to the application's AndroidManifest.xml.

In that case if you don't request camera permissions you get this error Error: error - error opening camera: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE

Here's an example of how to request camera permissions.

importReact,{useState,useEffect}from'react'import{Platform,PermissionsAndroid,Image,Alert}from'react-native'importDocumentScannerfrom'react-native-document-scanner-plugin'exportdefault()=>{const[scannedImage,setScannedImage]=useState();constscanDocument=async()=>{// prompt user to accept camera permission request if they haven't alreadyif(Platform.OS==='android'&&awaitPermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.CAMERA)!==PermissionsAndroid.RESULTS.GRANTED){Alert.alert('Error','User must grant camera permissions to use document scanner.')return}// start the document scannerconst{ scannedImages }=awaitDocumentScanner.scanDocument()// get back an array with scanned image file pathsif(scannedImages.length>0){// set the img src, so we can view the first scanned imagesetScannedImage(scannedImages[0])}}useEffect(()=>{// call scanDocument on loadscanDocument()},[]);return(<ImageresizeMode="contain"style={{width: '100%',height: '100%'}}source={{uri: scannedImage}}/>)}

About

A React Native document scanner plugin for Android and iOS

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages