Pure Javascript OCR for more than 100 Languages 📖🎉🖥
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

114 lines
3.0 KiB

/**
*
* Tesseract Worker adapter for browser
*
* @fileoverview Tesseract Worker adapter for browser
* @author Kevin Kwok <antimatter15@gmail.com>
* @author Guillermo Webster <gui@mit.edu>
* @author Jerome Wu <jeromewus@gmail.com>
*/
const check = require('check-types');
const resolveURL = require('resolve-url');
7 years ago
const { defaultOptions } = require('../common/options');
const { version } = require('../../package.json');
7 years ago
/**
* loadImage
*
* @name loadImage
* @function load image from different source
* @access public
* @param {string, object} image - image source, supported formats:
* string: URL string, can be relative path
* File instance: data from <input type="file" />
* @returns {array} binary image in array format
*/
const loadImage = (image) => {
if (check.string(image)) {
return fetch(resolveURL(image))
.then(resp => resp.arrayBuffer());
7 years ago
}
if (check.instance(image, File)) {
return new Promise((res) => {
const fileReader = new FileReader();
fileReader.onload = () => {
res(fileReader.result);
};
fileReader.readAsArrayBuffer(image);
});
}
return Promise.reject();
7 years ago
};
/*
* Default options for browser worker
*/
7 years ago
exports.defaultOptions = {
...defaultOptions,
workerPath: process.env.NODE_ENV === 'development'
? resolveURL(`/dist/worker.dev.js?nocache=${Math.random().toString(36).slice(3)}`)
: `https://cdn.jsdelivr.net/gh/naptha/tesseract.js@v${version}/dist/worker.min.js`,
/*
* If browser doesn't support WebAssembly,
* load ASM version instead
*/
7 years ago
corePath: `https://cdn.jsdelivr.net/gh/naptha/tesseract.js-core@v2.0.0-beta.5/tesseract-core${typeof WebAssembly === 'object' ? '' : '.asm'}.js`,
};
9 years ago
/**
* spawnWorker
*
* @name spawnWorker
* @function create a new Worker in browser
* @access public
* @param {object} instance - TesseractWorker instance
* @param {object} options
* @param {string} options.workerPath - worker script path
*/
7 years ago
exports.spawnWorker = (instance, { workerPath }) => {
7 years ago
let worker;
if (window.Blob && window.URL) {
const blob = new Blob([`importScripts("${workerPath}");`]);
7 years ago
worker = new Worker(window.URL.createObjectURL(blob));
} else {
7 years ago
worker = new Worker(workerPath);
7 years ago
}
worker.onmessage = ({ data }) => {
instance.recv(data);
7 years ago
};
return worker;
};
/**
* terminateWorker
*
* @name terminateWorker
* @function terminate worker
* @access public
* @param {object} instance TesseractWorker instance
*/
7 years ago
exports.terminateWorker = (instance) => {
instance.worker.terminate();
};
/**
* sendPacket
*
* @name sendPacket
* @function send packet to worker and create a job
* @access public
* @param {object} instance TesseractWorker instance
* @param {object} iPacket data for worker
*/
7 years ago
exports.sendPacket = (instance, iPacket) => {
const packet = { ...iPacket };
7 years ago
loadImage(packet.payload.image)
.then(buf => new Uint8Array(buf))
.then((img) => {
7 years ago
packet.payload.image = Array.from(img);
instance.worker.postMessage(packet);
7 years ago
});
};