Technical

Cómo funciona la edición de PDF en el navegador (y la privacidad)

LuraPDF procesa tus PDF por completo en el navegador, sin subir nunca tus archivos. Así funciona con pdf-lib, pdfjs-dist, Tesseract.js y WebAssembly.

LuraPDF Team
LuraPDF Team

Equipo Editorial y Técnico · 6 de mayo de 2026 · 11 min de lectura

Cada vez que subes un documento a una herramienta PDF en la nube, ese documento existe en servidores que no controlas, procesado por software que no puedes inspeccionar, almacenado por una empresa con su propia política de retención de datos y postura de seguridad. Por un breve tiempo, la infraestructura de otra persona tiene tus contratos, declaraciones de impuestos, historiales médicos o documentos comerciales confidenciales.

LuraPDF funciona de otra manera. Todo ocurre en la pestaña de tu navegador, en tu hardware, con la gestión de memoria de tu sistema operativo. Este artículo explica la arquitectura técnica que hace esto posible y las compensaciones de ingeniería involucradas.

El Navegador como Plataforma de Procesamiento de Documentos

Los navegadores modernos ya no son solo renderizadores de HTML. Son entornos de ejecución de aplicaciones completas con:

  • Motor JavaScript (V8 en Chrome, SpiderMonkey en Firefox): ejecuta código a velocidad casi nativa
  • WebAssembly (WASM): ejecuta código compilado en C/C++ a velocidad casi nativa dentro de un entorno en zona de pruebas
  • API Canvas: permite la manipulación de imágenes a nivel de píxel
  • API de Acceso al Sistema de Archivos: permite leer archivos locales sin necesidad de subirlos
  • Web Workers: ejecuta cómputo en hilos en segundo plano sin congelar la interfaz
  • ArrayBuffer / Blob: gestiona datos binarios sin procesar (como bytes de PDF) en memoria

Estas capacidades en conjunto permiten una cadena de procesamiento de documentos con todas las funciones que hace cinco años habría requerido un servidor backend.

Las Tres Bibliotecas Principales

LuraPDF está construido sobre tres bibliotecas de código abierto fundamentales:

pdf-lib

pdf-lib es una biblioteca de TypeScript para crear y modificar documentos PDF en cualquier entorno JavaScript. Implementa una parte sustancial de la especificación PDF (ISO 32000), incluyendo:

  • Creación, modificación y eliminación de páginas
  • Incrustación de fuentes (tanto las 14 fuentes estándar como fuentes TTF/OTF personalizadas)
  • Incrustación de imágenes (JPEG, PNG)
  • Colocación de anotaciones de texto
  • Creación y manipulación de campos de formulario
  • Metadatos del documento (título, autor, fecha de creación, etc.)
  • Protección del documento con contraseña
  • Gestión de tablas de referencias cruzadas

Cuando LuraPDF combina PDFs, utiliza pdf-lib para leer el árbol de páginas de cada documento, normalizar los recursos compartidos y ensamblar un nuevo PDF. Cuando comprime, recodifica los objetos de imagen con factores de calidad más bajos. Cuando protege un archivo con contraseña, deriva una clave a partir de tu contraseña y escribe un documento cifrado usando el Controlador de Seguridad Estándar de PDF, que todos los lectores entienden.

pdf-lib opera completamente sobre objetos ArrayBuffer — datos binarios sin procesar en la memoria del navegador. No se realizan llamadas de red.

pdfjs-dist

PDF.js es el motor de renderización de PDF de Mozilla, distribuido como pdfjs-dist en npm. Es el motor que impulsa el visor de PDF integrado de Firefox, probado con millones de PDFs del mundo real.

LuraPDF usa pdfjs-dist para:

  • Renderización de páginas: convertir páginas PDF en Canvas ImageData para mostrarlas
  • Extracción de texto: leer los flujos de contenido de texto de las páginas PDF
  • Metadatos de página: obtener dimensiones de página, valores de rotación y tipo de contenido

Cuando ves tu PDF renderizado en la interfaz de LuraPDF — la vista previa visual de las páginas — es pdfjs-dist renderizando cada página sobre un elemento HTML Canvas.

Tesseract.js

Tesseract.js es la versión compilada en WebAssembly de Tesseract OCR. Tesseract es un motor OCR de código abierto desarrollado originalmente por HP Labs (1985) y actualmente mantenido por Google. Usa un modelo de red neuronal LSTM (Long Short-Term Memory) para el reconocimiento de caracteres.

