README.md

📖 拍书取字 —— 手机拍照 / PC 传图 → 服务器提取文本(OCR)

手机连拍实体书页、或 PC 批量上传图片,本机服务器自动 OCR 提取文本,并可一次性合成整书完整文本。本地 RapidOCR 离线识别为主(免费、无次数限制),页面可选 DeepSeek VL 云端增强/修正(复杂版面、低质量照片效果更好,按 API 用量计费)。照片与原页文本自动按书名存档。

当前运行中(单一 HTTP 入口,无需证书):

  • 手机端:http://192.168.31.76:8901/(📷 拍照 / 📖 相册连拍)
  • PC 端:http://192.168.31.76:8901/pc(🗂 图片批量上传 / 拖拽 + ✨ VL 修正 + 手动编辑)
  • 本项目目录(下载中心可浏览/下载存档):http://192.168.31.76:8899/23-拍照OCR取字/

两页数据互通(同一存档目录):手机补拍的页,PC 端「含历史页」合成即可并入;PC 修正好文本,手机端重新合成同样生效。

一、PC 端怎么用(图片上传 + 项目管理 + VL 修正)

打开 http://192.168.31.76:8901/pc(无需摄像头,两个页签:🖥 上传识别 / 🗂 项目管理)。

页签一:上传识别

  1. 填「书名/标签」——与已有项目同名即追加到该项目;选默认引擎(本地 OCR 或 VL)
  2. 点上传框 🖼️ 选择图片(可多选),或把书页照片(手机/相机拍的)直接拖进窗口任意位置
  3. 逐张入队自动识别(或选「⏸ 先全传完再识别」后点 ▶ 统一开工)

页签二:项目管理(管理手机端产生的项目)

  1. 左侧列出服务器 data/books/ 下全部项目(含手机端拍摄产生):页数 / 字数 / 最近更新时间,点「打开」
  2. 打开后逐页查看(缩略图、原图、文本),每页可:
    • ✨ VL 修正 / 🔤 本地重跑:对该页存档照片重新识别,核对后「💾 保存修正」
    • 文本框直接编辑错字/段落后保存;🗑 删页清理重拍废页
  3. 当前项目卡片:📄 合成整书文本(含历史页、采用修正后文本,下载链接同时进下载中心)、📋 复制全部、 ✏️ 重命名、🗑 删除项目(整个项目连同照片文本一并删除,需确认)
  4. 手机补拍的页会出现在该项目列表(刷新即可见),点开即可在 PC 上修正

提示:手机页与 PC 页数据同目录互通;PC 上「含历史页/合成整书」都只读服务器存档,不依赖浏览器会话。

二、手机端怎么用(30 秒上手)

  1. 手机连上局域网(Wi-Fi),浏览器打开 http://192.168.31.76:8901/
  2. 顶部选引擎:本地 OCR(默认)或 ✨ DeepSeek VL 增强(识别节奏按整批统一生效)
  3. 填「书名/标签」——服务器按它分目录存档,整书文本也按它合成
  4. 拍照/选图即上传(不排队):
    • 📷 拍照上传 / 🖼️ 相册多选上传 —— 照片立刻传到服务器存档(状态"待识别")
    • 识别由服务器队列逐条处理:页面每 2 秒自动刷新,卡片显示 排队中 → 识别中 → 完成/失败
    • 手机刷新页面或换设备都不丢:自动恢复上次拍摄的书
  5. 失败的页可 ↻ 重试(重新排队);每页可 📋 复制 / 💾 下载 txt / 🖼️ 原图 / ✕ 删除(进回收站)
  6. 全部识别完点 📄 合成整书文本:服务器按页序合成该书全部已识别页(未识别/失败的页会提示不并入,处理完再合成一次即可),⬇️ 下载或到下载中心取回
  7. 每页操作:📋 复制 / 💾 下载本页 txt / 🖼️ 查看原图 / ✕ 删除(进回收站);底部可 📋 复制全部 / 🗑 删除本书(进回收站)
  8. 存档:每页照片与 .txt 落在服务器 data/books/<书名>/,也能在下载中心 http://192.168.31.76:8899/23-拍照OCR取字/data/books/ 直接浏览下载

拍摄技巧:书页放平、正对光源避免反光、别让手指/影子进画面、尽量拍全整页(竖拍优先)。

⚠️ 局域网是 HTTP(非 HTTPS),浏览器不允许网页直接调起"取景框预览", 所以手机「拍照识别」走系统相机(capture 属性),安卓/iOS 均可正常弹起相机。 若某浏览器没弹相机,用「相册选图」先拍好再选即可;PC 页本就是上传图片,不受影响。

三、部署与启停(本机 192.168.31.76)

cd /home/zyw/Downloads/dl-hub/23-拍照OCR取字
bash start.sh    # 启动(后台,日志 server.log,PID 存 server.pid)
bash stop.sh     # 停止

首次部署(重建环境,一般无需):

python3 -m venv .venv
.venv/bin/pip install -r requirements.txt   # flask / pillow / requests / rapidocr-onnxruntime

