CommunityImagengithub.com

shlomsh/scanned-pdf-cleaner

Convierte fotos de teléfono o escaneos de páginas de libros y artículos académicos en un PDF limpio y plano para leer. Endereza líneas curvas y páginas inclinadas basándose en el texto mismo, elimina dedos, sombras del lomo, curvatura de página, fragmentos de la página vecina, manchas y notas marginales, conserva el texto impreso, figuras, pies de foto y números de página, y uniforma los márgenes. Úsalo cuando alguien tenga un capítulo de libro, artículo o documento (PDF o imágenes) fotografiado o mal escaneado, que sea difícil de leer, torcido, curvado, manchado o descentrado.

¿Qué es scanned-pdf-cleaner?

Este skill convierte fotos de teléfono o escaneos de baja calidad de páginas de libros y artículos académicos en un PDF limpio, plano y legible. Funciona corrigiendo la curvatura de la página, enderezando líneas de texto, eliminando dedos, sombras del lomo, fragmentos de páginas vecinas y manchas marginales, todo ello basándose en el análisis del texto mismo. Es especialmente útil para documentos con múltiples columnas, escritura de derecha a izquierda (como hebreo o árabe) y páginas con figuras y dibujos. El flujo de trabajo es semiautomático: el usuario traza las esquinas de las páginas y decide qué marcas marginales conservar o eliminar, mientras que los scripts realizan el refinamiento, la limpieza y la generación del PDF final. Está diseñado para usuarios que necesitan digitalizar libros, artículos o materiales de estudio de forma eficiente, y es compatible con sistemas que ejecuten Python 3 y dependencias de procesamiento de imágenes (OpenCV, numpy, scipy).

Compatible con✓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 Imagen skills: steipete/songsee, affaan-m/frontend-design, mattpocock/improve-codebase-architecture · View all 6 →

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Limpiador de PDF escaneados

Las fotos de teléfono de un libro abierto salen curvadas cerca del lomo, inclinadas, grises, con un pulgar en el borde y un fragmento de la página siguiente. Este skill las convierte en páginas que se leen como una impresión limpia.

Los scripts hacen el trabajo de píxeles. Tú juzgas: trazas las esquinas de cada página, observas lo que se eliminó y decides qué marcas fuera del texto están impresas (conservar) y cuáles no (eliminar). Cada paso escribe hojas de contacto que puedes leer como imágenes, así que míralas. No asumas que un paso funcionó.

Configuración (una vez por máquina)

SKILL=<carpeta de este skill>      # la carpeta que contiene este 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

Cada comando a continuación se ejecuta como cd "$SKILL/scripts" && $PY <script> .... Usa una carpeta de trabajo nueva y vacía por documento, fuera del proyecto del usuario (una carpeta temporal o de scratch). Los archivos del usuario solo se leen.

Flujo de trabajo

1. Preparar

$PY prepare.py INPUT.pdf TRABAJO          # o: una carpeta de imágenes, o archivos de imagen (HEIC: convierte primero)

Escribe TRABAJO/src/p-NNN.jpg (fotos enderezadas), TRABAJO/grid/g-NNN.jpg (cada foto con una cuadrícula roja cada 100 px, etiquetada en centenas en los cuatro bordes) y TRABAJO/rough.json con un contorno provisional por foto.

Si una foto está de lado o al revés, gírala: $PY prepare.py --turn TRABAJO p-003.jpg 90|180|270 (en sentido horario).

2. Trazar las esquinas de la página (tú)

Lee cada imagen de cuadrícula. Para cada foto, encuentra la página que pertenece al documento. Escribe sus cuatro esquinas en TRABAJO/rough.json en píxeles de origen, ordenadas superior-izquierda, superior-derecha, inferior-derecha, inferior-izquierda de la página tal como se lee. Para la etiqueta de cuadrícula 7 a lo ancho y 12 a lo alto, escribe [700, 1200].

{"001": {"src": "p-000.jpg", "quad": [[96,72],[930,92],[945,1468],[70,1480]]}}
  • Las claves son el orden de página de salida (001, 002, ...). Mantén ese orden emparejado con el orden de lectura.
  • Toma el borde del papel de la página, no el texto. Cerca del lomo, toma la línea donde la página se curva hacia el pliegue. Una página que se sale de la foto obtiene esquinas en el borde de la foto.
  • Una foto de una página doble da dos entradas con el mismo src, una por página, por ejemplo "005" y "006".
  • Dentro de unos 30 px es suficiente. El siguiente paso ajusta al borde real.

3. Ajustar al borde del papel

$PY refine.py TRABAJO

Escribe TRABAJO/quads.json y TRABAJO/sheets/quads-NN.jpg: naranja = tu trazo, rojo = ajustado, punto verde = superior-izquierda. Lee las hojas. Si un contorno rojo saltó a una sombra, la mesa o la página vecina, corrige ese trazo y ejecuta el paso de nuevo.

4. Aplanar, tonificar y limpiar los bordes

$PY clean.py TRABAJO            # o: clean.py TRABAJO 004 007  para rehacer algunas páginas

