CommunityImagegithub.com

Plasmoid77/photo-to-pdf

Numérisez des photos de cahiers, livres et documents papier en un PDF soigné : séparez les doubles pages, corrigez la perspective, rognez précisément les bords en préservant les notes et les dessins. Utilisable aussi pour corriger les marges d'un tel PDF ; pas destiné à la retranscription de texte, à l'OCR comme tâche principale ou à la restauration générative.

Qu'est-ce que photo-to-pdf ?

Ce skill transforme des photos de cahiers, livres et feuilles volantes en un PDF bien organisé. Il gère la détection des feuilles individuelles et des doubles pages, la correction de perspective, le recadrage serré et la préservation des traits fins (crayon, stylo). Il est conçu pour fonctionner localement avec des scripts Python, sans nécessiter de plugin ou MCP spécial. Le processus se déroule en plusieurs étapes : préparation des manifestes et planches contact, inspection manuelle des cas ambigus, construction du PDF, puis révision assistée par l'IA. Le skill fournit des commandes pour préparer, inspecter, construire, mesurer, réviser et comparer les résultats. Il inclut une méthode de vérification efficace avec des agents parallèles peu coûteux pour les gros volumes, mais insiste sur la nécessité d'une validation humaine pour les documents importants. Il ne garantit pas une détection automatique parfaite des bords ni l'absence de contrôle visuel.

Compatible avec✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/Plasmoid77/photo-to-pdf/tree/HEAD

Installed? Explore more Image skills: steipete/songsee, affaan-m/frontend-design, mattpocock/improve-codebase-architecture · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Photo en PDF

L'objectif est d'obtenir des pages individuelles dans le bon ordre, des bordures serrées et des traits préservés sur les bords. Travaillez localement avec des photos. Aucun plugin ou MCP spécial n'est requis pour ce processus.

