Visor de Office Open XML en navegador con Rust y WebAssembly

Fuentes: Browser-based Office Open XML viewer built with Rust and WebAssembly
Imagen generada por IA con el prompt: Browser window displaying an office document rendered on an HTML canvas, with floating WebAssembly module icons and code snippets in the background, dark theme, soft blue glow.
Imagen generada con IA

Office Open XML Viewer es una biblioteca JavaScript que permite visualizar documentos DOCX, hojas de cálculo XLSX y presentaciones PPTX directamente en el navegador, sin necesidad de suite ofimática ni servicios en la nube. El proyecto se distribuye como el paquete npm @silurus/ooxml y se integra con marcos modernos como React 19, Vue 3.5 y Angular 19.

La arquitectura combina dos lenguajes. Los analizadores están escritos en Rust y se compilan a WebAssembly mediante wasm-pack, uno por formato (docx_parser.wasm, xlsx_parser.wasm, pptx_parser.wasm). Los renderizadores son TypeScript y dibujan sobre un elemento HTML con la API Canvas 2D. El flujo es el siguiente: un Web Worker carga el archivo y lo procesa con el módulo WASM para producir un modelo JSON; ese modelo viaja al hilo principal, donde el renderizador lo dibuja en el canvas. El renderizado se mantiene en el hilo principal a propósito, para que el canvas comparta el FontFaceSet del documento y las fuentes web del tema se apliquen correctamente: un OffscreenCanvas tendría un registro de fuentes propio y recurriría a fuentes del sistema, alterando medidas y posiciones del texto.

Además de los visores con interfaz propia (DocxViewer, XlsxViewer, PptxViewer), la biblioteca expone motores sin interfaz (DocxDocument, XlsxWorkbook, PptxPresentation) que dibujan sobre cualquier que aporte el desarrollador, lo que permite construir vistas personalizadas de desplazamiento, miniaturas o paneles maestro-detalle.

El paquete incorpora un motor matemático opcional basado en MathJax y la fuente STIX Two Math para renderizar ecuaciones OMML presentes en archivos .docx y .pptx. Ese motor ocupa aproximadamente 3 MB, por lo que se publica en una entrada separada (@silurus/ooxml/math) y solo se incluye en el bundle final si el desarrollador la importa explícitamente. Los visores que no reciben ese motor, así como todo el uso de XLSX, eliminan esos 3 MB mediante tree-shaking. El motor no realiza peticiones de red ni solicitudes cross-origin.

La biblioteca se publica solo como ESM e incluye archivos .wasm incrustados: con Vite se recomienda vite-plugin-wasm, y con webpack hay que habilitar experiments.asyncWebAssembly. El código del repositorio (analizadores Rust, renderizadores TypeScript, pruebas y herramientas) fue generado íntegramente por Claude, el asistente de IA de Anthropic, mediante prompting iterativo.