Ejecutar Tesseract a través de WebAssembly en el navegador significa:

  • El binario WASM de 22 MB se carga una vez y el navegador lo almacena en caché
  • El procesamiento OCR se ejecuta en CPU vía WebAssembly, no en GPU
  • El procesamiento es más lento que el OCR en la nube (que usa clústeres de GPU) pero produce la misma calidad de salida
  • El contenido de tu documento nunca sale de tu dispositivo

Para un escaneo de 20 páginas: el OCR en el navegador toma aproximadamente 30–120 segundos. Un servicio en la nube podría tardar 2–5 segundos. La compensación es privacidad versus velocidad.

La Arquitectura: Del Archivo al Resultado

Esto es lo que ocurre cuando, por ejemplo, comprimes un PDF en LuraPDF:

  1. Selección de archivo: arrastras un PDF a la zona de carga. La API de archivos del navegador lee el archivo en un ArrayBuffer — bytes sin procesar en la memoria del navegador. No se produce ninguna subida.

  2. Validación: una comprobación rápida de que los bytes mágicos %PDF aparecen al inicio del ArrayBuffer.

  3. Carga: el método PDFDocument.load() de pdf-lib analiza la tabla de referencias cruzadas, lee el árbol de objetos y construye una representación en memoria del documento.

  4. Enumeración de imágenes: la biblioteca recorre los flujos de contenido de las páginas para encontrar XObjects de imagen (imágenes incrustadas). Se extraen el ancho, la altura, el tipo de compresión y los datos en bytes de cada imagen.

  5. Recodificación: para cada imagen, los datos de píxeles sin procesar se dibujan sobre un elemento HTML Canvas y luego se exportan de nuevo con un factor de calidad JPEG más bajo usando canvas.toBlob('image/jpeg', quality). El objeto de imagen original se reemplaza con la versión codificada más pequeña.

  6. Serialización del documento: el método save() de pdf-lib serializa el documento modificado de vuelta a bytes. Los flujos de objetos se comprimen con DEFLATE.

  7. Descarga: los bytes se envuelven en un objeto Blob, se crea una URL de objeto temporal (URL.createObjectURL(blob)) y un clic programático en <a> activa el mecanismo de descarga del navegador.

Total de datos transmitidos a cualquier servidor externo: cero bytes.

Web Workers: Manteniendo la Interfaz Receptiva

El procesamiento de PDF es intensivo en CPU. Ejecutarlo en el hilo JavaScript principal congalaría la pestaña del navegador — no podrías desplazarte, hacer clic ni ver actualizaciones de progreso mientras el archivo se estuviera procesando.

LuraPDF ejecuta todo el cómputo pesado (OCR, análisis de PDF grandes, recodificación de imágenes) en Web Workers — hilos JavaScript separados que se ejecutan en segundo plano. El hilo principal gestiona la interfaz, muestra barras de progreso y se comunica con el worker mediante paso de mensajes (postMessage / onmessage).

Cuando se ejecuta el OCR, se dispara un evento de progreso después de procesar cada página. El worker envía { page: 5, total: 20, confidence: 94 } al hilo principal, que actualiza la barra de progreso. Tu interfaz permanece interactiva durante todo el proceso.

Gestión de Memoria

La memoria del navegador es finita. Un PDF de 200 MB cargado en memoria, procesado y guardado podría requerir 400–600 MB de RAM (bytes originales + datos Canvas intermedios + bytes de salida). En sistemas con RAM limitada, esto puede provocar presión de memoria.

Estrategias utilizadas:

  • Procesamiento de páginas en flujo: para operaciones de varias páginas, las páginas se procesan y los elementos Canvas intermedios se descartan tras su uso
  • URL.revokeObjectURL(): las URL de blob temporales se revocan después de la descarga para permitir la recolección de basura
  • Terminación de workers: los Web Workers se terminan después de completar su tarea para recuperar la memoria que usaron

Para archivos muy grandes (>100 MB), los navegadores modernos gestionan esto sin problemas en sistemas con 8+ GB de RAM. Los sistemas más antiguos o con memoria limitada pueden tener dificultades con archivos fuente de más de 100 MB.

La Arquitectura de Privacidad

El modelo de seguridad está reforzado por la política de mismo origen del navegador y su arquitectura de aislamiento:

  • Sin solicitudes HTTP: sin llamadas a API externas, sin telemetría, sin llamadas de análisis durante el procesamiento de documentos
  • Ejecución en zona de pruebas: los Web Workers no pueden hacer llamadas de red a orígenes externos
  • Sin almacenamiento persistente: los archivos procesados no se escriben en el almacenamiento del navegador (localStorage, IndexedDB ni Acceso al Sistema de Archivos)
  • Memoria de alcance de pestaña: cuando cierras la pestaña, todos los ArrayBuffers y objetos Blob asociados a ella son recolectados por el recolector de basura