Méthode éprouvée

  1. Examinez les sources. Tenez compte des EXIF. Vérifiez l'ordre par nom/date et contenu ; l'heure de la prise de vue ne prouve pas à elle seule la séquence. Repérez la couverture, les doubles pages, les duplicatas refaits, les feuilles vides. La luminosité ne permet pas de distinguer de manière fiable un dessin pale d'une page vide. Si le papier repose sur un fond clair (table blanche, feuille, écran à côté) et que les contours ne se détectent pas, demandez à reprendre la photo sur une surface mate foncée.
  2. Marquez les feuilles. Pour les feuilles individuelles (documents, A4, y compris en paysage), lancez prepare --layout pages. auto ne divise un contour large que s'il y a des signes de pliure (ombre de la reliure ou ligne de pli), mais peut se tromper sur des feuilles inhabituelles. scan.py prepare crée un manifeste brut et des planches contact avec les contours. Le détecteur trouve le papier comme une zone claire peu saturée, attire les bords vers la transition nette « papier → fond sombre » et pour une double page, cherche le pli. Le pli est l'endroit où les lignes de réglure se brisent. L'ombre de la reliure se trouve sur une seule page ; pour une ombre profonde, le pli est placé à la base du saut de luminosité du côté sombre. Sur des cahiers de référence, l'erreur médiane du pli est de 2 à 3 px. Cela reste une hypothèse. Les pages avec un flags non vide (gutter-*, partner-mismatch, touches-frame, aspect-outlier, one-side-unruled, margin-ink, contour, full-frame-fallback, duplicate) doivent être marquées manuellement en priorité. Vérifiez les autres sur la photo : le détecteur peut prendre un écran, un ticket ou une moitié de double page. scan.py inspect donne des agrandissements de chaque coin avec des graduations en fractions du cadre — corrigez les angles dans le manifeste à partir de ceux-ci. Chaque feuille reçoit ses quatre angles TL, TR, BR, BL dans les coordonnées après la rotation EXIF.
  3. Corrigez la perspective. Par défaut, une matrice projective par feuille. Ne déplacez pas des lignes/colonnes individuelles à la suite d'un bord détecté automatiquement : une grille, du texte, des doigts et des ombres peuvent être pris pour un bord et créer des ondulations sur toute la feuille. Pour un redressement complet explicitement demandé d'une page de livre courbée, un algorithme distinct et vérifié ainsi qu'une vérification supplémentaire de la géométrie sont nécessaires.
  4. Ajustez les bordures. Un recadrage serré est préférable à une grande marge uniforme partout. bleed_px est par défaut à 0. Ajoutez une petite marge individuellement, seulement si une écriture ou un bord incurvé contenant de l'information dépasse réellement de la ligne droite entre les angles. Vérifiez les sommets des lettres, les points sur les lettres, les dates à gauche, le texte près du pli et les lignes inférieures des dessins. La ligne du bas atteint souvent le bord même – la bordure y suit la médiane du bord, pas un ajustement serré. Si des traits de plume se trouvent entre la bordure serrée et le bord du papier, prepare décale lui-même la bordure vers eux (champ margin_ink, pas plus de 4 % de la largeur). Le crayon n'est pas protégé ainsi, donc vérifiez visuellement les dates et signatures au crayon près du bord. Un bord incurvé est approximé par une ligne droite, donc les coins d'une feuille bombée peuvent rester légèrement en dehors de la bordure. Effectuez un recadrage supplémentaire du PDF avec la commande crop, sans nouvel étirement ni recompression JPEG.
  5. Conservez les traits pales. Une correction douce de l'éclairage est acceptable ; une binarisation agressive peut effacer le crayon. Pour les couvertures, les photos et les couleurs importantes, désactivez enhance. Ne redessinez pas les lettres, schémas ou parties manquantes du cadre avec un modèle génératif. N'ajoutez l'OCR que lorsqu'il est nécessaire ou demandé.
  6. Vérifiez le PDF final. Utilisez la compétence PDF disponible pour créer/vérifier, y compris le marqueur d'opération prévu par celle-ci. review rend toutes les pages, crée des planches contact et liste les pages avec un fond ou une écriture près du bord (edges.json). compare montre chaque page à partir de la photo avec une marge de 4 % et un cadre rouge de recadrage – on voit ce qui reste à l'extérieur. Parcourez l'intégralité du document, pas seulement les premières pages. Schéma économique pour un grand volume : faites compare pour toutes les pages, distribuez-les par paquets de 16 maximum à des agents parallèles sur un modèle peu coûteux avec images (dans Claude Code — Sonnet, dans Codex — gpt-5.6-luna) avec la tâche de references/screening.md sans modification. N'ouvrez vous-même que les pages où le vérificateur a signalé un defect, et les pages avec des drapeaux prepare ; ne corrigez que ce qui est confirmé. Sur un brouillon de 32 pages avec 8 erreurs d'angle connues > 3 %, ce schéma a trouvé les 8 (Sonnet — 7, les drapeaux — la restante) avec 4 fausses alertes ; Haiku en a trouvé 4 et n'a ajouté que de fausses alertes, donc Haiku seul ne suffit pas. Sur un deuxième cahier (32 pages, tâche non adaptée), Sonnet et gpt-5.6-luna ont trouvé des bandes de fond visibles sans fausse alerte, mais ont manqué les pages avec une erreur d'angle de 1,5 à 2 % ; gpt-6.1-terra a signalé presque tout, y compris 12 pages sur 19 vierges, donc pas d'économie avec lui. Le schéma a été testé sur un seul cahier, la tâche a été rédigée sur les mêmes pages : pour un document important ou en cas de doute, regardez toutes les pages vous-même. Les numéros de page dans les réponses des vérificateurs vérifient également l'ordre. Après un recadrage, revérifiez les pages concernées ; après une modification de l'algorithme géométrique, tout le document. Le nombre de pages et un config correct ne remplacent pas une inspection visuelle.

