CommunityImagegithub.com

scanned-pdf-cleaner

Transforme les photos de livres ou les scans bruts de pages académiques en un PDF net, plat et imprimable. Redresse les courbures, supprime les doigts, ombres et taches, et conserve le texte imprimé.

Qu'est-ce que scanned-pdf-cleaner ?

Ce skill est conçu pour les développeurs et les utilisateurs avancés d'agents IA (Claude Code, Cursor, Codex) qui doivent nettoyer et redresser des documents numérisés ou photographiés (chapitres de livres, articles académiques, etc.). Il prend en charge les PDF et les fichiers image. Le workflow se déroule en plusieurs étapes manuelles et automatisées : l'utilisateur trace les coins de chaque page, puis des scripts Python corrigent les courbures, suppriment les artefacts (doigts, ombres, taches) et normalisent la mise en page (marges égales, taille de texte uniforme). Le résultat est un PDF propre, lisible comme une impression, avec des lignes droites et un fond blanc. Le skill utilise des scripts Python et nécessite un environnement virtuel. L'utilisateur valide chaque étape via des planches-contact, ce qui garantit un contrôle qualité précis. Il gère également les pages à double colonne, les écritures de droite à gauche (hébreu, arabe) et les illustrations pleine page.

Compatible avec✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/shlomsh/scanned-pdf-cleaner/tree/HEAD/plugins/scanned-pdf-cleaner/skills/scanned-pdf-cleaner

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

Nettoyeur de PDF scannés

Les photos de livres ouverts au téléphone montrent des pages courbées près de la reliure, inclinées, grises, avec un pouce sur le bord et un lambeau de la page suivante. Ce skill les transforme en pages qui se lisent comme une impression propre.

Les scripts font le travail sur les pixels. Vous faites le jugement : vous tracez les coins de chaque page, regardez ce qui a été supprimé, et décidez quelles marques à l'extérieur du texte sont imprimées (garder) et lesquelles ne le sont pas (supprimer). Chaque étape écrit des planches-contact que vous pouvez lire comme des images, alors regardez-les. Ne supposez pas qu'une étape a fonctionné.

Installation (une fois par machine)

SKILL=<dossier de ce skill>      # le dossier contenant ce SKILL.md
python3 -m venv ~/.cache/scanned-pdf-cleaner-venv
~/.cache/scanned-pdf-cleaner-venv/bin/pip install -q -r "$SKILL/requirements.txt"
PY=~/.cache/scanned-pdf-cleaner-venv/bin/python

Chaque commande ci-dessous s'exécute comme cd "$SKILL/scripts" && $PY <script> .... Utilisez un nouveau dossier de travail vide par document, en dehors du projet de l'utilisateur (un dossier temporaire ou scratch). Les fichiers de l'utilisateur sont uniquement lus.

Flux de travail

1. Préparer

$PY prepare.py INPUT.pdf WORK          # ou : un dossier d'images, ou des fichiers image (HEIC : convertir d'abord)

Écrit WORK/src/p-NNN.jpg (photos redressées), WORK/grid/g-NNN.jpg (chaque photo avec une grille rouge tous les 100 px, étiquetée en centaines sur les quatre bords), et WORK/rough.json avec un contour provisoire par photo.

Si une photo est de travers ou à l'envers, tournez-la : $PY prepare.py --turn WORK p-003.jpg 90|180|270 (sens horaire).

2. Tracer les coins de page (vous)

Lisez chaque image de grille. Pour chaque photo, trouvez la page qui appartient au document. Écrivez ses quatre coins dans WORK/rough.json en pixels source, ordonnés haut-gauche, haut-droit, bas-droit, bas-gauche de la page telle qu'elle se lit. Pour le repère de grille 7 à droite et 12 en bas, écrivez [700, 1200].

{"001": {"src": "p-000.jpg", "quad": [[96,72],[930,92],[945,1468],[70,1480]]}}
  • Les clés sont l'ordre des pages de sortie (001, 002, ...). Gardez cet ordre aligné sur l'ordre de lecture.
  • Prenez le bord papier de la page, pas le texte. Près de la reliure, prenez la ligne où la page se courbe dans la gouttière. Une page qui sort de la photo reçoit des coins sur le bord de la photo.
  • Une photo d'une double page donne deux entrées avec le même src, une par page, par exemple "005" et "006".
  • Une précision d'environ 30 px suffit. L'étape suivante ajuste au bord réel.

3. Ajuster au bord du papier

$PY refine.py WORK

Écrit WORK/quads.json et WORK/sheets/quads-NN.jpg : orange = votre tracé, rouge = ajusté, point vert = haut-gauche. Lisez les planches. Si un contour rouge a sauté sur une ombre, la table ou la page voisine, corrigez ce tracé et relancez l'étape.

4. Aplatir, teinter et nettoyer les bords

$PY clean.py WORK            # ou : clean.py WORK 004 007  pour refaire certaines pages

Pour chaque page, cela :

  • trouve ses lignes de texte et les bords de colonne justifiés ;
  • redresse le bloc de texte et ajuste une surface de courbure lisse à chaque ligne, de sorte que les lignes courbes deviennent droites ;
  • teinte le papier en blanc et l'encre en noir ;
  • supprime les marques sombres qui touchent le bord de la page : doigts, courbure de la reliure, plis et lambeaux de page suivante.

