ocr_standalone_app_7aad0922.plan.md
6069 octets
name: Card2vcf OCR standalone overview: "App Android Card2vcf dans EBII_mobileVCF : scan carte → OCR local (7 langues) → ContactCard heuristique → Contacts + VCF, sans LLM. Code inspiré de luciole-mobile (AGPL)." todos:
- id: s00-repo-plan content: Plan versionné + décisions figées Card2vcf status: completed
- id: s01-scaffold content: Scaffold Android Compose minSdk 31, package fr.ebii.card2vcf status: pending
- id: s02-deps content: "Gradle: CameraX, OpenCV, Tesseract JitPack, exif + fonts TTF + tessdata 7 langues" status: pending
- id: s03-contact content: Migrer ContactCard, VCard, Insert, Share + tests status: pending
- id: s04-scan content: Migrer ImageOrientation + OpenCvScanEngine + tests EXIF status: pending
- id: s05-ocr content: Migrer Tesseract/Orientation/PostProcessor + tessdata 7 langues status: pending
- id: s06-heuristics content: Heuristiques + DraftMerge(null) + tests dimo status: pending
- id: s07-ui content: ScanCarteViewModel sans LLM + thème design.md + icon.png status: pending
- id: s08-manifest content: Manifest CAMERA + FileProvider + LICENSE AGPL status: pending
- id: s09-tests content: Unit + instrumented corpus dimo verts status: pending
- id: s10-readme content: "README Card2vcf: usage, tessdata, limites sans LLM" status: pending isProject: true
Plan Card2vcf (OCR standalone sans LLM)
Décisions figées
- Dépôt cible :
/home/monsieurb/Documents/devel/EBII_mobileVCF(pas un dépôtluciole-ocrséparé). - Nom produit : Card2vcf.
- Licence : AGPL v3 (remote Git géré par le mainteneur).
- Package / applicationId :
fr.ebii.card2vcf. - Périmètre produit : Capture → EXIF → OpenCV → Tesseract → heuristiques
ContactCard→ brouillon éditable →ACTION_INSERTContacts et export.vcf. - Zéro LLM : aucun
cerveau, aucun OkHttp, aucune grammaire GBNF. - minSdk : 31 (Android 12+), compile/target 35. Contrainte produit hors-GMS / Android 14+ pour l’usage cible ; minSdk aligné luciole-mobile pour réutiliser le code validé.
- UI :
design.md(N&B éditorial, coins carrés, hairlines) +icon.pngcomme launcher. - Polices : TTF embarquées localement — Playfair Display (display), Lora (body serif), Manrope (sans UI).
- OCR langues :
fra+deu+eng+spa+por+ita+pol(7traineddata). - État UI : conserver l’étape Structuring (« Analyse du contact… ») même sans LLM.
- Source code : extraire / adapter depuis luciole-mobile (open source), packages renommés vers
fr.ebii.card2vcf.
Workflow cible
flowchart LR
cam[CameraX] --> exif[ImageOrientation]
exif --> scan[OpenCvScanEngine]
scan --> tess[TesseractOcrEngine]
tess --> orient[OcrOrientation]
orient --> post[OcrPostProcessor]
post --> heur[ContactHeuristicParser]
heur --> merge[ContactDraftMerge_null]
merge --> draft[ContactDraftScreen]
draft --> insert[ContactInsertIntent]
draft --> vcf[VcfShare]
Remplacement Luciole :
val merged = ContactDraftMerge.merge(null, ocr)
Arborescence cible
EBII_mobileVCF/ ├── README.md ├── LICENSE # AGPL v3 ├── AGENTS.md ├── design.md ├── icon.png ├── docs/plans/… └── android/ ├── settings.gradle.kts # + jitpack ├── build.gradle.kts └── app/ ├── build.gradle.kts └── src/main/ ├── AndroidManifest.xml ├── java/fr/ebii/card2vcf/ │ ├── MainActivity.kt │ ├── contact/ │ ├── scan/ │ ├── ocr/ │ └── ui/ (+ theme design.md) ├── assets/tesseract/tessdata/{fra,deu,eng,spa,por,ita,pol}.traineddata └── res/ ├── font/{playfair_*,lora_*,manrope_*} ├── mipmap/ (depuis icon.png) ├── xml/file_paths.xml └── values/{strings,colors,themes}
Exclusions strictes
- Tout
cerveau/, OkHttp, ZXing, GMS, ML Kit, kotlinx-serialization (sauf besoin réel). ContactCardJson.ktexclu par défaut.
Gradle (app)
namespace = "fr.ebii.card2vcf" applicationId = "fr.ebii.card2vcf" minSdk = 31 // CameraX 1.4.1, OpenCV 4.10.0, Tesseract4Android-openmp 4.9.0, exifinterface 1.3.7 // PAS okhttp, PAS serialization obligatoire
Tickets commit atomiques
| # | Commit | Vérification |
|---|---|---|
| S00 | docs(plan): Card2vcf OCR standalone sans LLM | plan à jour |
| S01 | chore: scaffold Android Kotlin Compose Card2vcf | assembleDebug |
| S02 | build: CameraX OpenCV Tesseract fonts tessdata | resolve deps |
| S03 | feat(contact): ContactCard + VCard + Insert + Share | tests contact |
| S04 | feat(scan): ImageOrientation + OpenCvScanEngine | tests EXIF |
| S05 | feat(ocr): Tesseract 7 langues + PostProcessor | OcrPostProcessingTest |
| S06 | feat(contact): HeuristicParser + DraftMerge(null) | tests dimo |
| S07 | feat(ui): Scan + Draft thème design.md | assemble + smoke |
| S08 | feat(android): Manifest CAMERA + FileProvider + icône | install APK |
| S09 | test: corpus dimo unit + instrumented | tests verts |
| S10 | docs(readme): Card2vcf usage, tessdata, limites | README |
Critères d’acceptation
- Photo carte (EXIF 6 type dimo) → brouillon email + ≥1 téléphone sans crash.
ContactDraftMerge.merge(null, ocr)remplit nom/poste/société/adresse sur fixture dimo.- « Créer le contact » → Contacts prérempli ; « Exporter VCF » →
.vcfpartageable. - Aucune dépendance cerveau / OkHttp / GMS / ML Kit.
- Tests unitaires verts ; instrumented dimo si appareil dispo.
- Offline total (pas de permission INTERNET).
- UI conforme design.md (N&B, coins 0, polices embarquées).
GitRust