Skip to content

About

Numeriscan — scanner de documents natif macOS en Rust (SANE/genesys embarque). Teste sur macOS 26.6.2 / Mac mini M1 avec un Canon CanoScan LiDE 60.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

1 Commit

Folders and files

Repository files navigation

Numeriscan

Application native macOS pour numériser, retoucher et exporter des documents — en Rust, sans aucun logiciel payant.

Numeriscan pilote directement le scanner (via SANE, embarqué dans l'application) et remplace les utilitaires constructeur abandonnés ou payants. Scanner une pile de feuilles, recadrer à la souris, retourner, puis enregistrer le tout en un seul PDF : tout se fait dans une seule fenêtre.

English summary — Numeriscan is a free, native macOS document scanner front-end written in Rust (egui/eframe). It embeds the SANE genesys backend to drive legacy USB scanners such as the Canon CanoScan LiDE 60, and offers live preview, mouse-drag cropping with resizable handles, rotation/mirroring, multi-page batch scanning and PDF/JPEG/PNG export with adjustable quality. Tested on a Mac mini M1 running macOS 26.6.2 (build 25G83). Apple Silicon (arm64) only.

Aperçu de Numeriscan


Environnement testé

Système macOS 26.6.2 (build 25G83) — Tahoe
Machine Mac mini (Macmini9,1), puce Apple M1, 8 cœurs, 8 Go de RAM
Architecture arm64 uniquement (Apple Silicon). Les binaires SANE embarqués sont arm64 : l'app ne fonctionne pas sur Mac Intel en l'état.
Scanner Canon CanoScan LiDE 60 — USB 0x04a9:0x221c, plat à plat, piloté par le backend SANE genesys (support SANE : Good)
Minimum déclaré macOS 12 (LSMinimumSystemVersion), mais seul macOS 26.6.2 a été validé

Temps de numérisation constaté : environ 30 secondes par page A4 en 300 dpi couleur, quelle que soit la résolution choisie — c'est une limite matérielle du LiDE 60 (USB, 2005), pas du logiciel.

Fonctionnalités

  • Numérisation — couleur, niveaux de gris ou noir et blanc (texte), de 150 à 1200 dpi.
  • Aperçu avant enregistrement — la page s'affiche immédiatement ; rien n'est écrit tant que vous ne l'avez pas décidé.
  • Recadrage à la souris — glissez pour tracer la zone à conserver.
  • Poignées de redimensionnement — une fois la zone tracée, saisissez un bord ou un coin pour l'ajuster (comme le redimensionnement d'une fenêtre) ; glissez à l'intérieur pour déplacer la sélection. Le curseur change selon la zone survolée.
  • Détection automatique du document — recadre sur la page détectée quand le fond s'y prête.
  • Rotation et miroir — 90° à gauche, 90° à droite, 180°, miroir horizontal.
  • Retouches réversibles — « Restaurer le scan » ramène la page à son état d'origine (le scan brut est conservé en mémoire).
  • Numérisation en lot — l'option Enchaînement relance un scan automatiquement 5 secondes après le précédent : vous n'avez qu'à changer la feuille.
  • Gestion des pages — vignettes, réordonnancement, suppression.
  • Export — un PDF multi-pages regroupant tout le document, ou JPEG / PNG pour la page courante, avec un curseur de qualité (40–100 %).
  • Tout est local — aucun envoi, aucune connexion réseau, aucun compte.

Raccourcis

Touche Action
Espace Numériser
⌘ S Enregistrer le PDF

Installation

Depuis les sources (recommandé)

git clone https://github.com/MrFelt0385/Numeriscan.git
cd Numeriscan
./build_app.sh          # compile puis installe /Applications/Numeriscan.app

Prérequis : Xcode Command Line Tools et Rust (rustup). Le script compile le binaire, embarque les binaires SANE livrés dans resources/, réécrit les chemins dyld pour qu'ils pointent à l'intérieur du bundle, puis signe l'application en ad-hoc. Rien d'autre à installer.

Ce que l'application fait au premier lancement

