4人团队8周交付的桌面敏感词检测工具:PyMuPDF分块渲染撑住100GB PDF,PaddleOCR攻克竖排中文识别,云端授权四层管控。三个踩坑记录:渲染策略选型、OCR竖排召回、加壳打包膨胀。
面向出版与法务行业的桌面端敏感词检测工具,支持 PDF / Word / Excel / 图像多格式扫描,配套云端授权管理后台与许可证签发服务。4 人核心团队 8 周交付首版,已在政企内容审核场景中投入使用。
为什么选 PyQt6 桌面端而非 Web 方案。客户的核心诉求是"文件不出本地"——出版行业待审文档涉及未公开发行内容,法务场景涉及合同与证据材料,任何上传到服务器的方案都会被一票否决。PyQt6 桌面客户端保证所有扫描在本地完成,云端仅做许可证激活和词库远程更新。
为什么要自建云端授权。市面上成熟的授权方案(如 FlexNet)按席位收费,客户需要的是按设备并发授权的灵活模式。我们选择 FastAPI + PostgreSQL 自建授权后端,实现设备绑定、激活码签发、到期提醒、远程吊销四层管控。结合 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 独立下载。
桌面端:Python 3 · PyQt6 · PyMuPDF · PaddleOCR · qfluentwidgets · qpageview · VMProtect
授权后端:FastAPI · SQLAlchemy · asyncpg · PostgreSQL · Alembic
管理后台:Next.js · Tailwind CSS · Radix UI · TanStack Table · react-hook-form