Esta arquitectura es verificable: abre la pestaña Red en las DevTools del navegador mientras procesas un archivo. Verás cero solicitudes durante la operación de procesamiento.

Bibliotecas de Código Abierto: Inspeccionables, No Cajas Negras

Las tres bibliotecas principales — pdf-lib, pdfjs-dist y Tesseract.js — son de código abierto con repositorios públicos en GitHub. Las implementaciones pueden ser inspeccionadas por cualquier persona. El código de procesamiento de PDF que se ejecuta en LuraPDF no es una caja negra propietaria; es código público con usuarios reales, issues y contribuciones.

Esto importa para la confianza. Cuando un servicio en la nube dice "procesamos y eliminamos tus archivos," les estás tomando la palabra. Cuando LuraPDF usa bibliotecas de código abierto en una zona de pruebas del navegador sin llamadas de red, puedes verificar la afirmación observando la pestaña de red.

Compensaciones frente al Procesamiento en la Nube

El modelo basado en el navegador tiene compensaciones reales que vale la pena reconocer con honestidad:

Velocidad: los servicios en la nube tienen clústeres de GPU e infraestructura dedicada. El OCR en el navegador sobre un documento grande tarda entre 2 y 10 veces más que un equivalente en la nube. La compresión es rápida porque usa la API Canvas directamente.

Límites de tamaño de archivo: la memoria del navegador es la restricción. Los archivos muy grandes (>300 MB) pueden alcanzar los límites de memoria en algunos sistemas. Los servicios en la nube no tienen esa restricción.

Potencia de procesamiento: WASM se ejecuta al 40–80% de la velocidad nativa de C++. Los servicios en la nube ejecutan código nativo optimizado. Para la mayoría de los documentos esta diferencia es imperceptible; para trabajos de OCR de más de 100 páginas es notable.

Funciones: algunas funciones avanzadas de PDF (verificación de conformidad PDF/X, gestión profesional del color, flujos de trabajo CMYK) requieren herramientas especializadas del lado del servidor. El procesamiento basado en el navegador cubre el 95% de los casos.

Para el procesamiento cotidiano de documentos — comprimir, combinar, firmar, convertir, redactar — el modelo basado en el navegador es suficientemente rápido, privado por diseño y no requiere cuenta ni suscripción.

Preguntas Frecuentes

¿Recopila LuraPDF alguna telemetría o datos de uso? LuraPDF usa Google Analytics para estadísticas agregadas de vistas de página. Las operaciones de procesamiento de documentos no generan ningún evento de análisis. El contenido de tus archivos nunca se transmite.

¿Puedo verificar que no se produce ninguna subida? Sí. Abre las Herramientas para Desarrolladores (F12), haz clic en la pestaña Red y filtra por "XHR" o "Fetch." Procesa un archivo. Observa cero solicitudes de red relacionadas con documentos durante el procesamiento.

¿Por qué tarda tanto el OCR en comparación con otros servicios? Tesseract.js basado en el navegador se ejecuta en CPU vía WebAssembly. Los servicios OCR en la nube se ejecutan en clústeres de GPU que procesan caracteres órdenes de magnitud más rápido. La compensación es que tu documento nunca sale de tu navegador.

¿Qué pasa si cierro la pestaña mientras se procesa? El procesamiento se detiene de inmediato. La memoria de la pestaña del navegador es recolectada por el recolector de basura. Tu archivo original en el disco no cambia.

¿Es el código de código abierto? Las bibliotecas de procesamiento principales (pdf-lib, pdfjs-dist, Tesseract.js) son de código abierto. El código de la interfaz de LuraPDF no es actualmente de código abierto, pero la cadena de procesamiento usa únicamente componentes de código abierto.

El paso al procesamiento de documentos basado en el navegador no es un truco. Es una elección arquitectónica genuina con ventajas de privacidad y confianza medibles — al costo de velocidad en operaciones intensivas. Para documentos que prefieres que no existan en el servidor de otra persona, es la compensación correcta.

Sobre el autor

LuraPDF Team
LuraPDF Team

Equipo Editorial y Técnico · 6 de mayo de 2026 · 11 min de lectura

El equipo de LuraPDF está formado por expertos en procesamiento de documentos, ingenieros de software y redactores técnicos que buscan hacer la edición de PDF gratuita, privada y accesible para todos.