SANE cherche ses greffons dans un dossier compilé en dur (/usr/local/lib/sane). Au démarrage, Numeriscan y dépose ses trois greffons arm64 (libsane-dll, libsane-genesys, libsane-canon_lide70) s'ils sont absents ou d'une autre architecture. Ce dossier appartient à l'utilisateur : aucun mot de passe n'est demandé, et rien n'est installé ailleurs. Le reste (bibliothèque libsane, libusb, configuration) vit entièrement dans le bundle.

Utilisation

  1. Posez la feuille sur la vitre du scanner.
  2. Cliquez sur Numériser (ou appuyez sur Espace). La page apparaît dans l'aperçu.
  3. Retouchez : tracez la zone à garder à la souris, ajustez les bords avec les poignées, ou utilisez les boutons de rotation.
  4. Pour un document de plusieurs pages, cochez Enchaînement avant de commencer : chaque scan s'enchaîne après 5 secondes, le temps de changer la feuille.
  5. Cliquez sur Enregistrer en PDF : toutes les pages partent dans un seul fichier.

Architecture

app/src/
  main.rs     interface egui (aperçu, sélection, poignées, export), mode auto-test
  sane.rs     FFI sur libsane (dlopen) : détection, réglages, lecture du flux
  model.rs    Page (image de travail + original compressé), Document (ordre, sélection)
  export.rs   écriture PDF minimale (JPEG /DCTDecode), JPEG, PNG
build_app.sh  compilation + assemblage du bundle + signature
tools/        capture de fenêtre et simulation de souris (CoreGraphics)

Le PDF est produit sans dépendance externe : un écrivain PDF minimal embarque chaque page en JPEG, ce qui donne des fichiers légers avec une qualité réglable.

Notes techniques (pièges rencontrés et résolus)

  1. SANE charge ses greffons depuis /usr/local/lib/sane, chemin compilé en dur. Les chemins absolus déclarés dans dll.d/dlld.conf sont ignorés : seuls les noms de greffons comptent. D'où la copie automatique décrite plus haut.
  2. libsane et ses greffons référencent /usr/local/lib/libusb-1.0.0.dylib en dur. Le script d'assemblage réécrit ces références avec install_name_tool vers @loader_path, sinon l'application dépend d'un libusb absent de la machine. Tout binaire arm64 doit ensuite être re-signé (codesign -f -s -).
  3. Le backend genesys annonce format=1 (niveaux de gris) alors qu'il livre du RGB. Se fier à ce champ produit des images entrelacées et un faux « ghosting » spectaculaire. La seule source fiable est bytes_per_line : == 3 × pixels_per_line signifie couleur.
  4. egui 0.36 a une API différente des versions antérieures : eframe::App expose fn ui(&mut self, ui, frame), les panneaux sont unifiés (egui::Panel::top/left/bottom) et leur show() prend un &mut Ui.
  5. macOS n'utilisait pas le .icns du bundle pour l'icône du Dock (icône générique malgré un paquet correct). L'application force donc son icône au démarrage en chargeant le PNG embarqué via AppKit (NSApplication.setApplicationIconImage:).
  6. Un .icns doit contenir exclusivement les noms normalisés (icon_16x16, icon_32x32@2x, …) : toute entrée hors norme peut le faire rejeter.

Licence

GNU General Public License v2.0 ou ultérieure — voir LICENSE.

Ce choix découle des composants embarqués pour piloter le scanner :

  • SANE (Scanner Access Now Easy), backend genesys — GPL-2.0-or-later. Les binaires arm64 livrés dans resources/sane/ proviennent de la distribution de NAPS2 (lui-même GPL-2.0), qui les construit et les redistribue ; les sources de SANE sont disponibles sur sane-project.org.
  • libusb — LGPL-2.1.
  • Le reste du code (interface, modèle, export PDF) est original.

Auteur

François Bernabé — @MrFelt0385 — ORCID 0009-0000-1482-3137

About

Numeriscan — scanner de documents natif macOS en Rust (SANE/genesys embarque). Teste sur macOS 26.6.2 / Mac mini M1 avec un Canon CanoScan LiDE 60.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages