跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
JavaScriptNode.js大前端算法

使用 Electron 和 JavaScript 构建桌面条形码、MRZ 和文档扫描仪

综述由AI生成基于 Electron 和 JavaScript 开发桌面条形码、MRZ 及文档扫描仪的完整流程。内容包括 Electron 进程模型配置、摄像头权限设置、CSP 策略调整、预加载脚本安全实践以及使用 electron-builder 进行多平台打包。通过集成 Dynamsoft Capture Vision SDK,实现了跨平台(Windows、macOS、Linux)的扫码功能,并提供了关键代码示例和安全建议。

鲜活发布于 2026/3/22更新于 2026/4/2614 浏览
使用 Electron 和 JavaScript 构建桌面条形码、MRZ 和文档扫描仪

如何使用 Electron 和 JavaScript 构建桌面条形码、MRZ 和文档扫描仪

基于 Web 的视觉 SDK 与 Electron 非常契合:它们完全在 Chromium 渲染器进程中运行,无需任何原生插件,并且可以作为独立的桌面应用程序分发到 Windows、macOS 和 Linux 平台。Dynamsoft Capture Vision (DCV) SDK 底层使用 WebAssembly,这使其成为 Electron 沙盒渲染器的理想之选。

本教程将引导您完成将 Dynamsoft 条形码、MRZ 和文档扫描功能封装到可用于生产环境的 Electron 外壳中的步骤。您将学习 Electron 进程模型的工作原理、如何授予摄像头访问权限、如何放宽 CDN 资源的 Content-Security-Policy 标头,以及如何使用 electron-builder。

先决条件

  • Node.js 18+ 和 npm 9+
  • Dynamsoft 试用许可证密钥

理解电子过程模型

Electron 将你的应用程序拆分成两种类型的进程:

过程角色使用权
主要流程Node.js;管理窗口、操作系统 API 和权限完整的 Node.js + Electron API
渲染进程Chromium;每个 BrowserWindow;渲染 HTML/JS仅限 Web API(除非显式桥接)

Dynamsoft SDK 完全在渲染器内部运行。主进程负责:

  1. 创建具有正确窗口 webPreferences
  2. 授予 getUserMedia(相机)权限
  3. 修改响应头以放宽默认内容安全策略 (CSP)。

项目结构

electron/
├── main.js # Electron main process
├── preload.js # Context bridge – runs before renderer
├── package.json
└── src/
    ├── index.html # Renderer HTML
    ├── renderer.js # All scanning / SDK logic
    ├── utils.js # MRZ helper
    ├── styles.css
    └── full.json # DCV MRZ capture template

主要进程:浏览器窗口和权限

main.js 是 Electron 应用程序的入口点(由 "main" 引用 package.json)。创建一个 BrowserWindow contextIsolation: true 并 nodeIntegration: false 保持渲染器沙箱化:

// main.js
const { app, BrowserWindow, session } = require('electron');
const path = require('path');
function createWindow() {
   win =  ({
    : ,
    : ,
    : {
      : path.(__dirname, ),
      : ,
      
      : ,
      
      : ,
    },
  });
  
  session..(
     {
      ([, , ].(permission));
    }
  );
  win.(path.(__dirname, , ));
}
app.().(createWindow);
app.(,  {
   (process. !== ) app.();
});
app.(,  {
   (.(). === ) ();
});
const
new
BrowserWindow
width
1280
height
900
webPreferences
preload
join
'preload.js'
nodeIntegration
false
// best-practice: never expose Node in renderer
contextIsolation
true
// required for contextBridge
webSecurity
true
// Grant camera and microphone for Dynamsoft Camera Enhancer
defaultSession
setPermissionRequestHandler
(webContents, permission, callback) =>
callback
'media'
'camera'
'microphone'
includes
loadFile
join
'src'
'index.html'
whenReady
then
on
'window-all-closed'
() =>
if
platform
'darwin'
quit
on
'activate'
() =>
if
BrowserWindow
getAllWindows
length
0
createWindow

安全提示: nodeIntegration: false 对于任何加载远程内容的 Electron 应用,建议至少启用 + contextIsolation: true 选项。除非您了解 XSS 的潜在风险,否则请勿禁用这些选项。

