@dariyd/react-native-text-recognition
Version:
Advanced OCR text recognition for React Native with Vision API (iOS) and ML Kit (Android). Supports multi-language recognition, PDF files, and both old and new React Native architectures.
113 lines (98 loc) • 3.05 kB
JavaScript
// main index.js
import { NativeModules, Platform } from 'react-native';
const LINKING_ERROR =
`The package 'react-native-text-recognition' doesn't seem to be linked. Make sure: \n\n` +
Platform.select({ ios: "- You have run 'pod install'\n", default: '' }) +
'- You rebuilt the app after installing the package\n' +
'- You are not using Expo Go\n';
// Try new architecture (TurboModule) first, then fall back to old architecture
let ReactNativeTextRecognition;
if (global.__turboModuleProxy != null) {
try {
const TurboModuleRegistry = require('react-native').TurboModuleRegistry;
ReactNativeTextRecognition = TurboModuleRegistry.get('ReactNativeTextRecognition');
} catch (e) {
// New architecture not available, fall back to old arch
console.log('TurboModule not available, using old architecture');
}
}
// Fall back to old architecture (NativeModules)
if (!ReactNativeTextRecognition) {
ReactNativeTextRecognition = NativeModules.ReactNativeTextRecognition;
}
// If still not found, throw a helpful error
if (!ReactNativeTextRecognition) {
ReactNativeTextRecognition = new Proxy(
{},
{
get() {
throw new Error(LINKING_ERROR);
},
}
);
}
export default ReactNativeTextRecognition;
/**
* Recognizes text from an image or PDF file
* @param {string} fileUrl - Local file URL (file://, content://, or http(s)://)
* @param {object} options - Recognition options
* @param {function} callback - Optional callback for compatibility
* @returns {Promise} Promise with recognition results
*/
export function recognizeText(fileUrl, options, callback) {
// Handle overloaded signatures
if (typeof options === 'function') {
callback = options;
options = {};
}
if (!options) {
options = {};
}
return new Promise((resolve, reject) => {
ReactNativeTextRecognition.recognizeText(
fileUrl,
options,
(result) => {
if (callback) callback(result);
if (result.error) {
reject(new Error(result.errorMessage || 'Text recognition failed'));
} else {
resolve(result);
}
}
);
});
}
/**
* Legacy method for backward compatibility
* @deprecated Use recognizeText instead
*/
export function detectText(imageUrl, callback) {
return new Promise((resolve) => {
ReactNativeTextRecognition.detectText(
imageUrl,
(result) => {
if (callback) callback(result);
resolve(result);
}
);
});
}
/**
* Check if text recognition is available on this device
* @returns {Promise<boolean>}
*/
export function isAvailable() {
return ReactNativeTextRecognition.isAvailable
? ReactNativeTextRecognition.isAvailable()
: Promise.resolve(true);
}
/**
* Get list of supported languages for text recognition
* @returns {Promise<string[]>}
*/
export function getSupportedLanguages() {
return ReactNativeTextRecognition.getSupportedLanguages
? ReactNativeTextRecognition.getSupportedLanguages()
: Promise.resolve(['en']);
}