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.
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.
/domains/ocr.ejemplo.com/public_html/. Incluye .htaccess y vendor completos; activa la vista de archivos ocultos./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.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.
| Control | Valor |
|---|---|
| Archivos | 10 por lote, 20 MB por archivo, 80 MB acumulados |
| Páginas reconocidas | 30 páginas seleccionadas entre todos los documentos; puedes elegir un subconjunto de un PDF mayor |
| Imagen | 16 megapíxeles; imágenes mayores se rechazan. Los PDF se renderizan a hasta 2×, reduciendo si es necesario. |
| Autenticación | 10 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.
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.
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.
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.
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.