ElectronOCR:基于Electron+React+Tesseract的MACOS下的OCR工具

前端之家收集整理的这篇文章主要介绍了ElectronOCR:基于Electron+React+Tesseract的MACOS下的OCR工具前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Github Repo 地址
文章地址
MAXOS Darwin x64下载

笔者一直在MacOS上没找到太顺心的OCR工具,导致看书的时候很多东西只能手打,略烦。正好前段时间用了Tesseract,就用Electron封装了一个,这里简要记述下开发当中的一些坑和要点,日后有空把Electron整理好也出个系列

Introduction

这东西,大概是这个样子:

现在本机上安装个Tesseract:

  1. brew install imagemagick
  2. brew install tesseract --all-languages

然后直接下载打开即可。

Development

Setup

  • use npm install or npm link to install dependences

  • use npm install -g electron-prebuilt to enable the global electron

Develop & Hot-Reloading

  • use npm start to start webpak hot-middle server

  • use npm run electron-test to use electron and set env to development

Package

  • use npm run buildto generate list file for web modules

  • usenpm run package-osx to build and package into dmg

Web部分

笔者Web部分还是采用Webpack+React+Redux(待加入),关于这部分的单独代码可以借鉴我的Webpack套装以及Webpack-React-Redux-Boilerplate这个示范Boilerplate。需要注意的是,在Electron 1.x之后API和0.x系列有了较大的变化,很多Github上的项目在升级到1.2.0之后不可用。

支持Hot Reload的环境搭建

Electron实际上是一个封装好的近似浏览器,因此Hot Reload与纯粹的Web开发区别不大,都是先起一个Hot Load Server,监听3000端口。不过需要做修改的是,在Electron中所有的脚本都要从localhost:3000加载,主要修改有:

  1. var devEntry = [
  2. 'eventsource-polyfill',//修改WHM的默认加载地址
  3. `webpack-hot-middleware/client?path=http://localhost:${port}/__webpack_hmr`,];
  4. //修改默认的公共路径前缀
  5. config.output.publicPath = `http://localhost:${port}/dist/`//公共目录名

在dev.html中也需要修改下加载的脚本的地址:

  1. <html>
  2. <head>
  3. <title>Index For Debug</title>
  4. <Meta http-equiv="content-type" content="text/html; charset=UTF-8" />
  5. </head>
  6. <body>
  7. <div id="root"></div>
  8. </body>
  9. </html>
  10. <script src="http://localhost:3000/dist/vendors.bundle.js"></script>
  11. <script src="http://localhost:3000/dist/main.bundle.js"></script>

在渲染进程中引入本地模块

  1. const {dialog} = window.require('electron').remote;
  2. const fs = window.require("fs");

首先为了避免Webpack在打包时报错electron不存在,建议是将所有Node或者Electron提供的模块用window.require方式,这样Webpack会忽略引入。

Native部分

创建本地窗口

  1. /**
  2. * Created by apple on 16/6/3.
  3. */
  4. const electron = require('electron');
  5. // 用于控制应用生命周期
  6. const {app} = electron;
  7. // 用于创建本地窗口
  8. const {BrowserWindow} = electron;
  9.  
  10. //为Window对象创建一个全局的引用,否则可能被JavaScript的垃圾回收机制自动回收
  11. let win;
  12.  
  13. /**
  14. * @function 创建窗口
  15. */
  16. function createWindow() {
  17. // 创建类似于浏览器的窗口
  18. win = new BrowserWindow({width: 800,height: 600});
  19.  
  20. // 加载应用入口文件,本文件为测试文件,因此加载的是测试
  21. win.loadURL(`file://${__dirname}/dist/app.html`);
  22.  
  23. // 启动调试工具,如果是开发环境下则不需要开启
  24. // win.webContents.openDevTools();
  25.  
  26. // 设置窗口关闭事件
  27. win.on('closed',() => {
  28. //因为上面是设置了一个全局引用,因此这里需要对该对象解除引用
  29. //如果你的应用支持打开多窗口,可以把所有的引用存入一个数组中,然后在这里动态删除
  30. win = null;
  31. });
  32. }
  33.  
  34. // 在基本环境准备好之后的回调
  35. app.on('ready',createWindow);
  36.  
  37. // 所有窗口都关闭之后的回调
  38. app.on('window-all-closed',() => {
  39. //在OSX中经常是用户虽然关闭了主窗口,但是仍然希望使用Menu Bar,因此这里不进行强行关闭
  40. // On OS X it is common for applications and their menu bar
  41. // to stay active until the user quits explicitly with Cmd + Q
  42. if (process.platform !== 'darwin') {
  43. app.quit();
  44. }
  45. });
  46.  
  47. // 应用被重新激活之后的回调
  48. app.on('activate',() => {
  49. // 在Dock中的Menu Bar被点击之后重新激活应用
  50. if (win === null) {
  51. createWindow();
  52. }
  53. });

打包

一般来说,Electron推荐的打包方式有三种,这里笔者使用的是electron-packager这个便捷工具,不过碰到一个蛋疼的问题是Electron一直下载不下来,挂了SS加上proxychains4都不行。因此最终还是用编程方式进行打包:

  1. require('babel-polyfill');
  2. const exec = require('child_process').exec;
  3.  
  4. const argv = require('minimist')(process.argv.slice(2));
  5.  
  6. const platform = argv._[0];//编译的目标平台
  7.  
  8. const packager = require('electron-packager');
  9.  
  10. console.log("Current NODE_ENV = " + process.env.NODE_ENV);//判断编译时环境
  11.  
  12. const arch = "x64";
  13.  
  14. packager({
  15. dir: "./",platform,arch,out: `release/`,override: true,prune: true,download: {
  16. mirror: "https://npm.taobao.org/mirrors/electron/" //设定Electron的下载地址
  17. }
  18. },function done_callback(err,appPaths) { /* … */
  19. });

然后将脚本封装到package.json中:

  1. "package-osx": "npm run clean-electron && NODE_ENV=production node -r babel-register package.js darwin",

避免打包node_modules

在Web开发中我们会将譬如React、Redux等等依赖项加入到package.json的dependencies中,不过Electron Packager会将node_modules也打包到应用中。然后代码都已经通过Webpack打包编译到统一的js脚本中,因此首先可以设置prune为true,这样可以避免打包所有的dev-dependencies。同样,我们也需要将非本地模块全部放到dev-dependencies中。

猜你在找的React相关文章