# pdf_read_web **Repository Path**: coder_jk/pdf_read_web ## Basic Information - **Project Name**: pdf_read_web - **Description**: 纯本地PDF阅读web,实时展示预测进度,提高阅读爽感 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-21 - **Last Updated**: 2026-09-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: pdf ## README # PDF 阅读 · 旅程 本地 PDF 阅读网站:**进度永不丢 + 激励型旅程进度条 + 动态剩余时间预测**。纯 TypeScript + Node,无数据库,所有数据文件化存储。 ## 快速开始 ```bash npm install # 开发模式(前后端热更,Vite 在 15203 代理到 15207) npm run dev # 生产模式(构建 + 启动 + 自动打开浏览器) npm start ``` 启动后访问 `http://localhost:15207`(生产)或 `http://localhost:15203`(开发)。设置 `NO_OPEN=1` 可禁止自动开浏览器。 ## 功能 - **拖拽入库**:PDF 拖到任意位置即入库;按内容 SHA-256 去重,同一本书重复拖入进度自动归并 - **进度记忆**:重开浏览器自动恢复到上次停留位置(精确到页内滚动百分比);进度条显示"最远到达位置",只增不减 - **左侧垂直进度条**:20px 贴边,随进度渐变换景(黎明→旭日→长路→星夜),白点标记当前停留位,里程碑刻度,悬停看详情,点击/拖动跳转;25/50/75% 里程碑庆祝动画,100% 撒花 - **工具抽屉**:左侧覆盖式浮层(默认收起,把手 `›` 或快捷键唤出),含控制项与目录/缩略图/搜索;跳转后自动收起 - **悬浮胶囊**:右下角显示剩余时间与今日目标,低透明度不扰读,点击可隐藏 - **动态 ETA**:三层速度融合(近 1~3 分钟短窗 / 30~60 分钟长窗 / 全书平均),有效阅读时间判定(页面可见 + 90 秒内有交互),EMA 平滑防数字抖动 - **导航**:目录大纲、页面缩略图、页码跳转、书内全文搜索 - **主题**:亮色 / 深色 / 护眼黄;专注模式(`s` 键) - **统计**:每日阅读热力图、连续天数 streak、每书累计、每日目标(默认 30 分钟) ## 快捷键 | 键 | 作用 | |---|---| | `←/→` `PgUp/PgDn` | 翻页 | | `j / k` | 平滑滚动 | | `g` | 打开抽屉并跳转页码 | | `o` / `f` | 抽屉:目录 / 缩略图 | | `Ctrl+F` | 抽屉:书内搜索 | | `s` | 专注模式(只留变淡的进度条,`Esc` 退出) | | `Esc` | 退出专注 / 关闭抽屉 | ## 数据存储 ``` data/ index.json # 书架索引 stats.json # 每日阅读统计 prefs.json # 界面偏好 books/{sha256}/ # 每本书:file.pdf + meta.json + text.json + cover.png + progress.json ``` 整个 `data/` 目录拷走即完整备份;删除项目不影响原 PDF 文件。 ## 技术 - **前端**:Vite + React 18 + pdfjs-dist(连续滚动虚拟化渲染,canvas 位图) - **后端**:Fastify + @fastify/static,PDF 支持 HTTP Range 分段加载 - **测试**:`npm test`(ETA 算法 vitest 单测),`npm run typecheck`(双端类型检查) 详细设计见 [DESIGN.md](DESIGN.md)。