Fidelidad y seguridad de DOCX
El endpoint de exportación de Next.js genera localmente un paquete WordprocessingML nativo. Esta matriz está vinculada a la prueba de fidelidad en vivo del repositorio a nivel de paquete; no afirma que cualquier CSS del navegador tenga un equivalente exacto en Word. Dos construcciones tienen su propio artículo: ecuaciones que sobreviven a un viaje de ida y vuelta por Word y qué hay realmente dentro de un .docx.
Correspondencias probadas
| Área | Salida DOCX nativa |
|---|---|
| Estructura del documento | Encabezados, párrafos, citas en bloque, viñetas anidadas y listas decimales, tablas de diseño fijo |
| Formato en línea | Negrita, cursiva, subrayado, tachado, código, familia y tamaño de fuente, color del texto y del fondo, subíndice y superíndice |
| Diseño de párrafo | Alineación, márgenes, interlineado, sangría de primera línea, page-break-before y saltos de página explícitos |
| Diseño de página | Letter o A4, vertical u horizontal, márgenes acotados, encabezados y pies de página predeterminados, campos de página actual/total |
| Tablas | Cuadrícula DXA exacta, filas de encabezado que se repiten, combinación de columnas y de filas, sombreado de celdas y alineación vertical |
| Semántica de revisión | Inserciones, eliminaciones, comentarios, notas al pie y notas finales nativas de DOCX |
| Ecuaciones | LaTeX convertido a OMML nativo (fracciones, subíndices y superíndices, radicales, operadores n-arios, delimitadores, funciones, límites, acentos, barras y cuadros); se pueden editar en el editor de ecuaciones de Word, no son una imagen |
| Enlaces y medios | Enlaces HTTP/HTTPS/mailto; URI data PNG, JPEG, GIF y BMP; mapa de imágenes resuelto por un servidor de confianza |
Contrato de la solicitud
POST /api/export/docx
{
"html": "<h1>Report</h1><p>Body</p>",
"title": "Report",
"fileName": "report.docx",
"headerHtml": "<p>Private report</p>",
"footerHtml": "<p>Page <span data-page-number="current"></span></p>",
"page": { "size": "a4", "orientation": "landscape",
"margin": { "top": 1080, "right": 900, "bottom": 1080, "left": 900 } },
"imageMap": { "https://trusted.example/chart.png": "data:image/png;base64,..." }
}Los márgenes se expresan en vigésimas de punto (twips) y están acotados entre 360 y 2880. La solicitud tiene un límite de 1 MiB. Un mapa de imágenes acepta como máximo ocho claves HTTP(S), solo valores de imagen data y 768 KiB decodificados en total.
Convenciones de HTML semántico
<ins data-author="Ada" data-date="2026-07-16T12:00:00Z">added</ins>
<del data-author="Ada">removed</del>
<span data-comment="Check the source" data-comment-author="Reviewer">claim</span>
<sup data-footnote="Source citation"></sup>
<span data-endnote="Appendix detail"></span>
<hr class="page-break">Importar DOCX
La importación se ejecuta por completo en el navegador, sin ninguna biblioteca y sin ida y vuelta al servidor. Un .docx es un ZIP de XML: el directorio central del ZIP se lee directamente y DecompressionStream("deflate-raw") se encarga de descomprimir. No se sube nada a ninguna parte.
| Se importa | Cómo, y qué pierde un conversor ingenuo |
|---|---|
| URL de hipervínculos | w:hyperlink solo lleva un r:id; la dirección está en word/_rels/document.xml.rels. Se resuelve; sin esto, cada enlace se importa como texto simple y la URL se descarta. |
| Imágenes | w:drawing → a:blip → word/media/*, incrustadas como URI data. Establece documentImportImages: false para omitirlas en archivos con muchas imágenes. |
| Listas numeradas frente a listas con viñetas | document.xml guarda todas las listas igual; solo word/numbering.xml las distingue. Se lee, así que las listas numeradas siguen siendo <ol> en lugar de convertirse en viñetas. |
| Anidamiento de listas | w:ilvl produce un anidamiento real, y la sublista se coloca dentro de su <li> padre para que el marcado sea válido. |
| Notas al pie y notas finales | Word guarda el cuerpo de las notas en partes separadas, word/footnotes.xml y word/endnotes.xml; document.xml solo contiene un id. Se leen todas y se reconstruyen como notas vivas: inserta una encima de una nota importada y todo se vuelve a numerar. Las dos partes comparten un esquema, pero no un nombre de elemento (w:footnote frente a w:endnote), así que un analizador escrito para una no devuelve nada, sin avisar, para la otra. Las entradas de separador de Word se omiten. |
| Cuadros de texto | El contenido de un cuadro de texto está anidado seis niveles por debajo del run (w:pict → v:shape → v:textbox → w:txbxContent), así que un conversor que solo lee los hijos directos pierde todas sus palabras. Se recupera como un bloque .rte-imported-textbox en el orden del documento, con los párrafos y las tablas intactos. Un bloque mc:AlternateContent lleva el mismo cuadro dos veces (una versión DrawingML y una alternativa VML) y solo se emite uno. |
| Control de cambios y comentarios | w:ins y w:del se importan como <ins>/<del> con autor y fecha, las mismas convenciones que emite la exportación, así que el marcado de revisión hace el viaje de ida y vuelta. El texto eliminado está en w:delText, no en w:t. Los rangos de comentarios se convierten en spans data-comment con el cuerpo tomado de word/comments.xml. |
| Ecuaciones | Word guarda las ecuaciones como un árbol m:oMath en su propio espacio de nombres math, intercalado entre los runs: un conversor que recorre los elementos w:r nunca lo ve, y la ecuación desaparece mientras la frase que la rodea se importa bien. Se traducen a LaTeX y se emiten como el span rte-math-inline propio del editor, así que se pueden editar en el cuadro de diálogo de matemáticas y se representan con el renderizador que cargue la página. Se asignan fracciones, subíndices y superíndices, radicales, operadores n-arios (el operador es un atributo, no texto), delimitadores, funciones, límites, acentos, barras, matrices y arrays alineados; todo lo que no se reconoce conserva su texto literal en lugar de desaparecer. |
| SmartArt | El dibujo de document.xml solo contiene ids de relación; todas las palabras del diagrama están en word/diagrams/dataN.xml, en otro espacio de nombres, así que un lector que busca a:blip no encuentra nada y descarta el gráfico por completo. El diseño no se puede reproducir en HTML, pero el contenido se recupera como un esquema .rte-imported-smartart: un organigrama que se importa como lista es utilizable; uno que se importa como espacio en blanco es un agujero. Los puntos de presentación y de conexión de Word (pres, parTrans, sibTrans) no tienen contenido y se omiten. |
| Imágenes WMF/EMF | Los metarchivos de Windows no tienen una forma que el navegador pueda mostrar, así que no se pueden incrustar. En lugar de desaparecer sin dejar rastro, cada uno deja un marcador con nombre que lleva data-source, para que el lector sepa que ahí había una figura y cuál buscar en el original. |
| Formato de caracteres | Color (w:color), resaltado, superíndice/subíndice y tamaño: w:sz está en medios puntos, así que 36 se convierte en 18pt y no en 36pt. |
| Estructura y formato | Encabezados a partir de w:pStyle, tablas, alineación de párrafos, negrita, cursiva, subrayado, tachado, tabulaciones y saltos de línea. |
Markdown, HTML, texto sin formato y el .doc con sabor HTML de Word se gestionan de la misma manera. Para cualquier cosa más allá de esto, o para enviar la conversión a través de tu propio servicio, proporciona config.documentImportResolver(file), que tiene prioridad para todos los formatos.
Limitaciones conocidas: son limitaciones de forma, no de contenido. Ya no se descarta nada de un .docx sin avisar. Lo que el HTML no puede reproducir se degrada de forma visible y lo indica: los cuadros de texto vuelven como contenido en lugar de como marcos flotantes (el HTML del navegador no tiene un equivalente del anclaje absoluto a la página de Word), SmartArt como un esquema en lugar de un gráfico maquetado, y las imágenes WMF/EMF como un marcador con nombre. Las ecuaciones llegan como LaTeX, que necesita KaTeX o MathJax en la página para mostrarse como matemáticas y no como su código fuente. Son carencias de la importación, no de la exportación: la tabla de arriba cubre lo que hoy hace el viaje de ida y vuelta. Las ecuaciones se verifican como un ciclo real y no como dos funciones independientes: quince fórmulas exportadas a OOXML y vueltas a importar regresan idénticas byte a byte, incluidos los tres corchetes angulares Unicode visualmente idénticos que emiten distintos generadores.
Límite de seguridad
El conversor nunca hace solicitudes de red. Una URL en un elemento img se ignora a menos que el servidor que hace la llamada proporcione una entrada exacta de URL a URI data en imageMap. Así, el DNS, las redirecciones, las direcciones privadas, las credenciales y la autorización por inquilino quedan fuera del límite de confianza del conversor.
Limitaciones intencionadas
- Word está paginado y el HTML del navegador es un diseño de flujo. Los elementos flotantes, CSS grid, los filtros, los scripts, los formularios, las animaciones y los estilos arbitrarios no se traducen.
- Solo se exponen los encabezados y pies de página de sección predeterminados; las variantes de primera página y de páginas pares, y las múltiples secciones definidas en HTML, requieren una plantilla específica de la aplicación.
- La batería de pruebas automatizada examina las partes y relaciones OOXML generadas. La aprobación visual en Microsoft Word o LibreOffice sigue siendo un paso de la publicación para las plantillas con marca.