上下文隔离和预加载脚本

预加载脚本在特权上下文中执行(在渲染页面之前且 Node.js API 可用之后)。contextBridge.exposeInMainWorld 它创建一个安全的、冻结的对象,该对象可 window.electronAPI 在渲染器中访问,而不会泄露完整的 Node.js API:

// preload.js
const { contextBridge } = require('electron');
contextBridge.exposeInMainWorld('electronAPI', {
  platform: process.platform,
  versions: {
    electron: process.versions.electron,
    node: process.versions.node,
    chrome: process.versions.chrome,
  },
});

渲染器现在可以读取 window.electronAPI.versions.electron 并在用户界面中显示运行时版本——这对于支持和调试非常有用:

<!-- src/index.html – display Electron version in the header -->
<p class="electron-badge">🖥️ Desktop App – Electron v<span id="electron-version"></span></p>
<script>
if (window.electronAPI) {
  document.getElementById('electron-version').textContent = window.electronAPI.versions.electron;
}
</script>

渲染器:正在加载 Dynamsoft SDK

DCV 包通过 jsDelivr CDN 加载,并使用

<!-- src/index.html -->
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/dcv.bundle.min.js"></script>
<script src="utils.js"></script>
...
<script src="renderer.js"></script>

renderer.js 它与浏览器版本的原生 JavaScript 应用程序逻辑完全一致。唯一的代码路径差异在于:

  1. 文件路径(./full.json)解析为相对于 src/index.html--correct 符合 Electron file:// 协议。
  2. 该 save() 函数使用了 DOM 技巧;它在 Electron 的 Chromium 中也能正常工作。
  3. showMessage() 使用来自 utils.js.

在 Electron 中处理摄像头访问

默认情况下,Electron 会 session.defaultSession 拒绝所有 getUserMedia 阻止后台静默录制的请求。您的主进程必须显式授予该 media 权限类型。

setPermissionRequestHandler 每当渲染器调用时,都会触发回调函数。Dynamsoft navigator.mediaDevices.getUserMedia() Camera Enhancer 会在内部触发此回调,因此不需要渲染器端的权限代码:

// main.js – already shown above
session.defaultSession.setPermissionRequestHandler(
  (webContents, permission, callback) => {
    callback(['media', 'camera', 'microphone'].includes(permission));
  }
);

生产提示: webContents.getURL() 在调用之前,通过检查是否与预期来源匹配来缩小权限授予范围 callback(true)。

跨平台相机行为
平台行为
macOS首次启动时系统会提示是否授予相机权限(macOS 隐私权政策要求)
视窗权限由 Electron 处理;默认情况下,桌面应用程序不会出现系统提示。
LinuxV4L2;通常无需提示即可授予访问权限。

在 macOS 上,将 NSCameraUsageDescription 密钥添加到您的 Info.plist(当您在构建选项中设置它时,electron-builder mac.extendInfo 会自动处理)。

CDN 资产的内容安全策略

Electron 添加了一个默认的 CSP,会阻止外部脚本、工作进程和 WASM 线程。由于 Dynamsoft SDK 会在运行时加载工作进程脚本和 WASM 代码块,因此必须放宽此默认策略。

Content-Security-Policy 使用以下方式覆盖响应头 session.webRequest.onHeadersReceived:

// main.js
session.defaultSession.webRequest.onHeadersReceived((details, callback) => {
  callback({
    responseHeaders: {
      ...details.responseHeaders,
      'Content-Security-Policy': [
        "default-src 'self' 'unsafe-inline' 'unsafe-eval' blob: data: " +
        "https://cdn.jsdelivr.net https://*.dynamsoft.com; " +
        "script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: " +
        "https://cdn.jsdelivr.net https://*.dynamsoft.com; " +
        "worker-src 'self' blob:;",
      ],
    },
  });
});

指令解释:

指示目的
'unsafe-inline'内联
'unsafe-eval'instantiate 某些 Chromium 配置中的 WASM 路径
blob:blob: WASM 工作线程以 URL 的形式生成。
https://cdn.jsdelivr.netDCV 捆绑包的 CDN 源
https://*.dynamsoft.comDynamsoft 许可证服务器和模型下载来源

