Spaces:
Sleeping
Sleeping
| # PRD β MarkitDown Local WebApp | |
| **Version** : 1.0 | |
| **Date** : 11 mai 2026 | |
| **Statut** : FinalisΓ© | |
| --- | |
| ## 1. Contexte & Objectif | |
| ### Problème | |
| Convertir des fichiers (PDF, Word, Excel, PowerPoint, images, HTMLβ¦) en Markdown est une tΓ’che frΓ©quente mais fastidieuse en ligne de commande. La librairie [MarkItDown](https://github.com/microsoft/markitdown) de Microsoft rΓ©sout la conversion, mais elle reste inaccessible sans interface. | |
| ### Objectif | |
| CrΓ©er une **application web locale** minimaliste, lancΓ©e en **un double-clic** sur un fichier `.bat` (Windows) ou `.sh` (Mac/Linux), qui expose MarkItDown dans un navigateur sans aucune Γ©tape de build prΓ©alable. | |
| --- | |
| ## 2. Utilisateurs cibles | |
| - DΓ©veloppeurs, tech writers, data analysts souhaitant convertir rapidement des fichiers locaux | |
| - Utilisateurs non-techniques voulant un outil simple sans setup complexe | |
| - Profil principal : utilisateur unique en local (pas de multi-tenant) | |
| --- | |
| ## 3. Périmètre fonctionnel | |
| ### 3.1 FonctionnalitΓ©s β Must Have π΄ | |
| | ID | FonctionnalitΓ© | Description | | |
| |----|---------------|-------------| | |
| | F1 | Upload de fichier | Drag & drop + bouton "Parcourir". Un ou plusieurs fichiers Γ la fois | | |
| | F2 | Conversion Markdown | Via MarkItDown β tous les formats supportΓ©s (PDF, DOCX, PPTX, XLSX, images, HTML, CSV, JSON, ZIPβ¦) | | |
| | F3 | PrΓ©visualisation | Affichage du Markdown rendu (HTML) et du Markdown brut (code) en onglets | | |
| | F4 | TΓ©lΓ©chargement `.md` | Bouton "TΓ©lΓ©charger" β gΓ©nΓ¨re un fichier `.md` nommΓ© d'aprΓ¨s le fichier source | | |
| | F5 | Copie presse-papier | Bouton "Copier" β copie le Markdown brut dans le clipboard | | |
| | F6 | Lancement 1 clic | Fichier `start.bat` (Windows) et `start.sh` (Mac/Linux) qui installent les dΓ©pendances si absent et lancent l'app | | |
| ### 3.2 FonctionnalitΓ©s β Should Have π | |
| | ID | FonctionnalitΓ© | Description | | |
| |----|---------------|-------------| | |
| | F7 | Historique local | Liste des dernières conversions (nom fichier, date, taille MD) persistée dans un fichier JSON local | | |
| | F8 | Re-tΓ©lΓ©chargement | Depuis l'historique, re-tΓ©lΓ©charger ou re-copier un rΓ©sultat prΓ©cΓ©dent | | |
| | F9 | Batch conversion | Convertir plusieurs fichiers en une fois, tΓ©lΓ©charger un `.zip` des `.md` rΓ©sultants | | |
| ### 3.3 FonctionnalitΓ©s β Nice to Have π‘ | |
| | ID | FonctionnalitΓ© | Description | | |
| |----|---------------|-------------| | |
| | F10 | Conversion URL | Saisir une URL Γ la place d'un fichier β MarkItDown supporte le scraping HTML | | |
| | F11 | Effacer historique | Bouton pour vider l'historique | | |
| --- | |
| ## 4. Architecture technique | |
| ### Stack | |
| - **Backend** : Python + **Flask** (lΓ©ger, zΓ©ro config, idΓ©al pour usage local) | |
| - **Frontend** : HTML/CSS/JS vanilla β pas de framework, pas de build step | |
| - **Conversion** : `markitdown` (pip) | |
| - **Persistance** : fichier `history.json` local dans le dossier de l'app | |
| ### Structure du projet | |
| ``` | |
| markitdown-app/ | |
| βββ start.bat β Lancement Windows (double-clic) | |
| βββ start.sh β Lancement Mac/Linux | |
| βββ app.py β Serveur Flask | |
| βββ requirements.txt β markitdown, flask | |
| βββ history.json β Historique (créé auto au premier lancement) | |
| βββ static/ | |
| β βββ style.css | |
| β βββ script.js | |
| βββ templates/ | |
| βββ index.html | |
| ``` | |
| ### Logique du launcher (`start.bat`) | |
| ``` | |
| 1. VΓ©rifie si Python est installΓ© β sinon, message d'erreur clair | |
| 2. VΓ©rifie si le venv existe β sinon, le crΓ©e et installe requirements.txt | |
| 3. Active le venv | |
| 4. Lance app.py (Flask sur http://localhost:5000) | |
| 5. Ouvre automatiquement le navigateur sur http://localhost:5000 | |
| ``` | |
| --- | |
| ## 5. Interface utilisateur | |
| ### Principes | |
| - Simple, minimaliste, sobre β aucun framework CSS externe | |
| - Palette monochrome (blanc/gris) + une couleur d'accent (violet ou indigo) | |
| - Responsive (fonctionne de 800px Γ 1400px) | |
| - Pas de dark mode (hors scope v1) | |
| ### Layout | |
| ``` | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| β MarkitDown [historique] β | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββ€ | |
| β β | |
| β ββββββββββββββββββββββββββββββββββββββββββ β | |
| β β Glissez un fichier ici β β | |
| β β ou cliquez pour parcourir β β | |
| β ββββββββββββββββββββββββββββββββββββββββββ β | |
| β β | |
| β [Rendu] [Markdown brut] β | |
| β ββββββββββββββββββββββββββββββββββββββββββ β | |
| β β (prΓ©visualisation du rΓ©sultat) β β | |
| β ββββββββββββββββββββββββββββββββββββββββββ β | |
| β β | |
| β [β¬ TΓ©lΓ©charger .md] [β Copier] β | |
| β β | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββ€ | |
| β Historique nom_fichier.pdf 12/05 [β] [β] β | |
| β autre_fichier.docx 11/05 [β] [β] β | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| ``` | |
| --- | |
| ## 6. Formats supportΓ©s | |
| Tous les formats pris en charge par MarkItDown : | |
| | CatΓ©gorie | Formats | | |
| |-----------|---------| | |
| | Documents Office | `.docx`, `.pptx`, `.xlsx` | | |
| | PDF | `.pdf` | | |
| | Images | `.jpg`, `.jpeg`, `.png`, `.gif`, `.webp`, `.bmp` | | |
| | Web | `.html`, `.htm` | | |
| | DonnΓ©es | `.csv`, `.json`, `.xml` | | |
| | Archives | `.zip` (extrait et convertit le contenu) | | |
| | Texte | `.txt`, `.md`, `.rst` | | |
| | Code | tous types de fichiers texte | | |
| | Audio | `.mp3`, `.wav` (transcription via MarkItDown si ffmpeg disponible) | | |
| --- | |
| ## 7. Gestion des erreurs | |
| | Cas | Comportement attendu | | |
| |-----|---------------------| | |
| | Format non supportΓ© | Message d'erreur inline dans l'UI : "Format non supportΓ© par MarkItDown" | | |
| | Fichier corrompu | Message d'erreur avec dΓ©tail de l'exception Python | | |
| | Python non installΓ© | Le `.bat` affiche une fenΓͺtre CMD avec instruction d'installation | | |
| | Port 5000 occupΓ© | Flask essaie le port 5001, puis 5002 β affiche le port utilisΓ© | | |
| | Fichier trop lourd (>50 Mo) | Warning dans l'UI, conversion lancΓ©e quand mΓͺme | | |
| --- | |
| ## 8. Contraintes & non-objectifs | |
| - β Pas de dΓ©ploiement cloud (100% local) | |
| - β Pas d'authentification (usage solo) | |
| - β Pas de dark mode en v1 | |
| - β Pas d'installeur `.exe` (le `.bat` suffit) | |
| - β Fonctionne offline (zΓ©ro appel rΓ©seau une fois les dΓ©pendances installΓ©es) | |
| - β Python 3.9+ requis (documentΓ© dans le README) | |
| --- | |
| ## 9. Livrables | |
| | Livrable | Description | | |
| |----------|-------------| | |
| | `start.bat` + `start.sh` | Launchers prΓͺts Γ l'emploi | | |
| | `app.py` | Backend Flask complet | | |
| | `index.html` + `style.css` + `script.js` | Frontend complet | | |
| | `requirements.txt` | `flask`, `markitdown` | | |
| | `README.md` | Instructions : prΓ©requis Python, comment lancer, formats supportΓ©s | | |
| --- | |
| ## 10. Critères d'acceptation | |
| - [ ] Double-clic sur `start.bat` β navigateur s'ouvre sur l'app en moins de 15 secondes (premier lancement) | |
| - [ ] Double-clic sur `start.bat` β app lance en moins de 3 secondes (lancements suivants) | |
| - [ ] Upload d'un PDF β Markdown correct affichΓ© en moins de 10 secondes | |
| - [ ] Bouton "TΓ©lΓ©charger" β fichier `.md` tΓ©lΓ©chargΓ© avec le bon nom | |
| - [ ] Bouton "Copier" β contenu dans le clipboard | |
| - [ ] La conversion est visible dans l'historique après chaque succès | |
| - [ ] L'historique persiste après fermeture et réouverture de l'app |