Para cada página esto:

  • encuentra sus líneas de texto y los bordes de columna justificados;
  • cuadra el bloque de texto y ajusta una superficie de curvatura suave a cada línea, para que las líneas curvas salgan rectas;
  • tonifica el papel a blanco y la tinta a negro;
  • elimina las marcas oscuras que tocan el borde de la página: dedos, curvatura del lomo, pliegues y fragmentos de la página siguiente.

Las páginas con menos de 5 líneas de texto, como páginas de título y figuras de página completa, reciben una deformación simple de cuatro esquinas. Salida: TRABAJO/pages/, TRABAJO/blocks.json y TRABAJO/sheets/review-NN.jpg, donde rojo = eliminado, azul = dejado para tu decisión y verde = bloque de texto.

Lee las hojas de revisión. Cosas a buscar:

  • Líneas aún curvadas, o la página torcida: el trazo está mal. Corrige rough.json, luego vuelve a ejecutar refine y clean para esa página.
  • Texto dentro del recuadro verde mostrado en rojo: informa al usuario. La limpieza de borde nunca elimina texto dentro del bloque a menos que esté en la banda del borde de la página.

5. Listar las marcas fuera del texto

$PY flags.py TRABAJO

Escribe TRABAJO/flags/flags-N.jpg: fichas numeradas de cada marca oscura fuera del bloque de texto.

6. Decidir conservar o eliminar (tú)

Lee las hojas de fichas y escribe TRABAJO/decisions.json:

{"keep": [0, 3, 4, 7], "strokes_only": [23], "erase": [{"page": "014", "box": [1500, 300, 80, 900], "mode": "strokes"}]}
  • keep: cualquier cosa impresa. Esto incluye números de página, encabezados de página, números de capítulo, pies de foto, etiquetas laterales, reglas de tabla, figuras y dibujos. La letra impresa es nítida y regular. Los dibujos en el libro también son impresos, incluso si son garabatos de niños.
  • remove: omite el número. Esto incluye escritura a mano, notas a bolígrafo o lápiz, manchas, motas, huellas dactilares, barras grises y sombras de bordes rasgados. Las líneas de bolígrafo son finas, irregulares y a menudo inclinadas, y no coinciden con la fuente.
  • strokes_only: letras impresas con un trazo de bolígrafo a través o al lado. Solo se eliminan trazos de más de 1.5 líneas de altura.
  • erase: un recuadro en píxeles de página en pages/page-KEY.jpg, para marcas dentro del bloque de texto que te pidieron eliminar. "mode": "all" blanquea el recuadro; "strokes" elimina solo trazos altos.

Pregunta al usuario antes de eliminar lo que pueda querer conservar. Esto cubre subrayados a bolígrafo y notas entre líneas dentro del texto, y rotuladores. Por defecto: elimina notas marginales, conserva subrayados dentro del texto. Pregunta también cuando no puedas distinguir impresión de bolígrafo. Muestra la ficha, no la describas.

7. Finalizar

$PY finish.py TRABAJO SALIDA.pdf           # --no-frame mantiene el encuadre propio de cada página; --dpi 300 por defecto

Qué hace:

  • Blanquea todo lo que está fuera del bloque de texto excepto los elementos conservados.
  • Elimina los corchetes finos de bolígrafo que abrazan los lados del bloque.
  • Encuadra cada página en un tamaño de página único:
    • El texto sale a un tamaño: las fotos tomadas más cerca o más lejos coinciden. El escalado usa el ancho del bloque de texto, o la inclinación de línea donde una figura estrecha la columna.
    • Los márgenes laterales son iguales, por lo que el contenido que estaba contra un borde o descentrado por el grosor del libro queda centrado.
    • Cada página comienza con el mismo margen superior.

Lee TRABAJO/sheets/final-NN.jpg antes de entregar. Revisa cada página en busca de manchas residuales, texto cortado y cualquier cosa que hayas conservado por error. Luego dale al usuario la ruta del PDF. Guarda el PDF junto a la entrada (por ejemplo <nombre>_clean.pdf) a menos que diga lo contrario.

Cómo se ve un buen resultado

  • Líneas de texto rectas y niveladas de borde a borde, incluida la línea más cercana al lomo.
  • Papel blanco puro y tipo sólido negro, con trazos finos intactos. Los dibujos grandes y oscuros mantienen su relleno.
  • Sin dedos, sombras, fragmentos de página vecina ni motas. Márgenes laterales iguales, y el mismo tamaño de texto en cada página.

Notas de uso real

  • El corrector lee texto, por lo que funciona mejor en páginas llenas de líneas justificadas. Funciona para cualquier escritura, incluida la de derecha a izquierda (hebreo, árabe), porque solo mira las formas de las líneas.
  • Las líneas cortas dentro de dibujos (etiquetas) se ignoran al ajustar la curvatura, por lo que las figuras no doblan la página.
  • Un dibujo oscuro que ocupa gran parte de una página se deslavaría a gris con un tonificado ingenuo. tone() mantiene la estimación del papel baja desde el papel circundante.
  • Cuando la curvatura de una página se traga unas letras en el lomo, la foto no tiene nada que recuperar. Dilo y no inventes texto.
  • Artículos a dos columnas: el bloque abarca ambas columnas. Revisa la hoja de revisión para líneas ajustadas a través del pliegue.

Skills relacionados