Un desarrollador ha creado una solución innovadora para uno de los problemas más comunes entre lectores digitales: la imposibilidad de utilizar modo oscuro en documentos PDF sin que las imágenes se distorsionen o se vuelvan ilegibles. Veil, una herramienta que funciona completamente en el navegador, promete resolver este conflicto mediante una arquitectura técnica sofisticada basada en tres capas de procesamiento.
La necesidad detrás de este desarrollo surge de una experiencia personal. El creador, Simone Amico, se encontraba estudiando en una fábrica utilizando materiales de aprendizaje que contenían gráficos e imágenes. Los lectores de modo oscuro disponibles en ese momento hacían que estas imágenes se distorsionaran completamente, obligándole a mantener el archivo original abierto en multitarea para poder consultar correctamente los contenidos visuales.
La solución implementada demuestra una comprensión profunda de cómo funcionan los PDFs a nivel técnico. La primera capa utiliza filtros CSS, específicamente invert(0.86) con una rotación de matiz de 180 grados, aplicados al lienzo principal. La elección del valor 0.86 en lugar de 1.0 es deliberada: la inversión completa produce un negro y blanco demasiado agresivos para la lectura prolongada, mientras que 0.86 genera un gris oscuro suave (aproximadamente #242424) y un blanco atenuado (alrededor de #DBDBDB) que resulta más cómodo para sesiones de lectura extendidas.
La protección de imágenes constituye la segunda capa. Utilizando la API pública de PDF.js, la herramienta recorre la lista de operadores del documento y reconstruye la pila CTM (matriz de transformación actual), que contiene las operaciones de guardado, restauración y transformación que el PDF utiliza para posicionar cada objeto en la página. Cuando detecta un paintImageXObject, obtiene los límites exactos de la imagen mediante la matriz de transformación actual y copia esos píxeles desde una representación limpia hacia una capa superpuesta. Esta aproximación evitó la necesidad de bifurcar PDF.js, lo que habría convertido el mantenimiento en una pesadilla dada la complejidad del código base y sus actualizaciones frecuentes.
La tercera capa aborda un problema particular: ¿qué sucede cuando la página ya es oscura? Las portadas de capítulos con fondo negro y texto blanco se invertirían en algo cegador. Para resolverlo, la herramienta mide el brillo del fondo muestreando los bordes y esquinas de la página tras renderizar. Utiliza la fórmula BT.601 para calcular el brillo percibido ponderando los canales de color según cómo los ve el ojo humano: verde al 58,7%, rojo al 29,9% y azul al 11,4%. Si la luminancia promedio cae por debajo del 40%, la página se marca como ya oscura y se omite la inversión. Esta ponderación refleja la biología evolutiva: el ojo humano evolucionó en entornos naturales donde distinguir matices de verde (vegetación, depredadores en la hierba) era cuestión de supervivencia.
Una característica adicional incluye la detección automática de documentos escaneados, que reciben tratamiento OCR a través de Tesseract.js, haciendo que el texto contenido en gráficos e imágenes sea seleccionable y copiable incluso en PDFs que son esencialmente imágenes.
Todo funciona localmente sin dependencias de frameworks externos, únicamente con JavaScript vanilla. Esta arquitectura permite que Veil sea instalable como una aplicación web progresiva (PWA) que funciona sin conexión a internet. Los enlaces internos y externos permanecen intactos, y la herramienta permite exportar el PDF en modo oscuro para visualizarlo en el lector preferido del usuario en cualquier dispositivo, evitando así el bloqueo de plataforma.
El desarrollador reconoce que el verdadero valor de esta herramienta será determinado por su adopción futura, pero anticipa que podría ser especialmente útil para investigadores y estudiantes que trabajan con documentos que combinan texto denso con contenido visual complejo. La disponibilidad del código fuente en repositorios públicos permite que otros desarrolladores contribuyan mejoras o adaptaciones.