OCR Universal Inteligente · V3

Aplicación independiente de EGGO y Bellum. Entrega local, sin publicación ni conexión a sistemas existentes.

Abre la aplicación mediante un servidor web. No abras index.html con doble clic: los motores y módulos necesitan HTTP o HTTPS. La carpeta public contiene el sitio; private contiene la configuración y el esquema SQL y debe permanecer fuera de la carpeta pública.

Qué incluye

Probar sin hosting

El paquete ya incluye los motores, modelos de idioma y dependencias del navegador en public/vendor. No necesita servicios OCR de pago ni CDN.

cd ocr-universal
node scripts/preview.mjs

Abre http://127.0.0.1:8787. Esta vista previa sirve el OCR, pero no ejecuta PHP; Mi cuenta indicará que falta el backend.

Para desarrollo reproducible, usa Node.js 22 o posterior y pnpm 11; ejecuta pnpm install --frozen-lockfile, node scripts/assets.mjs y pnpm test. Las pruebas usan Chrome instalado; se puede indicar otra ruta con CHROME_PATH. El postinstall de Tesseract (mensaje de patrocinio) está deshabilitado; no hace falta para OCR.

Instalación en Hostinger Business

  1. Crea un subdominio y una base de datos exclusivos del OCR. No reutilices las carpetas o tablas de otros sistemas. La publicación requiere autorización del propietario.
  2. En hPanel selecciona PHP 8.3 o posterior y verifica PDO con pdo_mysql, sesiones, JSON y HTTPS. Usa MySQL 8 o MariaDB 10.6 o posterior. El OCR no requiere Node.js, Python ni procesos persistentes en Hostinger.
  3. Sube el contenido de public a la carpeta pública del subdominio, por ejemplo /domains/ocr.ejemplo.com/public_html/. Incluye .htaccess y vendor completos; activa la vista de archivos ocultos.
  4. Coloca private junto a public_html: /domains/ocr.ejemplo.com/private/. La ruta desde api.php debe ser dirname(__DIR__).'/private/config.php'. Si tu estructura es diferente, adapta solo esa ruta. Nunca pongas credenciales en JavaScript.
  5. Importa private/schema.sql desde phpMyAdmin a la base nueva y vacía. No es una migración para bases existentes.
  6. Copia private/config.example.php como private/config.php. Introduce host, nombre de base, usuario y contraseña reales de hPanel; no publiques este archivo. Conserva secure_cookie=true. El usuario MySQL debe tener acceso únicamente a esa base.
  7. Activa el certificado SSL y la redirección HTTPS del subdominio en hPanel. Verifica que una solicitud HTTP redirija a HTTPS antes de probar cuentas. No confíes en cookies de sesión por HTTP.
  8. Prueba un documento ficticio, las tres exportaciones, registro, acceso con contraseña incorrecta, cierre de sesión y rechazo de CSRF. Verifica que /private/config.php no sea accesible y que los directorios no tengan listado.
  9. Confirma las cabeceras CSP, X-Frame-Options, Referrer-Policy y nosniff. La configuración Apache/LiteSpeed está en .htaccess; si otro servidor las ignora, configúralas en su panel.

No hay secretos ni cuenta administradora predeterminada en la entrega. Puedes desactivar nuevos registros con allow_registration=false después de crear las cuentas necesarias. La aplicación no incluye envío de correo, recuperación de contraseña ni verificación de correo; su incorporación requiere definir un servicio de correo. No ofrece roles ni almacenamiento compartido.

Uso diario

  1. Añade documentos. Selecciona uno desde la lista o el selector de revisión.
  2. Prepara cada documento: deja el rango vacío para todas las páginas o escribe 1,3-5. Elige giro y mejora de imagen y revisa su vista previa. Los ajustes son independientes para cada documento.
  3. Elige idioma y pulsa Extraer texto. Por defecto se reutiliza el texto PDF cuando hay al menos ocho letras y la página no está girada; las demás páginas usan OCR. Marca Forzar OCR para un PDF con una capa incompleta o incorrecta.
  4. Selecciona cada página terminada (✓), corrige el texto o usa Restaurar texto extraído. El porcentaje solo se muestra para OCR; el texto nativo se identifica como Texto del PDF.
  5. Selecciona Lote combinado, Documento seleccionado o ZIP. El ZIP contiene un archivo por documento con páginas terminadas; los nombres incluyen un índice para evitar colisiones.
  6. Elige texto editable o imagen fiel para DOCX. La opción de imagen fiel mantiene la apariencia, pero su texto no es editable y no refleja correcciones. TXT, DOCX editable y PDF buscable sí incorporan tus correcciones.
  7. Puedes cancelar y luego reanudar con Extraer texto. Las páginas terminadas no se duplican ni pierden correcciones. Cambiar páginas, giro o mejora descarta los resultados de ese documento; cambiar idioma o Forzar OCR descarta todos los resultados para permitir el reprocesamiento.
  8. Quita un documento o borra todo al terminar. Exporta antes de cerrar o recargar: no hay guardado automático.

Límites y precisión

