# Étiquettes Rollo — application locale

Application française simple pour Rollo X1038 USB, TSPL, 203 dpi. Tous les traitements PDF sont locaux. Pas de télémétrie ni de requêtes distantes à l’exécution. Seuls l’identifiant USB vendorId/productId et l’espacement sont mémorisés dans localStorage. Les PDF, images et adresses restent en mémoire jusqu’à fermeture/vidage. L’export PNG est enregistré uniquement sur demande explicite.

## Chromebook

1. Activer l’environnement Linux de ChromeOS (nécessaire au petit serveur Python, pas au pilote USB).
2. Copier ce dossier dans les fichiers Linux. Dans le terminal, entrer dans ce dossier puis lancer `sh start-chromebook.sh`.
3. Ouvrir **http://localhost:8738/** dans **Chrome de ChromeOS**, pas un navigateur Linux. Garder le terminal ouvert. Le port localhost Linux est normalement accessible à ChromeOS ; sinon vérifier le transfert de port ChromeOS. Cette liaison et WebUSB restent à valider sur le Chromebook réel.
4. Choisir/déposer les PDF, connecter la Rollo USB (peut s’appeler « Printer »), choisir les pages puis cliquer sur **Imprimer la sélection** ou **Tout imprimer**.

Sous Windows : `powershell -ExecutionPolicy Bypass -File .\start-windows.ps1`. Chrome/Edge peuvent être empêchés d’accéder au périphérique par le pilote d’impression Windows. Aucun changement de pilote n’est réalisé par l’application.

Le serveur écoute seulement sur 127.0.0.1. Si le port 8738 est déjà utilisé, arrêter l’autre serveur ou servir le dossier depuis celui-ci. Pour le serveur parent existant : http://127.0.0.1:8738/rollo-simple/.

## Utilisation et formats

Les PDF de 288 × 432 points (4 × 6 pouces portrait) sont rendus à **812 × 1 218 pixels**, sans recadrage, étirement, rotation ajoutée ni suppression des marges existantes. La rotation déclarée par le PDF est respectée. Les autres dimensions sont ajustées proportionnellement, centrées sur fond blanc, mais **un accord sous chaque aperçu est obligatoire** avant impression ou export. Cela peut modifier la taille des codes-barres. Aucun éditeur destructif n’est proposé.

L’aperçu monochrome binaire (seuil de luminance 128) est le bitmap exact envoyé à l’encodeur. L’encodeur TSPL original inverse les bits comme requis par son protocole et ajoute le remplissage blanc de fin de ligne : 102 octets par ligne, 816 bits dont 812 utiles, 1 218 lignes. Il annonce SIZE 102.1 mm,152.4 mm (arrondi historique au multiple de 8 points), tout en conservant le contenu de 812 points et son échelle 203 dpi. Ce comportement original est conservé volontairement ; vérifier le tirage réel. Espacement 3 mm par défaut, réglable dans les options avancées. Une commande PRINT 1,1 par page.

Les pages restent sélectionnées après envoi ; un deuxième clic est une **nouvelle impression volontaire**. La reconnexion d’un périphérique déjà autorisé ne déclenche jamais d’impression. Le bouton d’arrêt termine la page en cours puis empêche la suivante ; une imprimante peut encore sortir les pages déjà reçues. Aucune répétition automatique après erreur. Le succès USB signifie seulement **« Envoyé à la Rollo — vérifiez le tirage »**.

Un délai de 120 secondes couvre chaque lot USB (15 secondes pour connexion). À expiration, le périphérique est fermé pour interrompre le transfert, et les commandes restent verrouillées jusqu’à la fin effective du transfert et du nettoyage. Si le navigateur ou le pilote ne termine jamais son opération USB, la page reste verrouillée : vérifier le tirage puis fermer/réouvrir la page, sans présumer qu’aucune étiquette n’est sortie. Une page partiellement envoyée peut nécessiter une remise à zéro de l’imprimante avant tout nouvel essai.

Limites : 25 Mo par fichier, 100 pages au total/lot, rendu de sortie de 989 016 pixels, images PDF limitées à 16 millions de pixels. Les documents malformés ou protégés par mot de passe sont refusés avec un message. Des PDF complexes peuvent encore consommer du temps/mémoire ; ne pas utiliser de fichiers démesurés sur un Chromebook peu puissant.

## Export PNG

Une page sélectionnée donne un PNG de 812 × 1 218 pixels ; plusieurs pages donnent un ZIP de PNG avec `checksums.json` (SHA-256 et dimensions). Le SHA-256 de tout export, y compris une seule page, est aussi disponible dans l’attribut `data-export-checksums` du message d’état pour la QA. L’export utilise directement le canvas de l’aperçu. Pour une impression via un autre logiciel : choisir 4 × 6 pouces, sans marges et sans ajustement ; ne pas se fier au DPI implicite des métadonnées PNG.

## Hors connexion, mises à jour et développement

Après le premier chargement complet, le service worker conserve **tous les fichiers statiques et ressources PDF.js** dans un cache versionné local. Aucun PDF utilisateur n’y est stocké. Revenir à la même adresse et au même port ; l’accès peut dépendre des règles localhost de ChromeOS. Le serveur reste conseillé pour un démarrage fiable. Ne pas ouvrir index.html en file://.

Le cache est cache-first, sans récupération réseau d’un module manquant. Une nouvelle version attend la fermeture de tous les onglets avant activation, pour éviter le mélange des versions. **Chaque modification des ressources distribuées exige de changer VERSION dans sw.js.** Pour le développement, supprimer le service worker/cache ou incrémenter cette version.

Aucune installation npm nécessaire. Le dossier vendor est inclus. Pour réacquérir uniquement la dépendance : `python vendor-pdfjs.py` (réseau nécessaire, tarball officiel, SHA-512 figé, extraction limitée aux fichiers autorisés, aucun script npm exécuté). Tests : `npm test` ou `node --test tests/*.test.js` depuis ce dossier.

## Validation et limites connues

Les fonctions d’encodage d’origine ont imprimé avec succès sur la Rollo de l’utilisateur selon son retour. **L’impression physique de cette adaptation n’a pas encore été vérifiée.** Les tests unitaires couvrent les dimensions, l’orientation pixel par pixel, le flux TSPL, les contrôles USB et le ZIP. La QA navigateur et les PDF réels sont validés séparément par le parent. Connexion USB/ChromeOS, centrage et lecture des codes-barres exigent encore un test sur le matériel réel.

Sources et licences : [NOTICE.md](NOTICE.md), [COPYING](COPYING), source d’origine intégrale dans `source-original/`.
