如何打包具有 OCR 功能的电子应用程序?

How can I package an electron app with OCR features?

我构建了一个 electron 应用程序,运行 遇到需要添加一些 OCR 功能的情况。 我发现人们大多使用 tesseract.js 但它比原生 tesseract-ocr(因子或 10-20)慢得多。 这就是为什么 tesseract.js 不是我的选择。或者我可以只使用众多 tesseract 节点之一 modules which are out there。理论上。

问题:这些节点模块需要编译的 tesseract-ocr 二进制文件(通常使用 apt 或 brew 安装)。 我不希望我的用户必须经历额外的设置麻烦,我希望我可以将所有内容都放入电子安装程序中。

有什么办法可以完成这项工作吗? 我正在使用 electron-builder 来打包我的应用程序。

您正在寻求使用用于生产的电子应用程序打包的本机模块打包。总体思路是使用 electron-rebuild 为 electron 编译本机库。您可以参考 electron docs or in electron-builder 文档中的原生模块构建。您可以设置 buildDependenciesFromSource: true 以在使用 electron-builder.

时编译特定平台构建的本机依赖项

基本配置你可以看看,

"build": {
    "appId": "com.trinityinfosystem.electron.exchange.stream",
    "productName": "Accurate",
    "copyright": "Copyright © 2018 Trinity InfoSystem",
    "buildDependenciesFromSource": true,
    "mac": {
      "category": "public.app-category.utilities",
      "icon": "assets/icon.icns",
      "target": [
        "dmg"
      ]
    },
    "win": {
      "publisherName": "Trinity InfoSystem"
      "target": [
        "nsis"
      ]
    },
    "linux": {
      "target": [
        "AppImage",
        "tar.gz"
      ]
    },
    "dmg": {
      "background": "assets/background.png",
      "icon": "assets/icon.icns",
      "title": "Accurate Installer"
    },
    "nsis": {
      "oneClick": false,
      "perMachine": false,
      "allowToChangeInstallationDirectory": true
    }
  }

您链接的节点模块不是本机节点模块(一个除外),而只是生成进程的 CLI 包装器,这就是为什么它们需要用户安装工具。

要解决此问题,您需要一个本机节点模块,例如,node-tesseract 将是您应该使用的模块。您可以使用 electron-builder 或此命令(用您的目标设置替换标记的部分)通过 node-gyp 为电子重建它:

node-gyp rebuild --target=YOUR_ELECTRON_VERION --arch=YOUR_ARCH -RELEASE_OR_DEBUG --dist url=https://electronjs.org/headers --directory=./node_modules/node-tesseract`

由于我没有进一步测试 node-tesseract 较新节点版本的功能,因此有些功能可能无法立即运行。如果它不起作用,您可能需要花一些时间通过 NAPI 为节点包装 c++ 库 libtesseract。你只需要包装你需要的功能而不是一切。

完成后,您可以按照@Kiran Maniya 描述的步骤进行操作

你最后是怎么实现这个功能的?我们最近遇到了类似的问题(我们必须在小区域做 10 ocr/seconde)所以我们选择了“capture2text”cli(不需要最终用户安装任何东西。)但是我们的应用程序的重量从 40 Mo 到 120 Mo,很多。所以我很想知道你最后是怎么解决的。

最后,在一位出色的开发伙伴的帮助下,我设法让事情正常进行。 这是 node-native-ocr,它可以完美地与电子一起工作: https://www.npmjs.com/package/node-native-ocr