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ôt luciole-ocr sé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_INSERT Contacts 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.png comme launcher.
  • Polices : TTF embarquées localement — Playfair Display (display), Lora (body serif), Manrope (sans UI).
  • OCR langues : fra+deu+eng+spa+por+ita+pol (7 traineddata).
  • É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.kt exclu 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

#CommitVérification
S00docs(plan): Card2vcf OCR standalone sans LLMplan à jour
S01chore: scaffold Android Kotlin Compose Card2vcfassembleDebug
S02build: CameraX OpenCV Tesseract fonts tessdataresolve deps
S03feat(contact): ContactCard + VCard + Insert + Sharetests contact
S04feat(scan): ImageOrientation + OpenCvScanEnginetests EXIF
S05feat(ocr): Tesseract 7 langues + PostProcessorOcrPostProcessingTest
S06feat(contact): HeuristicParser + DraftMerge(null)tests dimo
S07feat(ui): Scan + Draft thème design.mdassemble + smoke
S08feat(android): Manifest CAMERA + FileProvider + icôneinstall APK
S09test: corpus dimo unit + instrumentedtests verts
S10docs(readme): Card2vcf usage, tessdata, limitesREADME

Critères d’acceptation

  1. Photo carte (EXIF 6 type dimo) → brouillon email + ≥1 téléphone sans crash.
  2. ContactDraftMerge.merge(null, ocr) remplit nom/poste/société/adresse sur fixture dimo.
  3. « Créer le contact » → Contacts prérempli ; « Exporter VCF » → .vcf partageable.
  4. Aucune dépendance cerveau / OkHttp / GMS / ML Kit.
  5. Tests unitaires verts ; instrumented dimo si appareil dispo.
  6. Offline total (pas de permission INTERNET).
  7. UI conforme design.md (N&B, coins 0, polices embarquées).