veil是一个开源 PDF 阅读器,提供智能暗色模式,在反转文字颜色的同时保留图片、图表与示意图的原始色彩。它面向需要在暗光环境下阅读 PDF 的用户,尤其适合包含大量图片与扫描件的研究文档。本项目基于 PDF.js 逐页渲染,再通过 CSS 反色生成暗色背景,并用第二个 canvas 在反色区域还原原始图片像素。OCR 能力由 Tesseract.js 在后台完成,识别文本会成为可选中的图层;所有运行时库、字体与 OCR 模型均随仓库版本化并从本项目自身域名提供,浏览器不产生任何第三方运行时请求。项目以可安装的 PWA 形式交付,支持离线运行,全部逻辑在客户端完成,无需服务器。

核心功能
- 智能暗色模式:文字反色,图片与图表保留原色。
- 逐页覆盖:可对任意页面强制暗色或亮色,导出时同样生效。
- 可选文本层:跨字体与字重提供干净的复制粘贴。
- 图片内 OCR:对原生 PDF 中的图片做 OCR,图表标签、坐标轴文字与图注变为可选中;按住 Option/Alt 拖动可选取纵向文字。
- 扫描件识别:自动检测扫描文档并在后台执行整页 OCR。
- 已有暗色页识别:自动跳过本身为暗色的页面(如幻灯片、暗色主题)。
- 导出 PDF:导出时烘焙暗色模式,保留可选文本、可用链接与文档书签;文本导出支持 22 种书写系统。
- 链接与大纲保留:外部链接与内部导航均可用,嵌套书签层级、展开/收起状态与内部目标均被保留。
- 原生缩放:借助 PDF.js 原生重渲染,任意缩放级别下文字清晰。
- 离线 PWA:可安装、支持离线、纯客户端运行。
运行效果与使用示例
在线体验地址为 https://veil.simoneamico.com。本地开发可执行 npm install 后运行 npm test(完整性检查 + 412 个单元测试)、npm run test:e2e(86 个浏览器端测试,基于 Playwright)与 npm run serve(http://localhost:8000)。项目共 498 项测试,涵盖视觉回归截图、导出往返校验、离线运行时校验与性能基准。