ControlValor
Archivos10 por lote, 20 MB por archivo, 80 MB acumulados
Páginas reconocidas30 páginas seleccionadas entre todos los documentos; puedes elegir un subconjunto de un PDF mayor
Imagen16 megapíxeles; imágenes mayores se rechazan. Los PDF se renderizan a hasta 2×, reduciendo si es necesario.
Autenticación10 intentos por IP por ventana de 15 minutos; sesión inactiva 30 minutos

El OCR admite texto impreso. Manuscritos, tablas complejas, sellos, fotos desenfocadas y columnas pueden perder estructura o precisión. No interpreta jurídicamente el documento. Conviene escanear recto, con buena iluminación y texto de al menos 200–300 DPI. PDF con contraseña o corruptos muestran error; no hay desbloqueo ni eliminación de restricciones. Un PDF con más de 30 páginas se puede procesar por subconjuntos de hasta 30 páginas seleccionadas. La detección de texto nativo es una heurística: si solo lee un sello o una marca de agua, activa Forzar OCR.

El PDF exportado rasteriza el original. No conserva firmas digitales, formularios, enlaces ni metadatos del PDF de entrada. La capa buscable se posiciona por líneas. Si mantienes el número de líneas al corregir, conserva sus cajas; si añades o quitas líneas, redistribuye la capa dentro de la página. No garantiza alineación exacta por palabra. DOCX editable conserva líneas, sangrías aproximadas y tablas separadas por tabulaciones; no reconstruye exactamente fuentes, columnas ni tablas complejas. DOCX de imagen mantiene el aspecto del documento preparado. La fuente incluida cubre el alfabeto latino para español/inglés; otros alfabetos no forman parte de esta V3.

Privacidad y seguridad

Archivos, imágenes y texto se mantienen en memoria de la pestaña. No se guardan en localStorage, IndexedDB, base de datos ni historial. Se usa cacheMethod=none para el modelo OCR. Las descargas se guardan donde indique el navegador y permanecen allí hasta que el usuario las elimine. Borrar el lote libera referencias, pero no garantiza borrado forense de la memoria o del disco del sistema.

No hay telemetría, publicidad ni CDN. Todo el material del navegador se sirve desde el propio sitio. El servidor puede registrar IP y solicitudes en los logs normales del hosting, aunque nunca recibe el contenido OCR. MySQL almacena correo, hash de contraseña y contadores temporales de acceso; las contraseñas no se guardan en texto plano. Los contadores vencidos se eliminan durante nuevos intentos.

La API usa PDO preparado, cookies HttpOnly/SameSite Strict, protección CSRF, regeneración de identificador de sesión y límites de solicitudes. El límite de contraseña es 72 bytes UTF-8 para evitar truncamiento de bcrypt. No hay endpoints para subir archivos. La cuenta es opcional y no restringe el procesamiento local. Si se necesita un portal cerrado, esa política deberá implementarse en servidor para las páginas públicas.

Para eliminar una cuenta, el administrador puede borrar su fila de users mediante phpMyAdmin. Conserva copias de seguridad de la base y configura su retención conforme a tu política. No incluyas documentos reales en capturas, pruebas ni soporte.

Arquitectura y mantenimiento

Navegador → PDF.js / decodificador de imagen → canvas
          → Tesseract.js + WASM + spa/eng locales
          → editor en memoria → TXT / DOCX / PDF-lib + fuente

Mi cuenta → api.php → sesiones PHP + PDO → MySQL
           (solo identidad y límites; sin documentos)

public/core.mjs centraliza límites, rangos, nombres y disposición; image.mjs aplica giro y mejoras; exports.mjs genera TXT, DOCX y PDF; app.mjs coordina documentos, OCR y UI; api.php expone session, register, login y logout. private/schema.sql crea exclusivamente users y auth_limits. Las versiones están fijadas en package.json y pnpm-lock.yaml. Mantén PHP y dependencias actualizados y vuelve a ejecutar las pruebas antes de sustituir vendor. Conserva LICENSES al redistribuir.

Costos y requisitos

OCR, modelos y exportaciones se ejecutan localmente sin costo por página ni clave de API. El costo de hosting, dominio, copias de seguridad y mantenimiento depende de tu contrato de Hostinger; no se ha contratado ni modificado ningún servicio. El navegador consume CPU/RAM del dispositivo y descarga aproximadamente 74 MB de recursos disponibles, solo parte de ellos según el motor seleccionado. En teléfonos usa lotes pequeños.

Referencias oficiales: PHP en Hostinger, MySQL en hPanel, Tesseract.js, PDF.js, PDF-lib.

Verificación de instalación

El paquete HOSTINGER incluye public_html, private y scripts. Sube public_html a la raíz pública del subdominio y coloca private como carpeta hermana. No subas el ZIP completo ni la carpeta de código fuente a public_html.

Si tienes SSH, coloca scripts fuera de public_html y ejecuta php scripts/check-hosting.php /ruta/al/directorio/del/subdominio. Comprueba PHP, extensiones, configuración, conexión, tablas y archivos de motores, sin mostrar contraseñas. La configuración incompleta devuelve código 1. El comprobador solo funciona por consola; no es un instalador web.

Antes de habilitar acceso: comprueba HTTPS, sesión, exportaciones, rutas privadas inaccesibles y que el navegador no envía documentos a la red. La API rechaza el acceso sin HTTPS cuando secure_cookie=true. No se ha publicado esta entrega.

Diagnóstico