Appearance
识文 DocuLens 深度架构与技术实现
本文系统性拆解 识文 DocuLens 桌面端的核心软件架构、进程间通信(IPC)机制、状态模型与特色交互设计方案。
系统架构分层全景
DocuLens 严格遵循 Electron 安全沙箱规范,划分为 前端渲染层 (Renderer Process)、预加载安全桥 (Preload Bridge) 与 桌面主进程 (Main Process) 三层:
正在加载图表...
关键业务时序解析
原生全屏框选截图与文档置入时序
DocuLens 舍弃了传统的外部第三方截图黑盒,采用 原生 desktopCapturer + 内部 Vue 单页路由 (#/capture) 架构,彻底解决了 Windows 下窗口失焦闪退和点击穿透的顽疾:
正在加载图表...
底图局部框选真实即时识别时序
用户在工作台画布上对导入的文档进行局部快速取词、公式或段落提取时,系统提供毫秒级就地框选识别能力:
正在加载图表...
OCR 全文流式识别与版面块分发时序
针对多页长文档或整张复杂图片,系统采用逐行流式推送架构:
正在加载图表...
本地 SQLite 数据模型设计
本地数据库采用 better-sqlite3 管理,表结构设计如下:
正在加载图表...
核心技术难点与工程解决方案
| 技术难点 | 现实痛点表现 | DocuLens 解决方案 |
|---|---|---|
| 截图悬浮工具栏点击消失 | 第三方截图库在 Windows 下创建 type: 'toolbar' 窗口,点击操作栏导致窗口失去焦点(blur)被系统强制关闭,且鼠标事件穿透触发了取消 | 彻底移除第三方截图窗口,改为原生 desktopCapturer + Vue 内部路由 #/capture 全屏独立窗口,悬浮工具栏使用 Vue 原生事件隔离,从根源消除焦点闪退与穿透。 |
| 画布框选悬浮卡片点击闪退 | 用户在底图框选后点击弹出卡片,卡片瞬间消失,且右侧面板无识别内容 | ① 悬浮卡片增加 @mousedown.stop、@mouseup.stop 阻断事件冒泡到画布容器;② 接入真实离线裁剪推理通道 recognizeSnippet;③ 提供【插入结果】与【替换全文】动作,实时刷新右侧统计与文本列表。 |
| Windows 终端 GBK 导致 Python 崩溃 | 识别中文时出现 识别未完成: Process terminated 报错 | ① Python 侧 json.dumps 强制指定 ensure_ascii=True 输出纯 ASCII 转义,杜绝跨代码页乱码;② 注入 PYTHONUTF8: '1' 与 PYTHONIOENCODING: 'utf-8';③ Node.js 在创建 readline 之前显式调用 process.stdout.setEncoding('utf-8')。 |
| Electron 主窗口最小化失联 | 截图前执行 win.hide(),截图结束若未正确捕获实例导致主窗口永久隐藏 | 在 main-window.ts 导出全局 getMainWindow() 句柄,并在确认、取消及异常全分支统一调用 restoreMainWindow()(执行 show() / restore() / focus())。 |
| 大文件 PDF 离线解析卡顿 | 传统 PDF.js 在 Node 端渲染高清大文件卡顿且依赖复杂的系统 Canvas 原生编译 | 离线搭载轻量 Python pypdfium2(基于 Google PDFium 原生引擎),以毫秒级速度将多页 PDF 无损渲染为高清图像切片。 |
| 高分屏与 DPI 缩放坐标漂移 | 2K/4K 屏幕(125%、150% 缩放)下截图与框选坐标位置发生偏移 | 截图裁剪与识别画布均基于屏幕物理像素比例(scaleFactor 与 naturalWidth / clientWidth)进行动态归一化换算,确保框选与 OCR 结果 100% 像素级贴合。 |