)
我用Flutter手写了一款商业级文档扫描App全程本地处理、数据不出设备附完整源码写在前面本文分享一款全本地文档扫描App的完整技术方案与源码。从边缘检测、曲面展平到离线OCR、PDF加密全部用纯Dart算法实现不调用任何云端API。文章末尾附完整工程源码下载分三部分。一、为什么你需要一款不联网的扫描App先问三个直击灵魂的问题你手机里装的扫描App拍照后图片到底去了哪里身份证、银行卡、合同……这些最敏感的资料有没有上传到某台云服务器免费版的水印、付费版的订阅、会员才能用的高清导出你受够了没有市面上99%的文档扫描App走的都是同一条路线拍照 → 上传云端 → 服务器做边缘检测/透视矫正/OCR → 结果回传手机 ↑ 你的敏感数据在这里裸奔这条路开发简单、算力充足但代价是用户隐私。而我开发的这款安心扫描走的是一条截然相反的路拍照 → 全部本地处理 → 结果直接存手机 ↑ 零隐私风险零联网依赖核心承诺正式安装包不申请 INTERNET 权限。从系统层面杜绝数据外泄。无账号、无云同步、无统计埋点。二、六大功能覆盖日常所有扫描场景功能一句话说明核心算法文档扫描拍照/相册导入→自动裁边→透视矫正→曲面展平→滤镜→导出PDF五级级联边缘检测 角点精化 RANSAC曲面展平证件复印身份证正反面拍一张自动排版到A4可加防滥用水印边缘检测 A4模板合成证件照拍照→自动抠像→换底色白/蓝/红/黑→标准尺寸裁剪YCbCr肤色保护 自适应洪水填充文字提取离线OCR中英文可复制存TXTTesseract本地引擎 专业预处理管线️图片压缩目标KB一键达标报名表/网传材料刚需二分搜索 维度递降图片水印斜向平铺中文水印防资料二次滥用预渲染图块 主线程同步合成三、技术选型为什么是纯Dart不是OpenCV很多人第一反应图像处理为什么不用OpenCV维度OpenCV纯Dartimage包包体积30MB0跨平台编译需配CMake/NDKAndroid/iOS各一遍零配置调试需C环境Dart断点直达性能更快文档扫描场景完全够用文档扫描的核心运算边缘检测、透视变换、二值化在手机端4ms即可完成纯Dart的性能绰绰有余。省下的30MB包体积和跨平台编译痛苦才是更大的收益。核心依赖dependencies:flutter:sdk:flutterimage:4.1.7# 纯Dart图像处理pdf:3.11.0# PDF生成 RC4-128加密printing:5.12.0# 本地打印image_picker:1.1.2# 相册多选provider:6.1.2# 状态管理flutter_tesseract_ocr:0.4.31# 本地OCRcrypto:^3.0.3# MD5摘要PDF加密用四、四层架构职责分明依赖单向┌─────────────────────────────────────────┐ │ UI层 (Screens Widgets) │ │ home / camera / crop / pages / export │ │ corner_editor / brush_canvas... │ ├─────────────────────────────────────────┤ │ 状态层 (Provider) │ │ ScanProvider RecentsProvider │ │ linkRecents() 双向联动 │ ├─────────────────────────────────────────┤ │ 服务层 (Services) │ │ storage / pdf_export / ocr / watermark │ │ compress / id_copy / portrait... │ ├─────────────────────────────────────────┤ │ 算法层 (Processing) │ │ edge_detection / dewarp / perspective │ │ filters / spot_removal / id_composer │ └─────────────────────────────────────────┘每一层只与相邻层通信UI不直接调算法算法不关心UI状态。这种隔离让算法可以独立测试UI可以灵活替换。五、核心算法一五级级联边缘检测4ms搞定80%场景单一Otsu二值化在低对比度场景会彻底失败。安心扫描用五级级联掩码逐级兜底/// 五级检测掩码依次尝试任一成功即返回Uint8List?_detectLevel(Uint8Listgray,int w,int h,int level){switch(level){case0:return_otsuLight(gray,w,h);// Otsu亮背景case1:return_otsuDark(gray,w,h);// Otsu暗背景case2:return_gradientFloodFromMag(mag,w,h,thr:30);// 梯度洪水填充case3:return_morphGradient(gray,w,h);// 形态学梯度case4:return_textureAnalysis(gray,w,h);// 纹理分析兜底}}配合级联早退策略得分超过阈值2.8立即返回不再执行后续级别。实测模式分辨率耗时说明实时250px4ms五级级联 早退覆盖80%场景精细500px~30ms五级全开 stdMap无早退六、核心算法二曲面展平——RANSAC 位移映射书本、票据弯曲导致的文字扭曲用RANSAC拟合文本行抛物线曲率再通过位移映射矫正/// 文本行曲率拟合 位移映射/// 曲率上限 8%防止字形过度拉伸/// 水平校正已禁用数学证明 sxx 不引起失真步骤算法作用文本行检测峰值检测minPeakGap dh/60定位每行曲率拟合RANSAC二次抛物线找出弯曲趋势位移映射自然三次样条 三次Hermite插值平滑矫正重采样Catmull-Rom双三次文字边缘锐利七、核心算法三离线OCR预处理管线Tesseract原版直接用效果一般关键在预处理原图 → 自动裁切 → 放大 → 投影轮廓纠偏 → Sauvola二值化 → PSM6识别预处理图原图各一次取较长结果八、性能实测数据指标实测值Release APK体积99.9 MBDebug APK体积223.9 MB边缘检测实时4ms250px水印预览1200px50ms水印导出3200px~1s图标Tree-shaking99.3%1.6MB→12KB九、竞品对比凭什么选择它维度安心扫描CamScanner白描 数据隐私全程本地不出设备云端OCR需上传云端OCR需上传 网络权限正式包不申请INTERNET需要需要 曲面展平RANSACCatmull-Rom闭源无/基础 OCRTesseract离线内置云端付费云端 PDF加密RC4-128本地付费无 水印本地无广告水印免费版强制水印无 证件复印A4正反面自动排版支持不支持 收费免费订阅买断内购十、完整工程源码下载本项目完整源码已上传CSDN因体积限制分为三个部分下载后请按说明合并 第一部分核心算法库 数学工具下载地址https://download.csdn.net/download/u010972645/93684889包含lib/core/— 数学基础库image_math.dart形态学/Otsu/凸包/softGainlib/services/processing/— 五大核心算法edge_detection.dart— 五级级联边缘检测dewarp.dart— 曲面展平perspective.dart— 透视矫正filters.dart— 滤镜 墨迹消除spot_removal.dart— 污点修复id_composer.dart— 证件A4合成scan_pipeline.dart— 统一处理管线 这部分是整个项目的算法基石单看这部分就能理解文档扫描的核心实现。 第二部分业务服务层 状态管理 数据模型下载地址https://download.csdn.net/download/u010972645/93684899包含lib/services/— 业务服务pdf_export_service.dartpdf_encryption.dartRC4-128加密ocr_service.dart、watermark_service.dart、compress_service.dartportrait_service.dart人像抠图、id_copy_service.dartstorage_service.dart、export_flow.dartlib/providers/— ScanProvider RecentsProvider 双Provider联动lib/models/— 可序列化数据模型scripts/— OCR语言包下载脚本 第三部分UI界面层 平台工程 完整工程配置下载地址https://download.csdn.net/download/u010972645/93684908包含lib/screens/— 全部页面首页/相机/裁边/编辑/多页/证件/导出lib/widgets/— 自定义组件四角编辑器/涂抹画笔/证件引导框android/ios/— 平台工程含隐私配置、tessdata资源pubspec.yaml、README.md、完整目录结构十一、如何合并三部分源码# 1. 下载三个压缩包到同一目录# 2. 解压第一部分到项目根目录# 3. 解压第二部分到同一根目录覆盖合并# 4. 解压第三部分到同一根目录覆盖合并# 5. 安装依赖flutter pub get--offline# 6. 运行flutter run# 7. 打包确认无INTERNET权限flutter build apk--release⚠️环境要求Flutter 3.44.8stable channel JDK 17 Android SDK 36十二、写在最后这款App我从0到1开发了数月每一行算法代码都经过真实场景打磨。无论你是计算机视觉学习者— 想了解纯Dart实现边缘检测、曲面展平的工业级方案Flutter开发者— 想借鉴四层架构、双Provider联动、Isolate异步的实战经验需要一款放心扫描App的用户— 不想再把身份证上传到云端这套完整源码都值得你下载研究。全部本地处理、数据不出设备、永久免费。立即下载第一部分核心算法 | 第二部分服务层状态管理 | 第三部分UI平台工程如果觉得有帮助欢迎点赞、收藏、关注后续会更新16篇系列技术文章逐篇拆解每个核心算法的实现细节。