Leer documentos sin conexión, cuando el escaneo no se puede subir
Informe médico, contrato, expediente de personal. Diez pasos hacia un reconocimiento de texto que se queda en tu ordenador, incluida la diferencia entre una herramienta que lee mal caracteres y otra que se inventa hechos enteros.
Sobre tu mesa hay un montón de documentos escaneados y tienes que hacer algo con ellos. Ordenar las facturas del último trimestre, sacar los plazos de preaviso de cuarenta contratos, hacer que un expediente de personal se pueda buscar. El movimiento obvio sería subir el montón a un servicio en la nube. Con exactamente este tipo de material, ese suele ser el movimiento que no puedes hacer.
Este playbook enseña el camino que funciona sin subir nada. Empieza con una distinción que casi nadie explica y que decide todo lo demás: hay dos herramientas completamente distintas para lo que desde fuera parece una sola tarea. Las dos cometen errores, pero cometen errores completamente distintos, y quien no los separa acaba comprobando el sitio equivocado.
Una cosa por delante, porque si no se pierde: que las herramientas calculen en local todavía no mantiene los archivos en casa. La carpeta en la que están y el programa que abres para la tarea también cuentan. Las dos cosas están en el paso 10.
1. Separa primero las dos tareas
Leer un documento se divide en dos pasos, y para cada uno hay su propio tipo de herramienta.
El primer paso es reconocer caracteres. Una imagen de papel se convierte en texto. De eso se encarga el reconocimiento de texto, en inglés OCR. No entiende nada de lo que lee, asocia formas con letras. De ahí viene su carácter particular: no razona. No deduce una cláusula que no esté en el papel, ni calcula una partida de factura. Eso no lo hace infalible. Puede leer mal caracteres y palabras enteras, omitirlas o añadirlas, y puede dividir mal la página, de manera que un importe acabe en la columna equivocada. Un 3 se convierte en un 8, una I mayúscula en un 1, y ahí se queda, sin llamar la atención, en medio de la línea. Tesseract puede dar un valor de confianza para cada palabra. Lo que con eso no te da es una tasa de error: esa solo la obtienes comparando la salida con una transcripción que hayas revisado a mano.
El segundo paso es entender. Qué clase de documento es este, dónde está el plazo de preaviso, qué importe es el total y cuál el IVA. De eso se encarga un modelo de lenguaje. Es bastante más listo y falla de otra manera: alucina en el plano del significado. Ante un importe apenas legible no devuelve caracteres ilegibles, sino una cifra que encaja en el contexto y, llegado el caso, toda una justificación.
Así que la diferencia no es "sin errores frente a propenso a errores", sino el tipo de error. El reconocimiento de texto se equivoca al leer, y lo que sale de ahí lo puedes comparar con el papel. El modelo de lenguaje se equivoca al interpretar, y lo que sale de ahí se lee como si fuera el resultado.
Consejo: Esta única distinción es la razón de ser de todo este playbook. Para cualquier cosa en la que un dígito equivocado salga caro, quieres poder ver el paso que leyó la cifra. Y aun así quieres comprobar cada cifra relevante para una decisión contra el original.
2. Comprueba si realmente necesitas reconocimiento de texto
Antes de instalar nada, abre el PDF e intenta seleccionar una frase con el ratón. Si se puede seleccionar y copiar, el PDF tiene una capa de texto y quizá no necesites reconocimiento de texto. Solo necesitas una herramienta que extraiga ese texto.
Cuidado aquí, esta es la trampa: que el texto se pueda seleccionar demuestra que existe una capa de texto, no que sea correcta. Un documento escaneado puede consistir en la imagen de la página más una capa de texto invisible y defectuosa que alguien puso debajo en algún momento. Esos PDF con búsqueda los produce el propio Tesseract. Así que copia un párrafo una vez y compáralo con lo que se ve en la página. Si coincide, la capa sirve. Si no coincide, trata el archivo como un escaneo.
Un punto que muchas guías se saltan en silencio: Tesseract no lee PDF. Su entrada son archivos de imagen, es decir TIFF, PNG, JPEG y parientes. Para los PDF escaneados necesitas por tanto un paso intermedio.
El camino cómodo es OCRmyPDF. Da ese rodeo internamente y te devuelve al final un PDF con búsqueda. Con un archivo que tenga una capa de texto defectuosa, el caso de antes, se detiene por sí mismo, y lo hace con PriorOcrFoundError: page already has text!. Para eso hay un interruptor propio:
ocrmypdf --redo-ocr -l deu scan.pdf scan-nuevo.pdf
--redo-ocr busca la capa de texto oculta, la tira y vuelve a leer, sin rasterizar la página. Existe además --force-ocr, que convierte cada página en imagen y luego la lee. Ese es el mazo para los casos en los que --redo-ocr no consigue pasar, y te cuesta texto vectorial real y calidad de imagen. Conserva el archivo original en los dos casos.
El otro camino es renderizar tú mismo las páginas a imágenes, si quieres seguir directamente con Tesseract. Aquí hay una trampa incorporada que si no te cuesta diez minutos:
pdftoppm -r 300 -png scan.pdf pagina
pdftoppm forma parte de las herramientas Poppler. Las dos opciones hacen falta, porque sin -png escribe archivos PPM y sin -r renderiza a 150 puntos por pulgada, la mitad de lo que el paso 6 da como mínimo. Para TIFF usa -tiff en lugar de -png. Y ahora la trampa: cómo se llamen los archivos al final depende de cuántas páginas tenga el PDF. Con dos páginas obtienes pagina-1.png, con doce páginas pagina-01.png, porque Poppler rellena el número hasta el ancho del total. Un nombre de archivo escrito a mano falla por tanto en uno de cada dos montones. O trabajas con un patrón como pagina-*.png, o te traes exactamente una página con un nombre que conozcas para una prueba suelta:
pdftoppm -f 1 -l 1 -singlefile -r 300 -png scan.pdf pagina-1
Ten en cuenta además que aquí se rasteriza en cualquier caso: una página de texto se convierte en imagen, y la letra fina pierde por el camino.
Consejo: Un montón mezclado es lo normal. Sepáralo una vez en "tiene texto aprovechable" y "es imagen" antes de empezar. El primer montón se despacha en minutos.
3. Coge Tesseract para el reconocimiento de caracteres
El estándar abierto establecido se llama Tesseract. Se mantiene en GitHub bajo tesseract-ocr/tesseract, está bajo licencia Apache 2.0 y funciona por completo en tu ordenador, sin enviar nada a ninguna parte.
Hay datos de idioma preentrenados para bastante más de cien idiomas. Eso no significa que tengas ninguno instalado: el motor y los datos de idioma son dos partes separadas, y según el paquete recibes varios idiomas, solo inglés o ninguno. Lo que hay realmente en tu ordenador te lo dice tesseract --list-langs.
Apache 2.0, como MIT, es una de las licencias sin complicaciones. Puedes trabajar con ella comercialmente e integrarla en tus propios procesos, y para el uso interno sin más no te pide nada. Las obligaciones aparecen solo cuando distribuyes tú: entonces adjuntas una copia de la licencia, dejas en su sitio los avisos existentes, marcas los archivos modificados, y un archivo NOTICE lo pasas solo si la obra trae uno. Y la licencia, de todas formas, solo dice qué puedes hacer con el software. Si puedes tratar con él esos documentos concretos en un despacho o una consulta es otra cuestión, y la responden la protección de datos, la normativa profesional y vuestras aprobaciones internas, no Apache 2.0.
Consejo: Si no quieres trabajar en la terminal, busca una interfaz gráfica que lleve Tesseract dentro. Hay varias, y te ahorran el montaje de los comandos.
4. Instala el paquete de idioma alemán, o te faltará
El tropiezo más frecuente justo después de la instalación: a menudo solo está el inglés. Con un documento en alemán obtienes entonces un resultado que parece escrito con el codo, y concluyes que la herramienta es mala.
Los archivos de idioma van aparte y se llaman traineddata. Para el alemán necesitas deu. En Debian y Ubuntu el paquete se llama tesseract-ocr-deu, y las tres herramientas de este playbook juntas son tesseract-ocr, tesseract-ocr-deu, poppler-utils y ocrmypdf. Los archivos de idioma oficiales se mantienen en el repositorio tesseract-ocr/tessdata, también bajo Apache 2.0, y se entrenaron en Google.
Si el alemán está de verdad ahí lo responde un solo comando, y deberías ejecutarlo antes de probar cualquier otra cosa:
tesseract --list-langs
Si deu no aparece en la lista, falta el paquete, y cualquier llamada con -l deu aborta con Failed loading language 'deu'. Lo mismo vale para OCRmyPDF: -l deu exige ese mismo archivo de idioma instalado.
Y ahora el punto en el que se queda atascada la mayoría: instalar por sí solo no cambia nada. Sin indicación, Tesseract coge eng, sea lo que sea lo demás que haya en tu ordenador. El idioma va en la llamada:
tesseract pagina-1.png stdout -l deu
stdout escribe el resultado en la terminal. Si en su lugar das un nombre, eso no es un sitio al lado de la imagen sino una ruta de salida, y una ruta relativa acaba en la carpeta en la que estés en ese momento. Eso es más que orden: el escaneo puede estar en tu carpeta de trabajo protegida y el texto extraído acabar igualmente en tu directorio personal o en una carpeta sincronizada. Escribe por eso la ruta de destino, por ejemplo tesseract pagina-1.png /trabajo/escaneos/pagina-1 -l deu.
Para un documento con una parte en alemán y otra en inglés añades el segundo idioma con un más, es decir -l deu+eng.
Consejo: Carga solo lo que aparezca de verdad en el papel. La selección y su orden cambian tanto el tiempo de proceso como el resultado, y si un idioma adicional te ayuda o te perjudica solo se ve con tu propio material. Pruébalo en cinco páginas en vez de seguir una regla fija.
5. Elige el conjunto de datos adecuado, hay tres
Aquí hay un ajuste que mucha gente no encuentra nunca. De los archivos de idioma existen tres conjuntos oficiales con prioridades distintas.
tessdata_fast es el más rápido y el menos preciso. tessdata está en medio y además es compatible con el motor de reconocimiento antiguo. tessdata_best es el más lento y el más preciso, y es el único conjunto que sirve como base para reentrenar por tu cuenta.
Para un montón que dejas correr una noche entera, coge tessdata_best. La velocidad da igual entonces, y cada error que te ahorras es trabajo de corrección menos por la mañana.
Aquí vale lo mismo: saber que existe no basta. Lo que te haya traído tu gestor de paquetes sigue en uso hasta que apuntes expresamente a otro sitio. Descarga el deu.traineddata que quieras del repositorio tessdata_best a una carpeta propia e indícala en la llamada:
tesseract pagina-1.png stdout -l deu --tessdata-dir ./tessdata_best
Un detalle sobre esto que muerde en el día a día: --tessdata-dir no se superpone a tu instalación del sistema, la sustituye. Tesseract busca entonces exclusivamente en esa carpeta. Así que quien haya aprendido arriba lo de -l deu+eng y aquí meta solo deu.traineddata se lleva un Failed loading language 'eng' y un aborto. Todos los idiomas que pidas tienen que estar en la misma carpeta, y comprobarlo puedes con tesseract --list-langs --tessdata-dir ./tessdata_best.
Consejo: La mayoría de guías de internet no mencionan esta distinción y acabas con el conjunto estándar. Si tus resultados están justo por debajo de lo aprovechable, cambiar a tessdata_best es lo primero que hay que probar antes de abandonar la herramienta.
6. El original decide más que el ajuste
El reconocimiento de texto es implacable con los escaneos malos, y ningún conjunto de datos lo compensa. Una hoja metida torcida, una sombra en el centro, una foto hecha con el móvil en diagonal desde arriba: todo eso cuesta más precisión de la que cualquier ajuste puede recuperar.
Escanea recto, con resolución suficiente y en escala de grises en vez de en color. Como regla de oro de la práctica del escaneo valen 300 puntos por pulgada para texto corrido normal, y más para letra muy pequeña. Quien fotografía papel lo deja plano y sostiene la cámara paralela por encima.
Consejo: Si un documento suelto no hay manera de que se reconozca mientras el resto del montón funciona, casi siempre es el original y casi nunca el ajuste. Vuelve a escanear esa hoja en vez de tocar los parámetros.
7. Para documentos antiguos hay un archivo de idioma propio
Un detalle que en el ámbito germanohablante hace falta sorprendentemente a menudo: todo lo impreso antes de mediados del siglo veinte está muchas veces en Fraktur, y el archivo de idioma alemán normal fracasa ahí de forma fiable. Para eso hay un archivo propio, y se llama deu_latf.
Fíjate aquí en el nombre, porque en internet casi en todas partes sigue apareciendo el antiguo. El archivo se llamaba antes frk, se renombró porque ese código nunca cumplió la norma ISO, y el nombre antiguo está declarado obsoleto de forma expresa. En los conjuntos actuales, tessdata_best incluido, está deu_latf.traineddata. Así que quien siga una guía de 2019 y pida frk se lleva, en el peor caso, un error por datos de idioma que faltan y los busca en el sitio equivocado.
La diferencia es la que va de "ilegible" a "aprovechable" en extractos del registro de la propiedad, escrituras antiguas, libros parroquiales y archivos de empresa. Quien haya hecho genealogía alguna vez o haya digitalizado un expediente de los años treinta conoce el problema.
Consejo: Tampoco esperes resultados limpios de deu_latf en los pasajes manuscritos. La escritura a mano es otra disciplina, y Tesseract está hecho para la imprenta.
8. Solo cuando hace falta entender entra un modelo de lenguaje
Ahora tienes texto, pero todavía ninguna respuesta a "qué contratos vencen en marzo". Para eso necesitas el segundo paso, y ese le corresponde a un modelo de lenguaje local.
Para el camino de este playbook basta con un modelo de solo texto. Recibe el texto que ha leído Tesseract y no tiene que ver el papel en ningún momento. Ese es el caso normal y la variante más suave, porque un modelo de texto todavía funciona con un equipo modesto. Qué tamaño encaja con tu ordenador lo aclara Qué modelo local encaja con tu hardware.
Los modelos con comprensión de imagen, reconocibles porque se marcan como variante vision o por las siglas VL en el nombre, son otro camino: reciben la imagen de la página directamente y hacen la lectura y la comprensión de una sola vez. Eso puede ser práctico en formularios y tablas, donde la disposición sobre la página tiene significado. Cuesta bastante más memoria, y anula la separación del paso uno. Qué familias y tamaños hay ahora mismo cambia rápido, y por eso aquí no hay a propósito ninguna recomendación que dentro de tres meses sería falsa.
Consejo: Empieza con el modelo de texto. El camino de la imagen lo tomas solo cuando notes que la versión de texto puro pierde la estructura de la página, y entonces a propósito y para ese tipo concreto de documento.
9. Combina ambas cosas en el orden correcto
El proceso más seguro para todo aquello en lo que cuentan las cifras es este. Tesseract lee los caracteres. El texto así obtenido va al modelo de lenguaje, no la imagen. El modelo ordena, resume y responde preguntas, pero no lee los importes del papel él mismo.
La razón es el reparto de tareas del paso uno. Si le das la imagen al modelo, hace las dos cosas de una vez, y después ya no puedes distinguir si una cifra se leyó o se completó. Si separas los pasos, tienes un resultado intermedio que puedes mirar.
Los valores de confianza, eso sí, no vienen de regalo. Las llamadas de arriba entregan texto puro y nada más. Si quieres ver lo segura que estaba la lectura palabra por palabra, pide la salida en tabla:
tesseract pagina-1.png stdout -l deu tsv
Eso da una tabla con una columna conf y la palabra reconocida al lado. Los valores bajos te enseñan dónde mirar primero.
Consejo: Usa los valores de confianza como ayuda para ordenar, no como salvoconducto. Un valor alto significa que el reconocimiento estaba seguro, no que tuviera razón.
10. Automatiza el proceso y piensa en la supresión
Una carpeta a la que van los escaneos, un pequeño script que recorre todo lo que hay dentro y deja los archivos de texto al lado. Con eso el experimento se convierte en una rutina que seguirás usando dentro de seis meses.
Antes de fiarte, haz pasar diez documentos y compara a mano los datos extraídos con el original. Eso es un piloto, no una validación. Si sacas diez de cuarenta documentos al azar y exactamente uno de ellos está mal, lo pillas con una probabilidad de uno entre cuatro. Como comprobación eso no vale nada, como primera impresión sirve, y quien en su lugar coja "los diez primeros" o "unos cuantos típicos" ni siquiera tiene esa cifra. Para el uso real vale por tanto la regla más dura: cada cifra y cada plazo sobre los que tomes una decisión se ven en el original. El proceso te ahorra teclear, no comprobar.
Y ahora la parte de la que depende la promesa de este playbook. Que una herramienta calcule en local no significa que el archivo se quede en local.
La carpeta es la primera cuestión. El escritorio y Documentos los respalda OneDrive en Windows e iCloud Drive en macOS, en ambos casos cuando la función está activada, y a menudo lo está sin que nadie la haya puesto conscientemente. Un escaneo que caiga ahí se va con la siguiente sincronización. Crea por eso la carpeta de trabajo fuera de las zonas sincronizadas y mira en los ajustes de OneDrive, iCloud y Dropbox qué se está respaldando de verdad. Acuérdate del programa de copias de seguridad que corre en segundo plano, y de los archivos intermedios que hay entre el escaneo y el archivo de texto.
El programa es la segunda. Una interfaz gráfica con Tesseract dentro puede igualmente buscar actualizaciones, enviar datos de uso u ofrecer funciones concretas a través de un servicio. Desconecta el ordenador de la red una vez y deja pasar un montón. Si sale texto, sabes que el proceso no necesita conexión. Eso es una prueba de funcionamiento, no una demostración: un programa también puede retener un envío y recuperarlo la próxima vez que se conecte. Si de verdad importa, bloquea el programa de forma permanente para las conexiones salientes o mantén todo el proceso desconectado.
Que los documentos no salgan de tu ordenador es una ventaja real, porque desaparece la comunicación a un tercero. No hace que el tratamiento sea automáticamente lícito. Sigues tratando datos personales y sigues necesitando una base jurídica y plazos de supresión, y deberías comprobar si el tratamiento tiene que entrar en vuestro registro de actividades de tratamiento. En expedientes de personal y datos de salud ese es el caso normal, y se añaden más requisitos.
Consejo: Mete el plazo de supresión en el proceso desde el principio, y para todo lo que se genere en él: escaneos, archivos de texto, imágenes intermedias renderizadas, archivos temporales. Una carpeta con escaneos de documentos de identidad que ya no necesita nadie y que todos han olvidado es exactamente el tipo de herencia que se vuelve incómoda en una inspección. La separación limpia entre "se queda en casa" y "por eso está permitido" está en IA local y el RGPD.
Qué sigue
El gemelo de este playbook es Transcribir conversaciones sin conexión, es decir la misma idea para sonido en vez de papel. Si todavía no tienes ningún modelo local funcionando, empieza por Tu primer modelo de IA local en 30 minutos. Cómo procesan imágenes los modelos de nube y por qué allí funciona mejor un recorte ajustado que una captura en 4K lo explica Por qué encoge tu captura de pantalla. Y para el análisis de las cifras obtenidas, Analizar números y tablas con IA sigue el hilo.
Fuentes
Los datos de licencia, idiomas y conjuntos de datos proceden de la documentación oficial de Tesseract, a fecha de agosto de 2026. La recomendación de resolución es una regla de oro de la práctica del escaneo y no una indicación del proyecto.
- Tesseract, repositorio principal y licencia: https://github.com/tesseract-ocr/tesseract
- Tesseract, formatos de entrada admitidos: https://tesseract-ocr.github.io/tessdoc/InputFormats.html
- Tesseract, línea de comandos incluidos el valor de confianza y el PDF con búsqueda: https://tesseract-ocr.github.io/tessdoc/Command-Line-Usage.html
- Tesseract, tasas de error del benchmark UNLV, medidas contra una transcripción de referencia revisada: https://tesseract-ocr.github.io/tessdoc/UNLV-Testing-of-Tesseract.html
- Tesseract, cómo se producen los errores de reconocimiento: https://tesseract-ocr.github.io/tessdoc/ImproveQuality.html
- tessdata, archivos de idioma oficiales: https://github.com/tesseract-ocr/tessdata
- Cambio de nombre de
frkadeu_latf: https://github.com/tesseract-ocr/tessdata_fast - Vista general de los tres conjuntos de datos y códigos de idioma: https://tesseract-ocr.github.io/tessdoc/Data-Files.html
- OCRmyPDF, sustituir una capa de texto existente: https://ocrmypdf.readthedocs.io/en/latest/cookbook.html
- pdftoppm, opciones de formato y resolución: https://manpages.debian.org/testing/poppler-utils/pdftoppm.1.en.html