四、两个识别引擎

引擎速度/成本特点适用
🔤 本地 RapidOCR(默认)~3–8 秒/页,免费离线印刷体中英文识别准、无网络依赖、无次数限制绝大多数清晰的印刷书页
✨ DeepSeek VL 增强~10–20 秒/页,按 token 计费视觉大模型整页阅读,还原空格/标点/版面更好,抗模糊反光更强本地效果不满意、复杂版式、拍照质量差的页

五、目录结构

23-拍照OCR取字/
├── server.py            # 后端:Flask + RapidOCR + DeepSeek VL(单文件)
├── static/index.html    # 移动端页面(单文件,内联 CSS/JS)
├── static/index_pc.html # PC 端页面(图片上传 + VL 修正,单文件)
├── requirements.txt     # Python 依赖
├── start.sh / stop.sh   # 启停脚本
├── deepseek_key.txt     # DeepSeek API key(敏感,勿外传)
├── server.log           # 运行日志
├── data/books/<书名>/   # 每页存档:第xxx页_时间.jpg + 同名 .txt + 全书文本_*.txt
└── test/                # 自测脚本与样例图(gen_sample.py / sample_book_page.png)

六、HTTP 接口

接口说明
GET /移动端页面
GET /pcPC 端页面(上传 + 项目管理 + VL 修正)
GET /api/health服务状态:{ok, local_engine, vl_enabled, vl_model}
POST /api/ocr【旧流程,保留兼容】multipart:image、engine、book_name、seq → 上传+识别一次完成
POST /api/photo【推荐】multipart:files[](多张)+book_name+engine → 照片即时存档并自动入识别队列,返回 {book, items:[{seq,stem}], failed}
上传限制单次 ≤100 张、每张 ≤10MB(请求体上限 ≈1.02GB);超限返回 413 + JSON 错误说明。手机页会自动分批(每批 ≤100 张且 ≤900MB)依次上传,无需手动拆批
POST /api/batch/processJSON:{book_name?, retry_errors?} → 把待识别/失败页排入服务器识别队列(逐条处理)
POST /api/batch/vlallJSON:{book_name, scope:"all"|"todo", retry_errors?} → 整书 VL 批量:标记为结构化 VL 并排队(scope=all 重跑全部页 / todo 只补待识别失败页)
POST /api/page/reocrJSON:{book_name, stem, engine, save?} → 对已存档页用指定引擎重跑(VL 修正/本地重跑);save:true 时覆盖该页存档 txt
POST /api/page/textJSON:{book_name, stem, text} → 手动修正,覆盖存档 txt(合成即采用)
POST /api/page/deleteJSON:{book_name, stem} → 删除一页(jpg+txt,不可恢复)
POST /api/batch/exportJSON:{book_name, scope:"session"|"folder", stems?, include_side?:0|1} → 服务器按印刷页码自动排序合成整书文本(VL 页按页码、其余按拍摄顺序),可选含页眉页脚;返回 {ok, pages, chars, file, url, missing, skipped, ordered_by, vl_pages, preview}
POST /api/batch/exportallJSON:{book_name} → 一键生成全套成品 4 份(正文标注版/纯净全文/含页眉页脚 txt/含页眉页脚 md)到存档目录,返回 {files:[{tag,name,url,chars}], dropped, skipped, ordered_by}
GET /api/books项目管理:列出全部项目 {books:[{name, pages, chars, size, updated_at, first}]}(含手机端产生的)
GET /api/books/<书>/pages[?text=1]项目管理:某项目全部页(页码/时间/缩略图/txt 链接;text=1 附每页全文供修正)
POST /api/books/deleteJSON:{book_name} → 整个项目移入回收站(data/trash,可恢复),非永久删除
POST /api/books/renameJSON:{book_name, new_name} → 重命名项目目录
GET /api/trash回收站列表:{entries:[{entry, kind, book, stem, files, size, time}]}
POST /api/trash/restoreJSON:{entry} → 从回收站恢复整书或单页
POST /api/trash/purgeJSON:{entry} → 永久删除回收站条目(不可恢复)
GET /f/<书名>/<页>.jpg[?w=480]原图 / 实时缩略图
GET /txt/<书名>/<页或全书>.txt下载单页 / 整书文本

七、已知边界(v1 说明)

八、更新记录

v6(2026-09-09)VL 整书批量 + 页码/页眉/页脚 + 自动排序

v5(2026-09-09)上传不排队:先传服务器、后排队识别

v4.2(2026-09-09)删除安全:回收站

v4.1(2026-09-09)体验修正

v4(2026-09-09)PC 项目管理(管理手机端项目)

v3(2026-09-09)PC 端:图片上传 + VL 修正

v2(2026-09-09)批量连拍 + 整书文本

九、联调记录(2026-09-09)

v6.3(2026-09-23)上传上限调整:100 张 × 10MB

v6.4(2026-09-23)表格还原 + 空结果保护

下载此文件