**生产环境加固:**如果您自行托管 DCV 软件包和模型文件,则可以移除 CDN 源 'unsafe-eval'。您还可以添加一个 nonce 或 hash 来替换 'unsafe-inline' 内联脚本。

通过 DOM 锚点保存文档

保存修正后的文档图像与浏览器版本的操作完全相同。Electron 的 Chromium 内核会识别该 属性并触发原生保存对话框:

// src/renderer.js – identical to browser version
async function save() {
  const a = document.createElement('a');
  a.href = rectifiedImage.src;
  a.download = `document_${Date.now()}.png`;
  document.body.appendChild(a);
  a.click();
  document.body.removeChild(a);
}

在 Electron 中,默认情况下,此操作会打开操作系统文件保存对话框,并指向用户的'下载'文件夹。如果您需要自定义路径(例如,始终保存到特定目录),请使用主进程 dialog.showSaveDialog API 并通过进程间通信 (IPC) 将路径发送回进程。

使用 electron-builder 进行构建和封装

package.json 已预先配置 electron-builder。目标:

平台格式命令
视窗NSIS 安装程序npm run dist -- --win
macOSdmgnpm run dist -- --mac
LinuxAppImagenpm run dist -- --linux
// package.json (excerpt)
{
  "build": {
    "appId": "com.dynamsoft.visionscanner",
    "productName": "Vision Scanner",
    "win": {
      "target": "nsis"
    },
    "mac": {
      "target": "dmg"
    },
    "linux": {
      "target": "AppImage"
    }
  }
}

针对当前平台构建:

npm run dist

构建完成后的工件会出现在 dist/ 目录中。Dynamsoft SDK 包会在运行时从 CDN 加载,从而保持分发包体积较小。如需完全离线分发,请将包复制到指定位置 src/ 并

源代码

https://github.com/yushulx/javascript-barcode-qr-code-scanner/tree/main/examples/electron

目录

  1. 如何使用 Electron 和 JavaScript 构建桌面条形码、MRZ 和文档扫描仪
  2. 先决条件
  3. 理解电子过程模型
  4. 项目结构
  5. 主要进程:浏览器窗口和权限
  6. 上下文隔离和预加载脚本
  7. 渲染器:正在加载 Dynamsoft SDK
  8. 在 Electron 中处理摄像头访问
  9. 跨平台相机行为
  10. CDN 资产的内容安全策略
  11. 通过 DOM 锚点保存文档
  12. 使用 electron-builder 进行构建和封装
  13. 源代码
  • 💰 8折买阿里云服务器限时8折了解详情
  • 💰 8折买阿里云服务器限时8折购买
  • 🦞 5分钟部署阿里云小龙虾了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • OpenClaw、EasyClaw 与 WorkBuddy 三款 AI 智能体工具安装与对比指南
  • Z-Image-Turbo 对比 Stable Diffusion 核心优势分析
  • 42 个 Python 实用小例子
  • PRIDE-PPPAR 安装与配置完整指南
  • 华为 ICT 大赛 2024-2025 网络赛道考试分析
  • 【踩坑记录】使用 Layui 框架时解决 Unity WebGL 渲染在 Tab 切换时黑屏问题
  • Python 零基础转行学习路线与核心技能详解
  • 企业微信群机器人添加可点击链接:图文与 Markdown 实现方式
  • 在Windows11利用llama.cpp调用Qwen3.5量化模型测试
  • Spring Cloud Sentinel 熔断降级核心原理与实战指南
  • 轻小说机翻机器人:日语小说自动翻译工具搭建
  • Python 个性化音乐推荐系统:Django+MySQL 结合双协同过滤算法
  • OpenClaw 飞书机器人配置指南:聊天窗口下达 AI 指令
  • Go 语言快速学习总结
  • AI 辅助开发 SpringBoot 在线图书借阅平台实践
  • KWDB 运维实战:用 SQL 打通 Metrics 与 CMDB
  • Spring Boot 集成数据仓库与 ETL 工具实战
  • STC 单片机摄像头图像处理优化与搜线算法实战
  • 医疗自然语言处理(NLP)应用场景与实战开发
  • Vue 3 前端开发实战与成长经验总结

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online