项目简介
面向出版与法务行业的桌面端敏感词检测工具,支持 PDF / Word / Excel / 图像多格式扫描,配套云端授权管理后台与许可证签发服务。4 人核心团队 8 周交付首版,已在政企内容审核场景中投入使用。
架构决策
为什么选 PyQt6 桌面端而非 Web 方案。客户的核心诉求是"文件不出本地"——出版行业待审文档涉及未公开发行内容,法务场景涉及合同与证据材料,任何上传到服务器的方案都会被一票否决。PyQt6 桌面客户端保证所有扫描在本地完成,云端仅做许可证激活和词库远程更新。
为什么要自建云端授权。市面上成熟的授权方案(如 FlexNet)按席位收费,客户需要的是按设备并发授权的灵活模式。我们选择 FastAPI + PostgreSQL 自建授权后端,实现设备绑定、激活码签发、到期提醒、远程吊销四层管控。结合 VMProtect 加壳防逆向,把客户端与授权服务器的通信加密到"即使抓包也读不出设备指纹"的程度。
核心能力
- PDF / Word / Excel / 图像多格式扫描
- PyMuPDF tile-based 分块渲染,100GB 超大文件优化
- PaddleOCR 图像内文字识别,支持中英文混排
- qfluentwidgets Microsoft Fluent Design 风格 UI
- 云端许可证签发 + 设备授权管理后台
- VMProtect 加壳防破解
工程挑战与踩坑
坑一:100GB PDF 的渲染策略选了半年。最初用 PyMuPDF 的 page-based 渲染,一个 80GB 的参考文献扫描件首次打开耗时超过 3 分钟。切到 tile-based 分块渲染后,首屏加载降到 8 秒——代价是每页需要维护一个 tile 索引表,内存占用增加了约 40%。经过 3 轮压测,最终锁定 tile size 为 1024×1024,内存峰值控制在 1.2GB 以内。
坑二:PaddleOCR 在竖排中文上的识别率只有横排的 60%。古籍出版物的竖排排版让初始版本的敏感词召回率从 94% 跌到 71%。解决方式是预处理层加入文字方向检测,竖排区域先转横排再入 OCR。这个"小"优化花了整整 5 天。
坑三:VMProtect 加壳后 PyInstaller 打包体积膨胀 3 倍。不加壳时安装包约 180MB,加壳后飙到 520MB。客户 IT 环境带宽有限,最终选择了两阶段部署:基础包 180MB + 加壳后的核心检测引擎 120MB 独立下载。
交付指标
- 4 人核心团队,8 周完成首版从需求到交付
- 常规 PDF(≤50MB)扫描完成时间 < 5 秒
- 100GB 超大文件首屏渲染 < 8 秒
- 横排中文敏感词召回率 94%,竖排经方向检测后恢复至 91%
- 云端授权服务并发支持 5000+ 设备同时激活
技术选型
桌面端:Python 3 · PyQt6 · PyMuPDF · PaddleOCR · qfluentwidgets · qpageview · VMProtect
授权后端:FastAPI · SQLAlchemy · asyncpg · PostgreSQL · Alembic
管理后台:Next.js · Tailwind CSS · Radix UI · TanStack Table · react-hook-form