Les pages avec moins de 5 lignes de texte, comme les pages de titre et les figures pleine page, reçoivent une simple déformation à quatre coins. Sortie : WORK/pages/, WORK/blocks.json, et WORK/sheets/review-NN.jpg, où le rouge = supprimé, le bleu = laissé à votre décision et le vert = bloc de texte.

Lisez les planches de révision. Choses à vérifier :

  • Des lignes encore courbes, ou la page penchée : le tracé est incorrect. Corrigez rough.json, puis relancez refine et clean pour cette page.
  • Du texte à l'intérieur du cadre vert montré en rouge : prévenez l'utilisateur. Le nettoyage des bords ne supprime jamais le texte à l'intérieur du bloc sauf s'il se trouve sur la bande de bord de la page.

5. Lister les marques en dehors du texte

$PY flags.py WORK

Écrit WORK/flags/flags-N.jpg : vignettes numérotées de toutes les marques sombres en dehors du bloc de texte.

6. Décider de garder ou supprimer (vous)

Lisez les planches de drapeaux et écrivez WORK/decisions.json :

{"keep": [0, 3, 4, 7], "strokes_only": [23], "erase": [{"page": "014", "box": [1500, 300, 80, 900], "mode": "strokes"}]}
  • keep : tout ce qui est imprimé. Cela inclut les numéros de page, les titres courants, les numéros de chapitre, les légendes, les étiquettes latérales, les filets de tableau, les figures et les dessins. Le texte imprimé est net et régulier. Les dessins dans le livre sont aussi de l'impression, même s'il s'agit de dessins d'enfants griffonnés.
  • remove : laissez le numéro de côté. Cela inclut l'écriture manuscrite, les notes au stylo et au crayon, les taches, les points, les empreintes digitales, les barres grises et les ombres de bords déchirés. Les traits de stylo sont fins, irréguliers et souvent penchés, et ne correspondent pas à la police.
  • strokes_only : lettres imprimées avec un trait de stylo à travers ou à côté. Seuls les traits plus hauts que 1,5 lignes sont supprimés.
  • erase : une boîte en pixels de page sur pages/page-KEY.jpg, pour les marques à l'intérieur du bloc de texte que vous avez été invité à supprimer. "mode": "all" blanchit la boîte ; "strokes" supprime uniquement les traits hauts.

Demandez à l'utilisateur avant de supprimer ce qu'il pourrait souhaiter conserver. Cela inclut les soulignements au stylo et les notes entre les lignes à l'intérieur du texte, et les surligneurs. Par défaut : supprimez les notes en marge, conservez les soulignements à l'intérieur du texte. Demandez aussi lorsque vous ne pouvez pas distinguer l'imprimé du manuscrit. Montrez la vignette, ne la décrivez pas.

7. Terminer

$PY finish.py WORK OUT.pdf           # --no-frame conserve le cadrage propre de chaque page ; --dpi 300 par défaut

Ce qu'il fait :

  • Blanchit tout ce qui se trouve en dehors du bloc de texte, sauf les éléments conservés.
  • Supprime les grandes parenthèses fines au stylo qui entourent les côtés du bloc.
  • Cadre chaque page sur un format de page unique :
    • Le texte sort à une seule taille : les photos prises de près ou de loin correspondent. La mise à l'échelle utilise la largeur du bloc de texte, ou l'interlignage là où une figure rétrécit la colonne.
    • Les marges latérales sont égales, de sorte que le contenu qui était contre un bord ou décentré par l'épaisseur du livre est centré.
    • Chaque page commence à la même marge supérieure.

Lisez WORK/sheets/final-NN.jpg avant de remettre le document. Vérifiez chaque page pour les taches restantes, le texte coupé et tout ce que vous avez gardé par erreur. Puis donnez le chemin du PDF à l'utilisateur. Enregistrez le PDF à côté de l'entrée (par exemple <nom>_clean.pdf) sauf indication contraire.

À quoi ressemble un bon résultat

  • Lignes de texte droites et de niveau d'un bord à l'autre, y compris la ligne la plus proche de la reliure.
  • Papier blanc pur et type noir solide, avec les traits fins intacts. Les grands dessins sombres conservent leur remplissage.
  • Pas de doigts, d'ombres, de lambeaux de page voisine ou de points. Marges latérales égales et même taille de texte sur chaque page.

Notes d'utilisation réelle

  • Le redresseur lit le texte, donc il est au meilleur de sa forme sur les pages pleines de lignes justifiées. Il fonctionne pour toute écriture, y compris de droite à gauche (hébreu, arabe), car il ne regarde que les formes des lignes.
  • Les lignes courtes à l'intérieur des dessins (étiquettes) sont ignorées lors de l'ajustement de la courbure, de sorte que les figures ne plient pas la page.
  • Un dessin sombre qui remplit une grande partie d'une page serait délavé en gris avec une teinte naïve. tone() maintient l'estimation du papier à partir du papier environnant.
  • Lorsque la courbure d'une page avale quelques lettres à la reliure, la photo n'a rien à récupérer. Dites-le et n'inventez pas de texte.
  • Articles à double colonne : le bloc couvre les deux colonnes. Vérifiez la planche de révision pour les lignes ajustées à travers la gouttière.

Skills associés