WeScan makes it easy to add scanning functionalities to your iOS app!
It's modelled after UIImagePickerController, which makes it a breeze to use.
- Fast and lightweight
- Live scanning of documents
- Edit detected rectangle
- Auto scan and flash support
- Support for both PDF and UIImage
- Translated to English, Chinese, Italian, Portuguese, and French
- Batch scanning
- SwiftUI Wrapper
- Swift 5.0
- iOS 10.0+
The Swift Package Manager is a tool for automating the distribution of Swift code and is integrated into the swift compiler. It is in early development, but WeScan does support its use on supported platforms.
- In Xcode, select File → Add Packages...
- Enter the repository URL:
https://github.com/raguraman-iOS/WeScan.git - Select the version rule and click Add Package
Once you have your Swift package set up, adding WeScan as a dependency is as easy as adding it to the dependencies value of your Package.swift.
dependencies: [
.package(url: "https://github.com/raguraman-iOS/WeScan.git", .upToNextMajor(from: "2.1.0"))
]Note: This repository is a fork of the original WeTransfer/WeScan with additional features including multiple page scanning with reordering, add, and delete capabilities.
-
In order to make the framework available, add
import WeScanat the top of the Swift source file -
In the Info.plist, add the
NSCameraUsageDescriptionkey and set the appropriate value in which you have to inform the user of the reason to allow the camera permission -
Make sure that your view controller conforms to the
ImageScannerControllerDelegateprotocol:
class YourViewController: UIViewController, ImageScannerControllerDelegate {
// YourViewController code here
}- Implement the delegate functions inside your view controller:
func imageScannerController(_ scanner: ImageScannerController, didFailWithError error: Error) {
// You are responsible for carefully handling the error
print(error)
}
func imageScannerController(_ scanner: ImageScannerController, didFinishScanningWithResults results: ImageScannerResults) {
// The user successfully scanned an image, which is available in the ImageScannerResults
// You are responsible for dismissing the ImageScannerController
scanner.dismiss(animated: true)
}
func imageScannerControllerDidCancel(_ scanner: ImageScannerController) {
// The user tapped 'Cancel' on the scanner
// You are responsible for dismissing the ImageScannerController
scanner.dismiss(animated: true)
}- Finally, create and present a
ImageScannerControllerinstance somewhere within your view controller:
let scannerViewController = ImageScannerController()
scannerViewController.imageScannerDelegate = self
present(scannerViewController, animated: true)WeScan supports scanning multiple pages with reordering, add, and delete features. To enable this functionality:
- Set the
isMultiplePageScanningEnabledproperty totruewhen creating the scanner:
let scannerViewController = ImageScannerController(isMultiplePageScanningEnabled: true)
scannerViewController.imageScannerDelegate = self
present(scannerViewController, animated: true)- Implement the
didFinishScanningWithMultipleResultsdelegate method to receive an array of results:
func imageScannerController(_ scanner: ImageScannerController, didFinishScanningWithMultipleResults results: [ImageScannerResults]) {
// The user successfully scanned multiple pages
// results is an array of ImageScannerResults, one for each scanned page
// You are responsible for dismissing the ImageScannerController
scanner.dismiss(animated: true)
// Process the results
for (index, result) in results.enumerated() {
let image = result.doesUserPreferEnhancedScan ?
(result.enhancedScan?.image ?? result.croppedScan.image) :
result.croppedScan.image
// Use the image as needed
print("Page \(index + 1): \(image.size)")
}
}Features:
- Reordering: Long press and drag pages to reorder them
- Add Pages: Tap the "+" button to scan additional pages
- Delete Pages: Tap the "X" button on any page to remove it
- Edit Individual Pages: Tap on any page to edit it individually
Note: When isMultiplePageScanningEnabled is false (the default), the traditional single-page scanning flow is used, and the didFinishScanningWithResults method is called instead.
- Create a dummy swift class in your project. When Xcode asks if you'd like to create a bridging header, press 'Create Bridging Header'
- In the new header, add the Objective-C class (
#import myClass.h) where you want to use WeScan - In your class, import the header (
import <yourProjectName.swift.h>) - Drag and drop the WeScan folder to add it to your project
- In your class, add
@Class ImageScannerController;
ImageScannerController *scannerViewController = [[ImageScannerController alloc] init];
[self presentViewController:scannerViewController animated:YES completion:nil];As the creators, and maintainers of this project, we're glad to invite contributors to help us stay up to date. Please take a moment to review the contributing document in order to make the contribution process easy and effective for everyone involved.
- If you found a bug, open an issue.
- If you have a feature request, open an issue.
- If you want to contribute, submit a pull request.
WeScan is available under the MIT license. See the LICENSE file for more info.