Pour cette numérisation, l'utilisateur préfère supprimer les feuilles confirmées vierges ; une demande explicite de les conserver est prioritaire. Éliminez les duplicatas après vérification visuelle, pas par similarité de grille/écriture. Conservez la couverture sauf instruction contraire. Lisez la double page de gauche à droite lorsque la source est ainsi organisée.

Commandes

Le chemin vers le script est défini relativement à ce skill. Schéma et paramètres : references/commands.md. Ne reportez pas les angles, chemins, numéros de page et proportions du cahier précédent.

python3 <skill>/scripts/scan.py prepare <photos> --work <work> --layout auto
python3 <skill>/scripts/scan.py inspect <work>/manifest.json --work <work>/inspect --ids 0006-L,0006-R
python3 <skill>/scripts/scan.py build <work>/manifest.json --output <work>/draft.pdf
python3 <skill>/scripts/scan.py measure <work>/draft-pages --work <work>/measure
python3 <skill>/scripts/scan.py review <work>/draft.pdf --work <work>/review
python3 <skill>/scripts/scan.py compare <work>/draft.scan.json --work <work>/compare

Dépendances : Pillow, NumPy, OpenCV, ReportLab pour les photos ; pypdfium2 pour crop ; Poppler pdftoppm pour review et measure à partir du PDF. Les importations sont séparées par commande. Vérifiez les interpréteurs/environnements prêts à l'emploi disponibles ; si nécessaire, utilisez un venv séparé sans modifier le Python global. Si OpenCV/NumPy sont installés en tant que paquets système, créez un venv sur le même interpréteur avec --system-site-packages (python3 -m venv ; uv venv prend par défaut son propre Python et ne verra pas cv2 système). Le réseau n'est pas supposé obligatoire. N'intégrez pas de chemins provenant du cache d'une machine spécifique dans le skill.

Proportions et taille de la feuille. aspect: null est estimé à partir des côtés du contour et peut être décalé de 1 à 2 % sous un angle. Pour du papier quadrillé, assemblez un brouillon et lancez measure. Il trouve le pas de la grille, calcule la taille physique des pages et propose un aspect unique pour tout le cahier et --width-mm. Prenez les valeurs de la sortie, pas du cahier précédent. Avec un --width-mm identique, toutes les pages du PDF ont la même taille physique. Sinon, la taille est calculée à partir des pixels et de --dpi et varie avec la distance de prise de vue.

build exige reviewed: true pour les pages incluses : c'est une marque de vérification du marquage par l'agent, pas une demande de validation supplémentaire à l'utilisateur. Ne demandez pas la permission pour un traitement de routine de photos déjà fournies.

Régressions du détecteur. Un manifeste de cahier vérifié est une référence. Après avoir modifié scan.py, relancez prepare sur les mêmes photos et eval <nouveau manifeste> --reference <référence>. La commande affiche l'erreur d'angle en % de la largeur de la page, la proportion de pages marquées et les erreurs « silencieuses » — pages non marquées avec une erreur supérieure à --tolerance (par défaut 3 %). Code de retour 1 si le nombre d'erreurs silencieuses dépasse --max-silent. Ne placez pas de références avec des photos personnelles dans le dépôt du skill.

Achèvement

  • Ne modifiez pas les photos d'origine. Remplacez le PDF existant après vérification de la nouvelle version. Conservez le marquage et les paramètres pour des corrections ponctuelles.
  • Lors d'une correction ultérieure, vérifiez d'abord l'actualité du fichier. Évitez la recompression JPEG cumulative.
  • Communiquez le résultat, le nombre de pages et les limitations importantes des sources. Si une partie de l'écriture est déjà hors cadre, indiquez-le plutôt que de prétendre à une restauration.
  • Le skill économise la préparation et la réécriture du code ; il ne promet pas une détection automatique parfaite des bords ni l'annulation de la vérification visuelle.

Skills associés