diff --git a/package-lock.json b/package-lock.json index 48e3e83..4e2681c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8553,9 +8553,9 @@ } }, "tesseract.js-core": { - "version": "2.0.0-beta.10", - "resolved": "https://registry.npmjs.org/tesseract.js-core/-/tesseract.js-core-2.0.0-beta.10.tgz", - "integrity": "sha512-QmNgMA9m5ES5uMTqpOAPysrUA80vUx/6WKQlfkK3zhOeAgqv8DjwwcDv9tQv2TgRzOQ+LFKrJn94Y2rw5b2IGw==" + "version": "2.0.0-beta.11", + "resolved": "https://registry.npmjs.org/tesseract.js-core/-/tesseract.js-core-2.0.0-beta.11.tgz", + "integrity": "sha512-07haKH2JYYo0OfIJoioMS9dDiI5Hrl7+r1MqjeNAAT5WpKO0ATe4cpncC8s1kz0e3s1kaC5WOwL3YJcjbJE+hg==" }, "tesseract.js-utils": { "version": "1.0.0-beta.8", diff --git a/package.json b/package.json index d707c69..6c8e2a3 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "node-fetch": "^2.3.0", "opencollective-postinstall": "^2.0.2", "resolve-url": "^0.2.1", - "tesseract.js-core": "^2.0.0-beta.10", + "tesseract.js-core": "^2.0.0-beta.11", "tesseract.js-utils": "^1.0.0-beta.8" }, "repository": { diff --git a/src/common/dump.js b/src/common/dump.js index 4a4965f..9ec104b 100644 --- a/src/common/dump.js +++ b/src/common/dump.js @@ -78,7 +78,10 @@ module.exports = (TessModule, api, { for (let i = 0; i < n; i += 1) { polygon.push([px.getValue(i), py.getValue(i)]); } - TessModule._ptaDestroy(TessModule.getPointer(poly)); + /* + * TODO: find out why _ptaDestroy doesn't work + */ + // TessModule._ptaDestroy(TessModule.getPointer(poly)); } block = { diff --git a/src/common/types.js b/src/common/types.js index 68ae1f8..63d46a8 100644 --- a/src/common/types.js +++ b/src/common/types.js @@ -12,7 +12,6 @@ module.exports = { LSTM_ONLY: 1, TESSERACT_LSTM_COMBINED: 2, DEFAULT: 3, - COUNT: 4, }, /* * PSM = Page Segmentation Mode @@ -31,6 +30,5 @@ module.exports = { SPARSE_TEXT: '10', SPARSE_TEXT_OSD: '11', RAW_LINE: '12', - COUNT: '13', }, }; diff --git a/src/common/workerUtils.js b/src/common/workerUtils.js index 296bf7a..86c3f12 100644 --- a/src/common/workerUtils.js +++ b/src/common/workerUtils.js @@ -11,6 +11,7 @@ const { readImage, loadLang } = require('tesseract.js-utils'); const pdfTTF = require('./pdf-ttf'); const dump = require('./dump'); const { defaultParams } = require('./options'); +const { OEM, PSM } = require('./types'); /* * Tesseract Module returned by TesseractCore. @@ -201,11 +202,33 @@ const loadLanguage = ({ langs, options }, res) => { * @param {object} res - job instance */ const handleRecognize = ({ - image, langs, options, params: customParams, -}, res) => ( - handleInit(options, res) + image, langs: iLangs, options, params: customParams, +}, res) => { + const params = { + ...defaultParams, + ...customParams, + }; + const { tessedit_pageseg_mode } = params; + let langs = iLangs; + + /* + * When PSM === OSD_ONLY or AUTO_OSD or RAW_LINE + * osd.traineddata must be included and + * OEM must be TESSERACT_ONLY (LSTM doesn't support OSD) + */ + if ([ + PSM.OSD_ONLY, + PSM.AUTO_OSD, + PSM.RAW_LINE, + ].includes(tessedit_pageseg_mode)) { + langs = (typeof iLangs === 'string') + ? `${iLangs}+osd` + : [...iLangs, 'osd']; + params.tessedit_ocr_engine_mode = OEM.TESSERACT_ONLY; + } + return handleInit(options, res) .then(() => ( - loadLanguage({ langs, options }, res) + loadLanguage({ langs, params, options }, res) .catch((e) => { if (e instanceof DOMException) { /* @@ -222,10 +245,6 @@ const handleRecognize = ({ const progressUpdate = (progress) => { res.progress({ status: 'initializing api', progress }); }; - const params = { - ...defaultParams, - ...customParams, - }; progressUpdate(0); handleParams(langs, params); progressUpdate(0.5); @@ -241,8 +260,8 @@ const handleRecognize = ({ res.reject({ err }); } }) - )) -); + )); +}; /** * handleDetect @@ -263,8 +282,8 @@ const handleDetect = ({ .then(() => ( loadLanguage({ langs, options }, res) .then(() => { - api.Init(null, getLangsStr(langs)); - api.SetPageSegMode(TessModule.PSM_OSD_ONLY); + api.Init(null, getLangsStr(langs), OEM.TESSERACT_ONLY); + api.SetPageSegMode(PSM.OSD_ONLY); const params = { ...defaultParams, ...customParams, diff --git a/tests/recognize.test.js b/tests/recognize.test.js index bf2c513..48252b0 100644 --- a/tests/recognize.test.js +++ b/tests/recognize.test.js @@ -1,4 +1,4 @@ -const { TesseractWorker } = Tesseract; +const { TesseractWorker, PSM } = Tesseract; const isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined'; const SIMPLE_PNG = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAAC0CAIAAABqhmJGAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAASuSURBVHhe7dftVdswAIbRzsVAzMM0XabDUCOUxLYsWW4Jp+/pvf9w9GH76CHw4x2IJWAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAI9p8G/PbyY8rL2686g8t+vnqHTyfgIYfvz/26veTXn/UKX8+f0EU9bHrtu/6KfAN/AwEXAj7lFf2TBFw4nae8on+SgIvJ01n/KLzpDK+L3bT/Ap4O+HC+V12mTH+M3gzcLbIY/EO6HfxYp13k09nb6r3UqcdnjoCL3ll72J26h+35Oxy2XvZ0wOLaXq9v2+F1UC+7RZtMZ/DnfX1lwDOPzwUCLo7O2trtDK8H3M/iqoc6bj1subT68XTA/F7bGJooyzKbhTvLPHY8eJLHlbNX1DqYUVfdXbqwJjsCLsans37aNNJM6w68OR0wv9f9ymKw3k67yn2ZZpHlg3a3zis60s6oV+ZvlzMCLoanc3Dsdt9TdWT/lM8OmNjr5KY72jmzq1zfrbvXtVtmRMDF8HTWcgaaqIrD1U4G/MFewxrW262s5jS/Fzpmdts6mnHy+Fwl4GJ0OjsNrG1P/y7CNo3+gEt7jW56MVprNed7A/5w+n6YJ+BieDpnj/jO6pweTz0acGWvmZveL9XOmd3x6wKuTt8PEwRczLRw4eje1XX7c/cDruw1uuneOu2c4aOvzI57mJhRh1xZlQ0BF+Oz9vcF96fuB1zYa7R2b5mD6/XSwdfg8snj4q21+W/L02dfzIxhQMDFyTm6Hd7m+JYP7rPKT5sRuzhOBywm91rUkYc3fV9ltchtr8VmzuGOdfDB9N1tFYefNfdXLmyGjNZkhoCLUQufVqd/7z7rUcLW/XieDvg0s9difNOdRV5ePibt5vTuazusWbF9rs2E5v4mH58LBFyMW7g5OID7s9cMuTygmt9rcNPb5MrAz0lHc3Z9Ht7XZsxqxO36ZtLR/c0+PpMEzLOc/4LhrwmYZ6lfywJ+JgHzJPr9DgLmi23/zdXvcwmYL7YKWL1PJ2AIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmCI9f7+G6yFxVg/GyYwAAAAAElFTkSuQmCC'; @@ -145,6 +145,24 @@ describe('recognize()', () => { )); }); + describe('should support all page seg modes', () => { + Object + .keys(PSM) + .map(name => ({ name, mode: PSM[name] })) + .forEach(({ name, mode }) => ( + it(`support PSM.${name} mode`, (done) => { + const worker = getWorker(); + worker + .recognize(`${IMAGE_PATH}/testocr.png`, 'eng', { tessedit_pageseg_mode: mode }) + .then((ret) => { + expect(Object.keys(ret).length).not.to.be(0); + worker.terminate(); + done(); + }); + }).timeout(30000) + )); + }); + describe('should recognize base64 image', () => { [ { format: 'png', image: SIMPLE_PNG, ans: SIMPLE_TEXT },