[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"technologies":3,"\u002Fopen-source\u002Fdxpdf":167,"glossary":1439},[4,10,15,21,26,32,38,43,48,53,58,63,68,73,77,82,87,92,97,103,108,113,118,123,128,133,138,143,147,152,157,162],{"title":5,"description":6,"slug":7,"category":8,"icon":9},"Android","Todas las apps que entregamos llegan a Android: APIs de plataforma, ejecución en segundo plano, permisos y los requisitos de tienda que traen consigo.","android","framework","logos:android-icon",{"title":11,"description":12,"slug":13,"category":8,"icon":14},"Angular","El framework de frontend en el que trabajamos cuando un producto ya es Angular: una estructura con todo incluido que encaja en apps grandes y de vida larga.","angular","logos:angular-icon",{"title":16,"description":17,"slug":18,"category":19,"icon":20},"Dart","El lenguaje en el que está escrita cada app Flutter que entregamos: null safety robusto, pattern matching de verdad y un compilador que apunta a nativo y a la web.","dart","language","logos:dart",{"title":22,"description":23,"slug":24,"category":8,"icon":25},"Django","El framework de Python que usamos cuando un producto necesita administración, autenticación y un modelo de datos real desde el primer día.","django","logos:django-icon",{"title":27,"description":28,"slug":29,"category":30,"icon":31},"Docker","Cada servicio que construimos se publica como contenedor, así que lo que corre en un portátil, en CI y en producción es un solo artefacto y no tres.","docker","infrastructure","logos:docker-icon",{"title":33,"description":34,"slug":35,"category":36,"icon":37},"Fastlane","La automatización de releases móviles: firma, builds y subidas a las tiendas desde CI, no desde el portátil de un ingeniero el día del lanzamiento.","fastlane","tools","logos:fastlane",{"title":39,"description":40,"slug":41,"category":8,"icon":42},"Flutter","Nuestro stack móvil principal desde 2018: una base de código Dart que llega a iOS, Android, web y escritorio sin un equipo por plataforma.","flutter","logos:flutter",{"title":44,"description":45,"slug":46,"category":36,"icon":47},"Git","Todos los proyectos que tocamos viven en Git: pull requests revisadas, CI en cada rama y un historial que sigue teniendo sentido meses después.","git","logos:git-icon",{"title":49,"description":50,"slug":51,"category":19,"icon":52},"Go","Nuestro lenguaje de backend para APIs en tiempo real y servicios bajo carga: binarios pequeños, compilaciones rápidas y concurrencia que sigue siendo legible.","go","logos:gopher",{"title":54,"description":55,"slug":56,"category":30,"icon":57},"Google Cloud","La nube donde corren nuestras cargas de producción: Kubernetes gestionado, almacenamiento y red, sin servidores hechos a mano que nadie quiere mantener.","gcp","logos:google-cloud",{"title":59,"description":60,"slug":61,"category":36,"icon":62},"Gradle","El sistema de build por el que pasa cada release de Android: product flavours, configuraciones de firma y el cableado de dependencias bajo una app Flutter.","gradle","logos:gradle",{"title":64,"description":65,"slug":66,"category":30,"icon":67},"Helm","Cómo empaquetamos un despliegue de Kubernetes: servicio, configuración, secretos e ingress como una unidad versionada que se puede promover y revertir.","helm","logos:helm",{"title":69,"description":70,"slug":71,"category":19,"icon":72},"Kotlin","A lo que recurrimos cuando una app Flutter necesita Android de verdad por debajo: platform channels, trabajo en segundo plano e integraciones con SDK nativos.","kotlin","logos:kotlin-icon",{"title":74,"description":75,"slug":76,"category":8,"icon":72},"Kotlin Multiplatform","Compartir la lógica de negocio entre iOS y Android mientras cada plataforma conserva su UI nativa: la alternativa cuando Flutter no encaja.","kmp",{"title":78,"description":79,"slug":80,"category":30,"icon":81},"Kubernetes","Cómo ejecutamos servicios en producción: despliegues con Helm, rollouts reversibles y escalado que no necesita a nadie a las 3 de la mañana.","kubernetes","logos:kubernetes",{"title":83,"description":84,"slug":85,"category":30,"icon":86},"NATS","Mensajería ligera entre servicios: publicación\u002Fsuscripción y petición\u002Frespuesta sin el peso operativo de un clúster de broker completo.","nats","logos:nats-icon",{"title":88,"description":89,"slug":90,"category":8,"icon":91},"Nuxt","Vue con renderizado en servidor, enrutado y SEO resueltos: así hacemos sitios y apps web que deben ser rápidas e indexables en la primera carga.","nuxt","logos:nuxt-icon",{"title":93,"description":94,"slug":95,"category":19,"icon":96},"PHP","Donde trabajamos con un backend PHP ya existente: extenderlo, integrarse con él y construir los clientes móviles y web a los que tiene que servir.","php","logos:php",{"title":98,"description":99,"slug":100,"category":101,"icon":102},"PostgreSQL","Nuestra base de datos por defecto, salvo que un producto dé una razón concreta para no usarla: del diseño del esquema al ajuste de índices.","postgres","database","logos:postgresql",{"title":104,"description":105,"slug":106,"category":19,"icon":107},"Python","Nuestro lenguaje para backends, trabajo con datos e integraciones de IA, incluidos los bindings de Python que publicamos para nuestras propias herramientas en Rust.","python","logos:python",{"title":109,"description":110,"slug":111,"category":8,"icon":112},"React","La librería de frontend en la que trabajamos cuando un producto ya es React: componentes, hooks y el ecosistema que ha crecido a su alrededor.","react","logos:react",{"title":114,"description":115,"slug":116,"category":101,"icon":117},"Redis","Donde ponemos los datos que tienen que ser rápidos y se pueden reconstruir: cachés, sesiones, límites de tasa y las colas tras las rutas lentas de un producto.","redis","logos:redis",{"title":119,"description":120,"slug":121,"category":19,"icon":122},"Ruby","El lenguaje de nuestra automatización de releases móviles: lanes de Fastlane, acciones a medida y el pegamento de CI que sube builds a las tiendas.","ruby","logos:ruby",{"title":124,"description":125,"slug":126,"category":19,"icon":127},"Rust","A donde vamos cuando importan tanto el rendimiento como la corrección: renderizado de documentos, herramientas de CLI y servicios que tienen que ser rápidos y predecibles.","rust","simple-icons:rust",{"title":129,"description":130,"slug":131,"category":101,"icon":132},"SQLite","La base de datos que viaja dentro de la app: cachés locales, almacenamiento offline-first y todo lo que tiene que seguir funcionando sin red.","sqlite","logos:sqlite",{"title":134,"description":135,"slug":136,"category":8,"icon":137},"Strapi","Un CMS headless para cuando los editores necesitan ser dueños del contenido: una administración de verdad y una API limpia, sin construirlas desde cero.","strapi","logos:strapi-icon",{"title":139,"description":140,"slug":141,"category":19,"icon":142},"Swift","A lo que recurrimos cuando una app Flutter necesita iOS de verdad por debajo: platform channels, integraciones con SDK nativos, widgets y App Clips.","swift","logos:swift",{"title":144,"description":145,"slug":146,"category":8,"icon":142},"SwiftUI","El framework de UI de Apple, donde construimos las superficies nativas que una app Flutter no puede tener: widgets, App Clips y extensiones.","swiftui",{"title":148,"description":149,"slug":150,"category":8,"icon":151},"Tailwind CSS","Cómo damos estilo a cada frontend que construimos: clases de utilidad y design tokens en lugar de una hoja de estilos que solo crece y nunca se borra.","tailwind","logos:tailwindcss-icon",{"title":153,"description":154,"slug":155,"category":19,"icon":156},"TypeScript","Lo predeterminado para todo lo que escribimos para el navegador y para servicios Node: tipos que detectan errores de integración antes de llegar a una revisión.","typescript","logos:typescript-icon",{"title":158,"description":159,"slug":160,"category":8,"icon":161},"Vue","Nuestro framework de frontend para paneles de administración, cuadros de mando y apps web que deben seguir siendo mantenibles durante años.","vue","logos:vue",{"title":163,"description":164,"slug":165,"category":36,"icon":166},"Whisper","El modelo de reconocimiento de voz de código abierto de OpenAI: el motor de transcripción detrás de la entrada por voz, que funciona como servicio de backend y también en el propio dispositivo.","whisper","simple-icons:openai",{"id":168,"title":169,"body":170,"description":1391,"extension":1392,"links":1393,"meta":1400,"metaDescription":1401,"metaTitle":1402,"navigation":635,"ogDescription":1403,"path":1404,"repository":1405,"seo":1408,"slug":169,"stem":1409,"technologies":1410,"updated":1411,"__hash__":1412,"stats":1413},"open_source_es\u002Fopen-source\u002Fdxpdf.md","dxpdf",{"type":171,"value":172,"toc":1372},"minimark",[173,178,187,190,213,221,225,235,242,252,278,293,297,312,409,413,418,421,459,463,466,593,596,883,887,890,904,943,946,950,957,972,1109,1116,1138,1142,1151,1253,1259,1262,1266,1270,1276,1280,1283,1287,1290,1294,1297,1304,1308,1315,1356,1364,1368],[174,175,177],"h2",{"id":176},"el-problema","El problema",[179,180,181,182,186],"p",{},"Convertir documentos de Word a PDF es una de las tareas más habituales del software de empresa. Facturas, contratos, informes, formularios de cumplimiento: nacen como archivos ",[183,184,185],"code",{},".docx"," y tienen que convertirse en PDF para compartirlos, archivarlos o imprimirlos.",[179,188,189],{},"Todas las soluciones existentes tienen contrapartidas importantes:",[191,192,193,201,207],"ul",{},[194,195,196,200],"li",{},[197,198,199],"strong",{},"Microsoft Office \u002F LibreOffice",": obliga a instalar una suite ofimática completa en cada servidor. El modo headless de LibreOffice es lento, consume mucha memoria y produce resultados inconsistentes entre versiones. Escalar significa levantar varias instancias que se comen gigabytes de RAM.",[194,202,203,206],{},[197,204,205],{},"APIs en la nube"," (Google Docs, Adobe, CloudConvert): añaden latencia, cuestan por conversión y envían documentos potencialmente sensibles a servidores de terceros. No son viables en sectores regulados ni en entornos aislados de la red.",[194,208,209,212],{},[197,210,211],{},"Herramientas de HTML a PDF"," (wkhtmltopdf, Puppeteer): obligan a convertir primero el DOCX a HTML, perdiendo fidelidad de formato. Las tablas, los encabezados y pies de página y los saltos de página rara vez sobreviven al viaje de ida y vuelta.",[179,214,215,216,220],{},"Ninguna funciona bien cuando necesitas una conversión rápida, fiel y sin conexión a escala, especialmente en pipelines automatizados, sistemas de ",[217,218],"term",{"slug":219},"ci-cd"," o aplicaciones embebidas donde instalar LibreOffice no es una opción.",[174,222,224],{"id":223},"cómo-lo-resuelve-dxpdf","Cómo lo resuelve dxpdf",[179,226,227,228,231,232,234],{},"dxpdf es un conversor de DOCX a PDF independiente, escrito en Rust y basado en la librería gráfica ",[217,229],{"slug":230},"skia"," de Google. Lee los archivos ",[183,233,185],{}," directamente, parsea la estructura OOXML y renderiza una salida PDF fiel al píxel, todo en un único binario sin más dependencias externas que Skia.",[179,236,237,238,241],{},"Un modelo ",[197,239,240],{},"medir y después colocar"," inspirado en Flutter garantiza que el ajuste del texto, el dimensionado de las tablas y los saltos de página coincidan con lo que produce Microsoft Word:",[243,244,249],"pre",{"className":245,"code":247,"language":248},[246],"language-text","DOCX (ZIP) → Parse → Document Model → Resolve → Layout → Subset → Paint → PDF\n             Twips\u002FEmu\u002FHalfPoints        ←──── Pt throughout ────→      Skia\n","text",[183,250,247],{"__ignoreMap":251},"",[179,253,254,255,258,259,258,262,265,266,269,270,273,274,277],{},"Las dimensiones con seguridad de tipos recorren todo el pipeline: las unidades de OOXML (",[183,256,257],{},"Twips",", ",[183,260,261],{},"Emu",[183,263,264],{},"HalfPoints",") están respaldadas por ",[183,267,268],{},"i64"," en el modelo parseado, así que van y vuelven sin pérdida; la maquetación trabaja en puntos tipográficos (",[183,271,272],{},"Pt","), y el ",[183,275,276],{},"f32"," a secas solo aparece en la frontera de renderizado con Skia. Mezclar unidades es, por tanto, un error de compilación y no un documento sutilmente equivocado.",[179,279,280,281,284,285,288,289,292],{},"El resultado es un conversor que convierte un documento de 3 páginas con tablas e imágenes en ",[197,282,283],{},"170 ms"," usando ",[197,286,287],{},"54 MB de memoria",", y uno de 171 páginas y 14 MB en ",[197,290,291],{},"420 ms",": lo bastante rápido como para ejecutarse dentro de un manejador de peticiones o procesar miles de documentos por lotes.",[174,294,296],{"id":295},"qué-ofrece","Qué ofrece",[179,298,299,300,303,304,311],{},"Validado contra ISO 29500 (Office Open XML): ",[197,301,302],{},"75 entradas implementadas por completo, 12 parciales y 11 aún no admitidas","; la ",[305,306,310],"a",{"href":307,"rel":308},"https:\u002F\u002Fgithub.com\u002Fnerdy-pro\u002Fdxpdf#ooxml-feature-coverage",[309],"nofollow","matriz completa"," enumera cada entrada con su estado. Lo más destacado:",[191,313,314,320,326,332,338,344,354,360,366,372,378,388,394,403],{},[194,315,316,319],{},[197,317,318],{},"Formato de texto",": negrita, cursiva, subrayado, resaltado, tamaño de fuente, familia tipográfica, color, espaciado y escalado de caracteres, superíndice, subíndice, sombreado y bordes de fragmentos",[194,321,322,325],{},[197,323,324],{},"Párrafos",": alineación (izquierda, centro, derecha, justificada, distribuida), espaciado, sangría, tabulaciones (incluidas la decimal, la de barra y las de posición absoluta), bordes, sombreado, conservar con el siguiente, conservar líneas juntas y control de líneas viudas y huérfanas",[194,327,328,331],{},[197,329,330],{},"Tablas",": anchos de columna, márgenes de celda con cascada de 3 niveles, celdas combinadas, alturas de fila, bordes, sombreado de celdas, estilos de tabla con formato condicional, tablas anidadas y flotantes, y división de filas entre páginas",[194,333,334,337],{},[197,335,336],{},"Imágenes",": en línea (PNG, JPEG, GIF, BMP, WebP) y flotantes\u002Fancladas con alineación, ajuste de texto, recorte y posicionamiento porcentual",[194,339,340,343],{},[197,341,342],{},"Formas y cuadros de texto",": formas DrawingML y VML, cuerpos de texto con márgenes internos, anclaje, autoajuste y geometría personalizada",[194,345,346,349,350,353],{},[197,347,348],{},"Estilos",": estilos de párrafo y de carácter con herencia ",[183,351,352],{},"basedOn",", valores por defecto del documento y fuentes del tema",[194,355,356,359],{},[197,357,358],{},"Encabezados y pies de página",": texto, imágenes, números de página (códigos de campo PAGE\u002FNUMPAGES) y variantes de primera página y pares\u002Fimpares",[194,361,362,365],{},[197,363,364],{},"Listas",": numeración multinivel: viñetas, decimal, letras, romanos, ordinales y números escritos en palabras, además de secuencias no latinas y viñetas de imagen",[194,367,368,371],{},[197,369,370],{},"Navegación",": anotaciones de enlace clicables, marcadores y referencias cruzadas como destinos con nombre, y un índice de PDF construido a partir de los niveles de encabezado",[194,373,374,377],{},[197,375,376],{},"Secciones",": varios tamaños de página y márgenes, saltos de sección, diseños multicolumna y orientaciones vertical y horizontal",[194,379,380,383,384,387],{},[197,381,382],{},"Fórmulas",": matemáticas OMML en línea (",[183,385,386],{},"m:oMath","): runs matemáticos, superíndices y fracciones, compuestos con la fuente matemática predeterminada de Word; una fórmula puede llevar un hipervínculo y aparecer en un título del esquema",[194,389,390,393],{},[197,391,392],{},"Maquetación",": paginación automática, notas al pie y notas al final, ajuste de línea, modos de interlineado y flujo del texto alrededor de imágenes flotantes",[194,395,396,399,400],{},[197,397,398],{},"Internacionalización",": saltos de línea UAX #14 (incluidos tailandés, lao, jemer y birmano), texto bidireccional UAX #9 con reflejo especular, shaping con HarfBuzz para escrituras de unión cursiva, y separadores decimales, máscaras de fecha y números en palabras guiados por ",[183,401,402],{},"w:lang",[194,404,405,408],{},[197,406,407],{},"Texto y emoji",": segmentación correcta por clústeres de grafemas y emoji a todo color, incluidas secuencias ZWJ, modificadores, teclas y banderas",[174,410,412],{"id":411},"cuatro-formas-de-usarlo","Cuatro formas de usarlo",[414,415,417],"h3",{"id":416},"herramienta-de-línea-de-comandos","Herramienta de línea de comandos",[179,419,420],{},"Instálalo y ejecútalo con un solo comando:",[243,422,426],{"className":423,"code":424,"language":425,"meta":251,"style":251},"language-shell shiki shiki-themes material-theme-lighter github-light github-dark","cargo install dxpdf\ndxpdf input.docx -o output.pdf\n","shell",[183,427,428,444],{"__ignoreMap":251},[429,430,433,437,441],"span",{"class":431,"line":432},"line",1,[429,434,436],{"class":435},"sbgvK","cargo",[429,438,440],{"class":439},"s_sjI"," install",[429,442,443],{"class":439}," dxpdf\n",[429,445,447,449,452,456],{"class":431,"line":446},2,[429,448,169],{"class":435},[429,450,451],{"class":439}," input.docx",[429,453,455],{"class":454},"stzsN"," -o",[429,457,458],{"class":439}," output.pdf\n",[414,460,462],{"id":461},"librería-de-rust","Librería de Rust",[179,464,465],{},"Una llamada a función: bytes de entrada, bytes de salida.",[243,467,470],{"className":468,"code":469,"language":126,"meta":251,"style":251},"language-rust shiki shiki-themes material-theme-lighter github-light github-dark","let docx_bytes = std::fs::read(\"document.docx\")?;\nlet pdf_bytes = dxpdf::convert(&docx_bytes)?;\nstd::fs::write(\"output.pdf\", &pdf_bytes)?;\n",[183,471,472,523,554],{"__ignoreMap":251},[429,473,474,478,482,486,489,492,495,497,501,505,509,512,514,517,520],{"class":431,"line":432},[429,475,477],{"class":476},"sbsja","let",[429,479,481],{"class":480},"su5hD"," docx_bytes ",[429,483,485],{"class":484},"smGrS","=",[429,487,488],{"class":435}," std",[429,490,491],{"class":484},"::",[429,493,494],{"class":435},"fs",[429,496,491],{"class":484},[429,498,500],{"class":499},"sGLFI","read",[429,502,504],{"class":503},"sP7_E","(",[429,506,508],{"class":507},"sjJ54","\"",[429,510,511],{"class":439},"document.docx",[429,513,508],{"class":507},[429,515,516],{"class":503},")",[429,518,519],{"class":484},"?",[429,521,522],{"class":503},";\n",[429,524,525,527,530,532,535,537,540,542,545,548,550,552],{"class":431,"line":446},[429,526,477],{"class":476},[429,528,529],{"class":480}," pdf_bytes ",[429,531,485],{"class":484},[429,533,534],{"class":435}," dxpdf",[429,536,491],{"class":484},[429,538,539],{"class":499},"convert",[429,541,504],{"class":503},[429,543,544],{"class":484},"&",[429,546,547],{"class":480},"docx_bytes",[429,549,516],{"class":503},[429,551,519],{"class":484},[429,553,522],{"class":503},[429,555,557,560,562,564,566,569,571,573,576,578,581,584,587,589,591],{"class":431,"line":556},3,[429,558,559],{"class":435},"std",[429,561,491],{"class":484},[429,563,494],{"class":435},[429,565,491],{"class":484},[429,567,568],{"class":499},"write",[429,570,504],{"class":503},[429,572,508],{"class":507},[429,574,575],{"class":439},"output.pdf",[429,577,508],{"class":507},[429,579,580],{"class":503},",",[429,582,583],{"class":484}," &",[429,585,586],{"class":480},"pdf_bytes",[429,588,516],{"class":503},[429,590,519],{"class":484},[429,592,522],{"class":503},[179,594,595],{},"Para más control, inspecciona el modelo de documento parseado antes de renderizar:",[243,597,599],{"className":468,"code":598,"language":126,"meta":251,"style":251},"use dxpdf::{docx, model, render};\n\nlet document = docx::parse(&std::fs::read(\"document.docx\")?)?;\n\nfor block in &document.body {\n    match block {\n        model::Block::Paragraph(p) => { \u002F* inspeccionar el párrafo *\u002F }\n        model::Block::Table(t) => { \u002F* inspeccionar la tabla *\u002F }\n        model::Block::SectionBreak(props) => { \u002F* inspeccionar las propiedades de sección *\u002F }\n    }\n}\n\nlet pdf_bytes = render::render(document, &dxpdf::RenderOptions::default())?;\n",[183,600,601,631,637,686,691,718,728,763,793,823,829,835,840],{"__ignoreMap":251},[429,602,603,607,609,611,614,618,620,623,625,628],{"class":431,"line":432},[429,604,606],{"class":605},"sw1J6","use",[429,608,534],{"class":435},[429,610,491],{"class":484},[429,612,613],{"class":503},"{",[429,615,617],{"class":616},"s3--O","docx",[429,619,580],{"class":503},[429,621,622],{"class":616}," model",[429,624,580],{"class":503},[429,626,627],{"class":616}," render",[429,629,630],{"class":503},"};\n",[429,632,633],{"class":431,"line":446},[429,634,636],{"emptyLinePlaceholder":635},true,"\n",[429,638,639,641,644,646,649,651,654,656,658,660,662,664,666,668,670,672,674,676,678,680,682,684],{"class":431,"line":556},[429,640,477],{"class":476},[429,642,643],{"class":480}," document ",[429,645,485],{"class":484},[429,647,648],{"class":435}," docx",[429,650,491],{"class":484},[429,652,653],{"class":499},"parse",[429,655,504],{"class":503},[429,657,544],{"class":484},[429,659,559],{"class":435},[429,661,491],{"class":484},[429,663,494],{"class":435},[429,665,491],{"class":484},[429,667,500],{"class":499},[429,669,504],{"class":503},[429,671,508],{"class":507},[429,673,511],{"class":439},[429,675,508],{"class":507},[429,677,516],{"class":503},[429,679,519],{"class":484},[429,681,516],{"class":503},[429,683,519],{"class":484},[429,685,522],{"class":503},[429,687,689],{"class":431,"line":688},4,[429,690,636],{"emptyLinePlaceholder":635},[429,692,694,698,701,704,706,709,712,715],{"class":431,"line":693},5,[429,695,697],{"class":696},"sVHd0","for",[429,699,700],{"class":480}," block ",[429,702,703],{"class":605},"in",[429,705,583],{"class":484},[429,707,708],{"class":480},"document",[429,710,711],{"class":484},".",[429,713,714],{"class":480},"body ",[429,716,717],{"class":503},"{\n",[429,719,721,724,726],{"class":431,"line":720},6,[429,722,723],{"class":696},"    match",[429,725,700],{"class":480},[429,727,717],{"class":503},[429,729,731,734,736,739,741,744,746,748,750,753,756,760],{"class":431,"line":730},7,[429,732,733],{"class":435},"        model",[429,735,491],{"class":484},[429,737,738],{"class":435},"Block",[429,740,491],{"class":484},[429,742,743],{"class":499},"Paragraph",[429,745,504],{"class":503},[429,747,179],{"class":480},[429,749,516],{"class":503},[429,751,752],{"class":484}," =>",[429,754,755],{"class":503}," {",[429,757,759],{"class":758},"sutJx"," \u002F* inspeccionar el párrafo *\u002F",[429,761,762],{"class":503}," }\n",[429,764,766,768,770,772,774,777,779,782,784,786,788,791],{"class":431,"line":765},8,[429,767,733],{"class":435},[429,769,491],{"class":484},[429,771,738],{"class":435},[429,773,491],{"class":484},[429,775,776],{"class":499},"Table",[429,778,504],{"class":503},[429,780,781],{"class":480},"t",[429,783,516],{"class":503},[429,785,752],{"class":484},[429,787,755],{"class":503},[429,789,790],{"class":758}," \u002F* inspeccionar la tabla *\u002F",[429,792,762],{"class":503},[429,794,796,798,800,802,804,807,809,812,814,816,818,821],{"class":431,"line":795},9,[429,797,733],{"class":435},[429,799,491],{"class":484},[429,801,738],{"class":435},[429,803,491],{"class":484},[429,805,806],{"class":499},"SectionBreak",[429,808,504],{"class":503},[429,810,811],{"class":480},"props",[429,813,516],{"class":503},[429,815,752],{"class":484},[429,817,755],{"class":503},[429,819,820],{"class":758}," \u002F* inspeccionar las propiedades de sección *\u002F",[429,822,762],{"class":503},[429,824,826],{"class":431,"line":825},10,[429,827,828],{"class":503},"    }\n",[429,830,832],{"class":431,"line":831},11,[429,833,834],{"class":503},"}\n",[429,836,838],{"class":431,"line":837},12,[429,839,636],{"emptyLinePlaceholder":635},[429,841,843,845,847,849,851,853,856,858,860,862,864,866,868,871,873,876,879,881],{"class":431,"line":842},13,[429,844,477],{"class":476},[429,846,529],{"class":480},[429,848,485],{"class":484},[429,850,627],{"class":435},[429,852,491],{"class":484},[429,854,855],{"class":499},"render",[429,857,504],{"class":503},[429,859,708],{"class":480},[429,861,580],{"class":503},[429,863,583],{"class":484},[429,865,169],{"class":435},[429,867,491],{"class":484},[429,869,870],{"class":435},"RenderOptions",[429,872,491],{"class":484},[429,874,875],{"class":499},"default",[429,877,878],{"class":503},"())",[429,880,519],{"class":484},[429,882,522],{"class":503},[414,884,886],{"id":885},"paquete-de-python","Paquete de Python",[179,888,889],{},"Instálalo desde PyPI y úsalo en cualquier aplicación Python:",[243,891,893],{"className":423,"code":892,"language":425,"meta":251,"style":251},"pip install dxpdf\n",[183,894,895],{"__ignoreMap":251},[429,896,897,900,902],{"class":431,"line":432},[429,898,899],{"class":435},"pip",[429,901,440],{"class":439},[429,903,443],{"class":439},[243,905,908],{"className":906,"code":907,"language":106,"meta":251,"style":251},"language-python shiki shiki-themes material-theme-lighter github-light github-dark","import dxpdf\n\n# Bytes de entrada, bytes de salida\npdf_bytes = dxpdf.convert(open(\"input.docx\", \"rb\").read())\n\n# De archivo a archivo\ndxpdf.convert_file(\"input.docx\", \"output.pdf\")\n",[183,909,910,915,919,924,929,933,938],{"__ignoreMap":251},[429,911,912],{"class":431,"line":432},[429,913,914],{},"import dxpdf\n",[429,916,917],{"class":431,"line":446},[429,918,636],{"emptyLinePlaceholder":635},[429,920,921],{"class":431,"line":556},[429,922,923],{},"# Bytes de entrada, bytes de salida\n",[429,925,926],{"class":431,"line":688},[429,927,928],{},"pdf_bytes = dxpdf.convert(open(\"input.docx\", \"rb\").read())\n",[429,930,931],{"class":431,"line":693},[429,932,636],{"emptyLinePlaceholder":635},[429,934,935],{"class":431,"line":720},[429,936,937],{},"# De archivo a archivo\n",[429,939,940],{"class":431,"line":730},[429,941,942],{},"dxpdf.convert_file(\"input.docx\", \"output.pdf\")\n",[179,944,945],{},"Desde la 0.8.1 ambas llamadas liberan el GIL mientras trabaja el núcleo de Rust, de modo que un pool de hilos que convierte varios documentos a la vez los procesa realmente en paralelo en lugar de serializarlos en el intérprete.",[414,947,949],{"id":948},"paquete-de-go","Paquete de Go",[179,951,952,953,956],{},"Instálalo con ",[183,954,955],{},"go get"," y úsalo como cualquier otro paquete:",[243,958,960],{"className":423,"code":959,"language":425,"meta":251,"style":251},"go get github.com\u002Fnerdy-pro\u002Fdxpdf\u002Fgo\n",[183,961,962],{"__ignoreMap":251},[429,963,964,966,969],{"class":431,"line":432},[429,965,51],{"class":435},[429,967,968],{"class":439}," get",[429,970,971],{"class":439}," github.com\u002Fnerdy-pro\u002Fdxpdf\u002Fgo\n",[243,973,976],{"className":974,"code":975,"language":51,"meta":251,"style":251},"language-go shiki shiki-themes material-theme-lighter github-light github-dark","import \"github.com\u002Fnerdy-pro\u002Fdxpdf\u002Fgo\"\n\n\u002F\u002F Bytes de entrada, bytes de salida\npdfBytes, err := dxpdf.Convert(docxBytes)\n\n\u002F\u002F De archivo a archivo\nerr := dxpdf.ConvertFile(\"input.docx\", \"output.pdf\")\n\n\u002F\u002F Cambiar la resolución de las imágenes incrustadas (220 DPI por defecto)\npdfBytes, err := dxpdf.ConvertWithOptions(docxBytes, 300)\n",[183,977,978,992,996,1001,1029,1033,1038,1071,1075,1080],{"__ignoreMap":251},[429,979,980,983,986,989],{"class":431,"line":432},[429,981,982],{"class":696},"import",[429,984,985],{"class":507}," \"",[429,987,988],{"class":435},"github.com\u002Fnerdy-pro\u002Fdxpdf\u002Fgo",[429,990,991],{"class":507},"\"\n",[429,993,994],{"class":431,"line":446},[429,995,636],{"emptyLinePlaceholder":635},[429,997,998],{"class":431,"line":556},[429,999,1000],{"class":758},"\u002F\u002F Bytes de entrada, bytes de salida\n",[429,1002,1003,1006,1008,1011,1014,1016,1018,1021,1023,1026],{"class":431,"line":688},[429,1004,1005],{"class":480},"pdfBytes",[429,1007,580],{"class":503},[429,1009,1010],{"class":480}," err ",[429,1012,1013],{"class":484},":=",[429,1015,534],{"class":480},[429,1017,711],{"class":503},[429,1019,1020],{"class":499},"Convert",[429,1022,504],{"class":503},[429,1024,1025],{"class":480},"docxBytes",[429,1027,1028],{"class":503},")\n",[429,1030,1031],{"class":431,"line":693},[429,1032,636],{"emptyLinePlaceholder":635},[429,1034,1035],{"class":431,"line":720},[429,1036,1037],{"class":758},"\u002F\u002F De archivo a archivo\n",[429,1039,1040,1043,1045,1047,1049,1052,1054,1056,1059,1061,1063,1065,1067,1069],{"class":431,"line":730},[429,1041,1042],{"class":480},"err ",[429,1044,1013],{"class":484},[429,1046,534],{"class":480},[429,1048,711],{"class":503},[429,1050,1051],{"class":499},"ConvertFile",[429,1053,504],{"class":503},[429,1055,508],{"class":507},[429,1057,1058],{"class":439},"input.docx",[429,1060,508],{"class":507},[429,1062,580],{"class":503},[429,1064,985],{"class":507},[429,1066,575],{"class":439},[429,1068,508],{"class":507},[429,1070,1028],{"class":503},[429,1072,1073],{"class":431,"line":765},[429,1074,636],{"emptyLinePlaceholder":635},[429,1076,1077],{"class":431,"line":795},[429,1078,1079],{"class":758},"\u002F\u002F Cambiar la resolución de las imágenes incrustadas (220 DPI por defecto)\n",[429,1081,1082,1084,1086,1088,1090,1092,1094,1097,1099,1101,1103,1107],{"class":431,"line":825},[429,1083,1005],{"class":480},[429,1085,580],{"class":503},[429,1087,1010],{"class":480},[429,1089,1013],{"class":484},[429,1091,534],{"class":480},[429,1093,711],{"class":503},[429,1095,1096],{"class":499},"ConvertWithOptions",[429,1098,504],{"class":503},[429,1100,1025],{"class":480},[429,1102,580],{"class":503},[429,1104,1106],{"class":1105},"srdBf"," 300",[429,1108,1028],{"class":503},[179,1110,1111,1112,1115],{},"El paquete de Go es una capa fina de cgo sobre el mismo núcleo de Rust que usan la CLI y el paquete de Python, así que necesita ",[183,1113,1114],{},"CGO_ENABLED=1"," y un compilador de C. La librería precompilada para cada plataforma admitida está versionada en el repositorio, por lo que no hay un paso aparte de descarga o compilación. Funciona en linux\u002Famd64, linux\u002Farm64, darwin\u002Famd64, darwin\u002Farm64 y, desde la 0.8.1, windows\u002Famd64.",[179,1117,1118,1119,1122,1123,1126,1127,1130,1131,1133,1134,1137],{},"Windows es la única plataforma que se despliega de otra forma: las otras cuatro enlazan un archivo estático que queda absorbido en tu binario, mientras que Windows carga ",[183,1120,1121],{},"dxpdf.dll"," de forma dinámica, así que el ejecutable necesita esa DLL a su lado o en el ",[183,1124,1125],{},"PATH"," en tiempo de ejecución; cópiala desde la caché de módulos a tu carpeta de release. Además, el módulo no tiene etiquetas propias, así que ",[183,1128,1129],{},"go get ...\u002Fgo@v0.8.1"," no resuelve: sí lo hacen un ",[183,1132,955],{}," normal, ",[183,1135,1136],{},"@main"," o un SHA de commit para fijarlo.",[174,1139,1141],{"id":1140},"rendimiento","Rendimiento",[179,1143,1144,1145,1150],{},"Medido en un Apple M3 Max con ",[305,1146,1149],{"href":1147,"rel":1148},"https:\u002F\u002Fgithub.com\u002Fsharkdp\u002Fhyperfine",[309],"hyperfine"," (30 ejecuciones, 5 de calentamiento) en la versión 0.5.1, contra fixtures versionadas en el repositorio. Los tiempos están redondeados a 5 ms y la dispersión entre ejecuciones en una máquina con carga normal ronda los ±10 ms, así que las diferencias menores no son significativas:",[1152,1153,1154,1176],"table",{},[1155,1156,1157],"thead",{},[1158,1159,1160,1164,1167,1170,1173],"tr",{},[1161,1162,1163],"th",{},"Fixture",[1161,1165,1166],{},"Páginas",[1161,1168,1169],{},"Entrada",[1161,1171,1172],{},"Tiempo de conversión",[1161,1174,1175],{},"Pico de RSS",[1177,1178,1179,1198,1216,1235],"tbody",{},[1158,1180,1181,1185,1188,1191,1195],{},[1182,1183,1184],"td",{},"Documento de negocio de 3 páginas",[1182,1186,1187],{},"3",[1182,1189,1190],{},"34 KB",[1182,1192,1193],{},[197,1194,283],{},[1182,1196,1197],{},"54 MB",[1158,1199,1200,1203,1206,1209,1213],{},[1182,1201,1202],{},"Documento de 7 páginas",[1182,1204,1205],{},"7",[1182,1207,1208],{},"10 KB",[1182,1210,1211],{},[197,1212,283],{},[1182,1214,1215],{},"51 MB",[1158,1217,1218,1221,1224,1227,1232],{},[1182,1219,1220],{},"Documento de 9 páginas con imágenes",[1182,1222,1223],{},"9",[1182,1225,1226],{},"1,3 MB",[1182,1228,1229],{},[197,1230,1231],{},"55 ms",[1182,1233,1234],{},"40 MB",[1158,1236,1237,1240,1243,1246,1250],{},[1182,1238,1239],{},"Informe de 171 páginas",[1182,1241,1242],{},"171",[1182,1244,1245],{},"14 MB",[1182,1247,1248],{},[197,1249,291],{},[1182,1251,1252],{},"145 MB",[179,1254,1255,1258],{},[197,1256,1257],{},"Lo que decide el coste de una conversión es cómo se resuelven las fuentes, no el tamaño del documento."," La fixture de 9 páginas lleva cuarenta veces más entrada que la de 3 y se convierte en un tercio del tiempo, porque sus fuentes están incrustadas o ya presentes en el sistema: esa ruta cuesta unos 4 ms, mientras que recurrir al índice de metadatos del sistema cuesta entre 120 y 185 ms, una sola vez. Para una carga por lotes la pregunta útil no es cómo de grandes son los documentos, sino si nombran fuentes que el sistema ya tiene.",[179,1260,1261],{},"La corrección de la conversión está fijada por tests basados en fixtures, incluidos tests de regresión visual que comparan los PDF renderizados con documentos de referencia generados por Word.",[174,1263,1265],{"id":1264},"casos-de-uso-reales","Casos de uso reales",[414,1267,1269],{"id":1268},"pipelines-documentales-automatizados","Pipelines documentales automatizados",[179,1271,1272,1273,1275],{},"Sistemas de CI\u002FCD o procesadores por lotes que generan contratos, facturas o informes a partir de plantillas ",[183,1274,185],{},". dxpdf se ejecuta como un único binario: sin instalar LibreOffice, sin una imagen Docker con un entorno de escritorio completo y sin costes de API por documento.",[414,1277,1279],{"id":1278},"entornos-regulados","Entornos regulados",[179,1281,1282],{},"Aplicaciones sanitarias, jurídicas y financieras donde los documentos no pueden salir de la red. dxpdf funciona completamente sin conexión y sin llamadas a servicios externos, lo que lo hace apto para despliegues aislados y on-premise.",[414,1284,1286],{"id":1285},"sistemas-embebidos-y-edge-computing","Sistemas embebidos y edge computing",[179,1288,1289],{},"Dispositivos IoT, kioscos o contenedores ligeros donde instalar una suite ofimática de 500 MB no es práctico. El consumo de memoria de dxpdf, de unas pocas decenas de megabytes, y sus tiempos de conversión por debajo del segundo lo hacen viable en entornos con recursos limitados.",[414,1291,1293],{"id":1292},"backends-en-python-y-go","Backends en Python y Go",[179,1295,1296],{},"Servicios de Django, Flask o FastAPI que necesitan convertir archivos DOCX subidos al vuelo. Los bindings de Python envuelven el núcleo de Rust mediante PyO3, ofreciendo rendimiento nativo sin subprocesos ni servicios externos.",[179,1298,1299,1300,1303],{},"Los servicios en Go obtienen el mismo núcleo a través de cgo: un handler llama a ",[183,1301,1302],{},"dxpdf.Convert"," directamente en lugar de invocar un binario o consultar un sidecar, de modo que la conversión se queda dentro de la propia goroutine de la petición y de su manejo de errores.",[174,1305,1307],{"id":1306},"notas-de-la-última-versión","Notas de la última versión",[179,1309,1310,1311,1314],{},"La versión más reciente es la ",[197,1312,1313],{},"0.8.1",". Desde la 0.5.0 han salido cuatro versiones que, entre ellas, añadieron un binding de lenguaje y un tipo de contenido nuevo:",[191,1316,1317,1339,1345,1351],{},[194,1318,1319,1322,1323,1326,1327,1330,1331,1334,1335,1338],{},[197,1320,1321],{},"0.6.0",": bindings de Go sobre una nueva ABI de C, además de correcciones en tablas: el borde exterior de una tabla con espaciado entre celdas, el desbordamiento de ",[183,1324,1325],{},"vMerge"," que pasa a la última fila de la combinación, los bordes verticales ",[183,1328,1329],{},"inside","\u002F",[183,1332,1333],{},"outside"," que se reflejan según la paridad de la página, y los runs ocultos con ",[183,1336,1337],{},"w:vanish",", que ahora se eliminan de la maquetación en lugar de pintarse.",[194,1340,1341,1344],{},[197,1342,1343],{},"0.7.0",": el renderizado de fórmulas OMML, junto con correcciones del solape de columnas en un salto de sección continuo, del ajuste de tokens según la regla LB25 de UAX #14 y de la tabla PUA de la fuente Symbol. Las fórmulas admiten hipervínculos y aparecen en los títulos del esquema.",[194,1346,1347,1350],{},[197,1348,1349],{},"0.8.0",": refinamiento de la vía matemática: geometría de fracciones coherente, superíndices sobre una fracción, números de nota al pie que toman la fuente de la fórmula que los abre, y el guion tratado correctamente con dígitos no ASCII. También lee las medidas universales de §22.9.2.15 y las grafías de porcentaje de §22.9.2.9.",[194,1352,1353,1355],{},[197,1354,1313],{},": windows\u002Famd64 se suma a los bindings de Go, y los bindings de Python liberan el GIL mientras dura una conversión.",[179,1357,1358,1359,1363],{},"El artículo largo sobre la 0.5.0, ",[305,1360,1362],{"href":1361},"\u002Fblog\u002Fdxpdf-0-5-0-release","dxpdf 0.5.0: enseñar a un conversor de DOCX a leer el resto del mundo",", sigue cubriendo el trabajo de internacionalización en el que se apoya todo esto: saltos de línea UAX #14, texto bidireccional UAX #9 y números y fechas de CLDR que siguen el idioma del propio documento.",[1365,1366],"questions",{":items":1367},"[{\"title\":\"¿dxpdf necesita Microsoft Office o LibreOffice?\",\"text\":\"No. dxpdf es un conversor independiente que lee los archivos DOCX directamente y renderiza los PDF con el motor gráfico Skia de Google. No depende de ninguna suite ofimática.\"},{\"title\":\"¿Qué lenguajes y plataformas admite dxpdf?\",\"text\":\"dxpdf está escrito en Rust y disponible como herramienta CLI (con cargo install), librería de Rust (en crates.io), paquete de Python (en PyPI) y bindings de Go (con go get github.com\u002Fnerdy-pro\u002Fdxpdf\u002Fgo). Los cuatro funcionan en macOS, Linux y Windows; los bindings de Go cubren linux\u002Famd64, linux\u002Farm64, darwin\u002Famd64, darwin\u002Farm64 y, desde la 0.8.1, windows\u002Famd64.\"},{\"title\":\"¿Cómo de fiel es la conversión?\",\"text\":\"dxpdf usa un pipeline de medir y después colocar inspirado en Flutter y diseñado para lograr fidelidad a nivel de píxel, validado contra ISO 29500 con 75 entradas implementadas por completo, 12 parciales y 11 aún no admitidas. Los tests de regresión visual comparan la salida con referencias generadas por Word.\"},{\"title\":\"¿Cómo de rápido es dxpdf?\",\"text\":\"En un Apple M3 Max, las fixtures versionadas se convierten en 55-170 ms y un documento de 171 páginas y 14 MB en unos 420 ms. Importa más cómo se resuelven las fuentes que el tamaño del documento: las fuentes incrustadas o ya presentes en el sistema se resuelven en unos 4 ms, mientras que recurrir al índice de metadatos del sistema cuesta entre 120 y 185 ms una sola vez. Es lo bastante rápido como para ejecutarse dentro de un manejador de peticiones web.\"},{\"title\":\"¿Puedo usar dxpdf en una aplicación Python?\",\"text\":\"Sí. Instálalo con pip install dxpdf. El paquete de Python envuelve el núcleo de Rust mediante PyO3 y ofrece rendimiento nativo. Usa dxpdf.convert() para bytes de entrada y salida, o dxpdf.convert_file() para conversión de archivo a archivo.\"},{\"title\":\"¿Puedo usar dxpdf desde Go?\",\"text\":\"Sí, desde la 0.6.0. Ejecuta go get github.com\u002Fnerdy-pro\u002Fdxpdf\u002Fgo y llama a dxpdf.Convert para bytes de entrada y salida o a dxpdf.ConvertFile para ir de archivo a archivo; ConvertWithOptions y ConvertFileWithOptions aceptan un DPI de imagen. Es una capa de cgo sobre el mismo núcleo de Rust, así que necesita CGO_ENABLED=1 y un compilador de C. Admite linux y macOS en amd64 y arm64 y, desde la 0.8.1, también windows\u002Famd64: en Windows el binding carga dxpdf.dll de forma dinámica, así que distribuye esa DLL junto a tu ejecutable. El módulo de Go no tiene etiquetas propias, así que fíjalo con un SHA de commit en lugar de una etiqueta de versión.\"},{\"title\":\"¿Qué funcionalidades de DOCX no se admiten todavía?\",\"text\":\"Aún no admitidas: la reordenación de escrituras índicas, la partición automática de palabras, el control de cambios y los comentarios, SmartArt y gráficos, los bordes de página y la cuadrícula del documento, las imágenes WMF y SVG, los efectos de texto sombra, contorno, relieve y grabado, el sombreado de celdas por patrón, las tabulaciones y las etiquetas de numeración reflejadas bajo w:bidi y los formatos de numeración por conteo como chineseCounting. Parcialmente admitidas: el tachado y las versalitas se parsean pero no se renderizan, la mayoría de estilos de borde se aproximan con una línea sólida, el ajuste de imagen tight y through usa el rectángulo contenedor en lugar de un polígono, de EMF solo se decodifica un único mapa de bits incrustado, los saltos de sección even, odd y nextColumn se tratan como nextPage, los anchos de celda en porcentaje y automáticos recurren a la cuadrícula de la tabla, y la sustitución de fuente glifo a glifo toma el carácter que falta de cualquier fuente del sistema que lo cubra, por lo que la salida depende del sistema y todavía no se pasa la pista w:lang, lo que puede dar al texto han las formas de glifo del idioma equivocado.\"}]",[1369,1370,1371],"style",{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sw1J6, html code.shiki .sw1J6{--shiki-light:#F76D47;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s3--O, html code.shiki .s3--O{--shiki-light:#E2931D;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":251,"searchDepth":446,"depth":446,"links":1373},[1374,1375,1376,1377,1383,1384,1390],{"id":176,"depth":446,"text":177},{"id":223,"depth":446,"text":224},{"id":295,"depth":446,"text":296},{"id":411,"depth":446,"text":412,"children":1378},[1379,1380,1381,1382],{"id":416,"depth":556,"text":417},{"id":461,"depth":556,"text":462},{"id":885,"depth":556,"text":886},{"id":948,"depth":556,"text":949},{"id":1140,"depth":446,"text":1141},{"id":1264,"depth":446,"text":1265,"children":1385},[1386,1387,1388,1389],{"id":1268,"depth":556,"text":1269},{"id":1278,"depth":556,"text":1279},{"id":1285,"depth":556,"text":1286},{"id":1292,"depth":556,"text":1293},{"id":1306,"depth":446,"text":1307},"Un conversor de DOCX a PDF rápido e independiente, escrito en Rust y basado en Skia, sin necesidad de Microsoft Office, LibreOffice ni APIs en la nube. Disponible como herramienta CLI, librería de Rust, paquete de Python y bindings de Go.","md",[1394,1397],{"type":1395,"url":1396},"crates_io","https:\u002F\u002Fcrates.io\u002Fcrates\u002Fdxpdf",{"type":1398,"url":1399},"pypi","https:\u002F\u002Fpypi.org\u002Fproject\u002Fdxpdf\u002F",{},"Conversor de DOCX a PDF rápido e independiente en Rust, basado en Skia, sin Office ni API en la nube. Como CLI, librería de Rust o Go y paquete de Python.",null,"Documentos de Word a PDF sin Office, sin LibreOffice y sin API en la nube: un binario en Rust que lee OOXML directamente y pinta con Skia.","\u002Fopen-source\u002Fdxpdf",{"type":1406,"company":1407,"name":169},"github","nerdy-pro",{"title":169,"description":1391},"open-source\u002Fdxpdf",[126,106,51],"2026-09-14","0LITHyCv04PCUOMaIW3pA2if0B7h1ako_STAE1NSfDM",{"forks":825,"stars":1414,"contributors":1415,"last_release":1434,"issues":1435,"has_contribution_guide":1436,"license":1437,"last_updated":1438,"watchers":1414},38,[1416,1421,1426,1430],{"login":1417,"profile_url":1418,"avatar_url":1419,"contributions":1420},"thenixan","https:\u002F\u002Fgithub.com\u002Fthenixan","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F3602098?v=4",1032,{"login":1422,"profile_url":1423,"avatar_url":1424,"contributions":1425},"markovdigital","https:\u002F\u002Fgithub.com\u002Fmarkovdigital","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F15268617?v=4",29,{"login":1427,"profile_url":1428,"avatar_url":1429,"contributions":831},"ikashapov","https:\u002F\u002Fgithub.com\u002Fikashapov","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F3253046?v=4",{"login":1431,"profile_url":1432,"avatar_url":1433,"contributions":446},"denizsafak","https:\u002F\u002Fgithub.com\u002Fdenizsafak","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F39929354?v=4","v0.8.1",19,false,"MIT","2026-09-14T14:36:47Z",[1440,1454,1471,1486,1499,1511,1524,1539,1552,1567,1580,1595,1607,1620,1633,1645,1662,1675,1688,1701,1715,1729,1741,1752,1766,1778,1791,1801,1810,1823,1835,1849,1856,1868,1879,1890,1902,1917,1930,1943,1955,1966,1980,1994,2006,2017,2029,2040,2053,2065,2076,2090,2099],{"slug":1441,"term":1442,"definition":1443,"category":1444,"aliases":1445,"links":1447,"related":1451,"readMore":-1,"target":1453,"hasArticle":1436},"aosp","AOSP","El Android Open Source Project: Android sin la capa de Google encima, que cualquiera puede forkear. Los terminales de punto de venta, los kioscos y los sistemas de a bordo funcionan sobre forks suyos, y trabajar a ese nivel expone partes del SO que un desarrollador de apps nunca ve.","platform",[1446],"Android Open Source Project",[1448],{"kind":1449,"url":1450},"website","https:\u002F\u002Fsource.android.com\u002F",[1452],"host-card-emulation","\u002Fglossary#aosp",{"slug":1455,"term":1456,"definition":1457,"category":1458,"aliases":1459,"links":1464,"related":1468,"readMore":-1,"target":1470,"hasArticle":1436},"object-storage","Almacenamiento de objetos","Almacenamiento que guarda un archivo entero bajo una clave en vez de en un árbol de directorios: Amazon S3 y los muchos servicios que hablan su API. Barato, casi ilimitado y el hogar habitual de eventos en bruto, backups y multimedia: se escriben una vez, se leen poco y se guardan para siempre.","architecture",[1460,1461,1462,1463],"S3","almacenamiento compatible con S3","object storage","blob storage",[1465],{"kind":1466,"url":1467},"wikipedia","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FObject_storage",[1469],"bigquery","\u002Fglossary#object-storage",{"slug":1472,"term":1473,"definition":1474,"category":1475,"aliases":1476,"links":1481,"related":1482,"readMore":-1,"target":1485,"hasArticle":1436},"staff-augmentation","Ampliación de equipo","Un modelo de contratación en el que ingenieros de un socio externo se suman a tu equipo y trabajan bajo tu gestión —en tu repositorio, tus sprints, tu proceso— en vez de entregar un proyecto propio. Compras capacidad; el código y el contexto se quedan contigo.","business",[1477,1478,1479,1480],"staff augmentation","team augmentation","desarrolladores dedicados","outstaffing",[],[1483,1484],"total-cost-of-ownership","time-to-market","\u002Fglossary#staff-augmentation",{"slug":1487,"term":1488,"definition":1489,"category":1444,"aliases":1490,"links":1491,"related":1495,"readMore":-1,"target":1498,"hasArticle":1436},"app-clips","App Clips","Una función de Apple que ejecuta una porción pequeña de una app de iOS —menos de 15 MB— sin instalarla entera. Se invoca desde un código QR, una etiqueta NFC o un enlace, para cuando lo primero que hace un usuario no debería exigir pasar por la tienda.",[],[1492],{"kind":1493,"url":1494},"documentation","https:\u002F\u002Fdeveloper.apple.com\u002Fapp-clips\u002F",[1496,1497],"deep-linking","install-referrer","\u002Fglossary#app-clips",{"slug":1469,"term":1500,"definition":1501,"category":1444,"aliases":1502,"links":1503,"related":1508,"readMore":-1,"target":1510,"hasArticle":1436},"BigQuery","El almacén analítico de Google Cloud. Le lanzas SQL a miles de millones de filas y las recorre en segundos, sobre un almacenamiento separado de las máquinas que consultan, que es lo que mantiene los informes y la exploración fuera de la base de datos que sirve tráfico real.",[],[1504,1506],{"kind":1449,"url":1505},"https:\u002F\u002Fcloud.google.com\u002Fbigquery",{"kind":1466,"url":1507},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FBigQuery",[1455,1509],"elasticsearch","\u002Fglossary#bigquery",{"slug":219,"term":1512,"definition":1513,"category":1514,"aliases":1515,"links":1519,"related":1522,"readMore":-1,"target":1523,"hasArticle":1436},"CI\u002FCD","Automatización que compila, testea y publica cada cambio sin que nadie ejecute comandos a mano. En móvil es lo que convierte una release en pulsar un botón en lugar de en una tarde esperando a que alguien esté disponible.","practice",[1516,1517,1518],"CI","integración continua","entrega continua",[1520],{"kind":1466,"url":1521},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCI\u002FCD",[],"\u002Fglossary#ci-cd",{"slug":1525,"term":1526,"definition":1527,"category":1458,"aliases":1528,"links":1532,"related":1535,"readMore":-1,"target":1538,"hasArticle":1436},"headless-cms","CMS headless","Un sistema de contenidos con editor y API pero sin frontend propio. Los editores publican en un solo sitio y el sitio web o la app renderizan ese contenido por su cuenta, así que la capa de presentación es tuya y no del proveedor del CMS.",[1529,1530,1531],"headless CMS","gestor de contenidos headless","API de contenidos",[1533],{"kind":1466,"url":1534},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHeadless_content_management_system",[1536,1537],"server-side-rendering","rest","\u002Fglossary#headless-cms",{"slug":1540,"term":1541,"definition":1542,"category":1458,"aliases":1543,"links":1546,"related":1549,"readMore":-1,"target":1551,"hasArticle":1436},"crud","CRUD","Create, read, update, delete: las cuatro operaciones detrás de casi todo formulario y pantalla de administración. Nombre corto para la mitad rutinaria de una app, la que gestiona datos, frente a la que lleva la lógica de dominio.",[1544,1545],"Create, Read, Update, Delete","crear, leer, actualizar, borrar",[1547],{"kind":1466,"url":1548},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCreate,_read,_update_and_delete",[1537,1550],"graphql","\u002Fglossary#crud",{"slug":1553,"term":1554,"definition":1555,"category":1458,"aliases":1556,"links":1560,"related":1563,"readMore":-1,"target":1566,"hasArticle":1436},"end-to-end-encryption","Cifrado de extremo a extremo","Cifrado aplicado en el dispositivo que envía y deshecho solo en el que recibe, de modo que el servicio que transporta el mensaje no puede leerlo: ni por orden judicial ni tras una brecha. Protege el contenido y nunca los metadatos.",[1557,1558,1559],"E2EE","cifrado extremo a extremo","end-to-end encryption",[1561],{"kind":1466,"url":1562},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FEnd-to-end_encryption",[1564,1565],"tls","jwt","\u002Fglossary#end-to-end-encryption",{"slug":1568,"term":1569,"definition":1570,"category":1458,"aliases":1571,"links":1575,"related":1578,"readMore":-1,"target":1579,"hasArticle":1436},"floating-point","Coma flotante","El formato binario IEEE 754 detrás de double y float. No puede representar 0,1 de forma exacta, así que 0,1 + 0,2 da 0,30000000000000004: invisible en gráficos y fatal en dinero, que va en unidades menores enteras o en un tipo decimal.",[1572,1573,1574],"IEEE 754","double","aritmética de coma flotante",[1576],{"kind":1466,"url":1577},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FIEEE_754",[],"\u002Fglossary#floating-point",{"slug":1581,"term":1582,"definition":1583,"category":1475,"aliases":1584,"links":1589,"related":1592,"readMore":-1,"target":1594,"hasArticle":1436},"in-app-purchase","Compra dentro de la app","Vender bienes digitales o una suscripción a través de la facturación de Apple o Google, obligatoria para contenido digital en ambas tiendas y sujeta a comisión. Lo difícil nunca es la compra: es restaurarla en un dispositivo nuevo y mantener honesto el estado de los derechos.",[1585,1586,1587,1588],"IAP","in-app purchase","compras integradas","suscripción in-app",[1590],{"kind":1493,"url":1591},"https:\u002F\u002Fdeveloper.apple.com\u002Fin-app-purchase\u002F",[1593],"product-market-fit","\u002Fglossary#in-app-purchase",{"slug":1483,"term":1596,"definition":1597,"category":1475,"aliases":1598,"links":1602,"related":1605,"readMore":-1,"target":1606,"hasArticle":1436},"Coste total de propiedad","Lo que cuesta un producto a lo largo de toda su vida, no solo construirlo: mantenimiento, actualizaciones, migraciones anuales de SO y de tiendas, y el segundo equipo que contratas para mantener dos bases de código alineadas. Suele superar al presupuesto de desarrollo, y casi nunca va dentro.",[1599,1600,1601],"TCO","total cost of ownership","coste de propiedad",[1603],{"kind":1466,"url":1604},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FTotal_cost_of_ownership",[1484],"\u002Fglossary#total-cost-of-ownership",{"slug":1608,"term":1609,"definition":1610,"category":1611,"aliases":1612,"links":1615,"related":1618,"readMore":-1,"target":1619,"hasArticle":1436},"post-quantum-cryptography","Criptografía poscuántica","Algoritmos de cifrado pensados para resistir a un futuro ordenador cuántico, ya estandarizados por el NIST. La migración urge antes que el hardware: el tráfico capturado hoy puede descifrarse cuando esa máquina exista.","protocol",[1613,1614],"PQC","cifrado poscuántico",[1616],{"kind":1466,"url":1617},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPost-quantum_cryptography",[1564,1553],"\u002Fglossary#post-quantum-cryptography",{"slug":1496,"term":1621,"definition":1622,"category":1444,"aliases":1623,"links":1628,"related":1631,"readMore":1632,"target":1632,"hasArticle":635},"Deep linking","Un enlace que abre una pantalla concreta dentro de una app instalada en vez de su pantalla de inicio o una página web. El deep linking diferido sobrevive a la instalación, así que un toque que pasa por la tienda acaba igualmente en la pantalla correcta.",[1624,1625,1626,1627],"deep linking diferido","enlaces profundos","universal links","Android App Links",[1629],{"kind":1466,"url":1630},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMobile_deep_linking",[1487,1497],"\u002Fglossary\u002Fdeep-linking",{"slug":1634,"term":1635,"definition":1636,"category":1514,"aliases":1637,"links":1641,"related":1642,"readMore":-1,"target":1644,"hasArticle":1436},"staged-rollout","Despliegue escalonado","Publicar una build primero a un porcentaje pequeño de usuarios y ampliarlo solo cuando la tasa sin fallos aguanta. Una build mala detectada al diez por ciento es una tarde mala; esa misma build al cien por cien es una semana mala.",[1638,1639,1640],"staged rollout","lanzamiento por fases","release canaria",[],[1643,219],"feature-flags","\u002Fglossary#staged-rollout",{"slug":1646,"term":1647,"definition":1648,"category":1514,"aliases":1649,"links":1654,"related":1659,"readMore":-1,"target":1661,"hasArticle":1436},"dev-container","Dev Container","Un entorno de desarrollo descrito una sola vez en devcontainer.json —el SO, las herramientas y las versiones de runtime que un proyecto necesita— y abierto de forma idéntica en un contenedor por el editor de cada colaborador, en vez de una guía que cada quien interpreta a su manera.",[1650,1651,1652,1653],"devcontainer.json","Dev Containers","VS Code Dev Containers","contenedor de desarrollo",[1655,1657],{"kind":1449,"url":1656},"https:\u002F\u002Fcontainers.dev\u002F",{"kind":1493,"url":1658},"https:\u002F\u002Fcode.visualstudio.com\u002Fdocs\u002Fdevcontainers\u002Fcontainers",[1660],"container-registry","\u002Fglossary#dev-container",{"slug":1509,"term":1663,"definition":1664,"category":1444,"aliases":1665,"links":1668,"related":1673,"readMore":-1,"target":1674,"hasArticle":1436},"Elasticsearch","Un motor de búsqueda y analítica que indexa registros para poder filtrarlos y buscarlos de forma interactiva en vez de recorrerlos. Lo que usas cuando la pregunta es «enséñame estas sesiones concretas, filtradas de seis maneras» y no «suma esta columna».",[1666,1667],"Elastic","ELK",[1669,1671],{"kind":1449,"url":1670},"https:\u002F\u002Fwww.elastic.co\u002Felasticsearch",{"kind":1466,"url":1672},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FElasticsearch",[1469],"\u002Fglossary#elasticsearch",{"slug":1593,"term":1676,"definition":1677,"category":1475,"aliases":1678,"links":1682,"related":1685,"readMore":-1,"target":1687,"hasArticle":1436},"Encaje producto-mercado","El punto en el que un producto ha encontrado de forma demostrable a gente que lo quiere: lo usa, vuelve y paga. Antes de eso la ingeniería responde a una pregunta; después, responde a la demanda.",[1679,1680,1681],"PMF","product-market fit","product\u002Fmarket fit",[1683],{"kind":1466,"url":1684},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FProduct-market_fit",[1686,1484],"mvp","\u002Fglossary#product-market-fit",{"slug":1689,"term":1690,"definition":1691,"category":1458,"aliases":1692,"links":1695,"related":1696,"readMore":-1,"target":1700,"hasArticle":1436},"fan-out","Fan-out","Leer una fuente una sola vez y entregar cada actualización a todos los clientes suscritos. La versión ingenua escribe a los suscriptores en un bucle y se atasca en cuanto un socket va lento; una real usa un búfer por cliente y descarta a quien no siga el ritmo.",[1693,1694],"fanout","difusión",[],[1697,1698,1699],"websocket","pub-sub","server-sent-events","\u002Fglossary#fan-out",{"slug":1643,"term":1702,"definition":1703,"category":1514,"aliases":1704,"links":1708,"related":1711,"readMore":-1,"target":1714,"hasArticle":1436},"Feature flags","Interruptores que activan o desactivan funcionalidad desde la configuración y no desde una release. Permiten que un mismo binario se comporte distinto por marca, mercado o usuario, y apagar una función arriesgada sin pasar una build nueva por revisión.",[1705,1706,1707],"feature flag","feature toggle","banderas de funcionalidad",[1709],{"kind":1466,"url":1710},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FFeature_toggle",[1634,1712,1713],"white-label","multi-tenancy","\u002Fglossary#feature-flags",{"slug":1716,"term":1717,"definition":1718,"category":1458,"aliases":1719,"links":1723,"related":1726,"readMore":-1,"target":1728,"hasArticle":1436},"state-management","Gestión de estado","Cómo decide una app dónde vive un valor, quién puede cambiarlo y qué partes de la pantalla se redibujan cuando lo hace. En Flutter, elegir entre Riverpod, BLoC y Provider es de las primeras decisiones arquitectónicas y de las más difíciles de revisar.",[1720,1721,1722],"state management","BLoC","Riverpod",[1724],{"kind":1493,"url":1725},"https:\u002F\u002Fdocs.flutter.dev\u002Fdata-and-backend\u002Fstate-mgmt\u002Foptions",[1727],"golden-test","\u002Fglossary#state-management",{"slug":1727,"term":1730,"definition":1731,"category":1514,"aliases":1732,"links":1736,"related":1739,"readMore":-1,"target":1740,"hasArticle":1436},"Golden test","Un test que renderiza un widget y compara el resultado píxel a píxel con una imagen de referencia guardada. En Flutter es la forma más barata de saber si un rediseño rompió el estado vacío a 320 pt, en modo oscuro y con el texto al 200 %.",[1733,1734,1735],"golden tests","test de captura","snapshot test",[1737],{"kind":1493,"url":1738},"https:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fflutter_test\u002FmatchesGoldenFile.html",[219],"\u002Fglossary#golden-test",{"slug":1550,"term":1742,"definition":1743,"category":1458,"aliases":1744,"links":1745,"related":1750,"readMore":-1,"target":1751,"hasArticle":1436},"GraphQL","Un lenguaje de consulta para APIs donde el cliente nombra exactamente los campos que quiere y recibe una única respuesta con esa forma. Elimina el exceso de datos al que derivan los endpoints REST y añade un fallo propio: una consulta sin límites que recorre todo el modelo.",[],[1746,1748],{"kind":1449,"url":1747},"https:\u002F\u002Fgraphql.org\u002F",{"kind":1466,"url":1749},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FGraphQL",[1537],"\u002Fglossary#graphql",{"slug":1753,"term":1754,"definition":1755,"category":1514,"aliases":1756,"links":1758,"related":1761,"readMore":-1,"target":1765,"hasArticle":1436},"hipaa","HIPAA","La ley estadounidense que regula la información sanitaria protegida: cómo puede almacenarse, transmitirse, registrarse y divulgarse. Como PCI-DSS, es una restricción arquitectónica que se elige al principio, no un documento de políticas que se añade antes del lanzamiento.",[1757],"Health Insurance Portability and Accountability Act",[1759],{"kind":1466,"url":1760},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHealth_Insurance_Portability_and_Accountability_Act",[1762,1763,1764],"pci-dss","gdpr","soc-2","\u002Fglossary#hipaa",{"slug":1452,"term":1767,"definition":1768,"category":1444,"aliases":1769,"links":1773,"related":1776,"readMore":-1,"target":1777,"hasArticle":1436},"Host Card Emulation","Permitir que un móvil Android actúe por software como una tarjeta contactless sobre NFC, sin elemento seguro por hardware. Es así como paga una app de wallet en un terminal: el teléfono habla el mismo protocolo EMV contactless que habría hablado la tarjeta de plástico.",[1770,1771,1772],"HCE","EMV Contactless","pagos contactless",[1774],{"kind":1493,"url":1775},"https:\u002F\u002Fdeveloper.android.com\u002Fdevelop\u002Fconnectivity\u002Fnfc\u002Fhce",[1762,1441],"\u002Fglossary#host-card-emulation",{"slug":1779,"term":1780,"definition":1781,"category":1458,"aliases":1782,"links":1786,"related":1789,"readMore":-1,"target":1790,"hasArticle":1436},"multi-arch-image","Imagen multiarquitectura","Una única etiqueta de imagen que resuelve a binarios distintos según la arquitectura de CPU —linux\u002Famd64 y linux\u002Farm64 son el par habitual—, de modo que el mismo docker pull funciona sin cambios tanto en servidores Intel\u002FAMD como en portátiles con Apple Silicon.",[1783,1784,1785],"build multiarquitectura","multi-arch build","linux\u002Famd64 + linux\u002Farm64",[1787],{"kind":1493,"url":1788},"https:\u002F\u002Fdocs.docker.com\u002Fbuild\u002Fbuilding\u002Fmulti-platform\u002F",[1660],"\u002Fglossary#multi-arch-image",{"slug":1792,"term":1793,"definition":1794,"category":1444,"aliases":1795,"links":1796,"related":1799,"readMore":-1,"target":1800,"hasArticle":1436},"impeller","Impeller","El motor de renderizado que usa Flutter hoy, por defecto en iOS desde 2023 y en Android desde 2024. Compila sus shaders por adelantado en lugar de durante la primera animación, lo que eliminó el jank de shaders, el problema más visible de Flutter en producción.",[],[1797],{"kind":1493,"url":1798},"https:\u002F\u002Fdocs.flutter.dev\u002Fperf\u002Fimpeller",[230],"\u002Fglossary#impeller",{"slug":1497,"term":1802,"definition":1803,"category":1444,"aliases":1804,"links":1805,"related":1808,"readMore":-1,"target":1809,"hasArticle":1436},"Install Referrer","Una API de Google Play que entrega a una app Android recién instalada los parámetros de campaña del enlace que llevó a la instalación. La mitad Android del deep linking diferido y la forma fiable de atribuir de dónde viene un usuario.",[],[1806],{"kind":1493,"url":1807},"https:\u002F\u002Fdeveloper.android.com\u002Fgoogle\u002Fplay\u002Finstallreferrer",[1496,1487],"\u002Fglossary#install-referrer",{"slug":1811,"term":1812,"definition":1813,"category":1514,"aliases":1814,"links":1817,"related":1820,"readMore":-1,"target":1822,"hasArticle":1436},"prompt-injection","Inyección de prompts","Un ataque en el que el texto que aporta un usuario lo lee un modelo de lenguaje como instrucciones y no como datos, desviándolo de sus propias reglas. El hermano de la inyección SQL en la era de los LLM, y aparece donde se concatena entrada de usuario en un prompt.",[1815,1816],"prompt injection","ataque de inyección",[1818],{"kind":1466,"url":1819},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPrompt_injection",[1821],"rate-limiting","\u002Fglossary#prompt-injection",{"slug":1565,"term":1824,"definition":1825,"category":1611,"aliases":1826,"links":1828,"related":1833,"readMore":-1,"target":1834,"hasArticle":1436},"JWT","Un token firmado que lleva sus propios claims, de modo que un servidor puede saber a quién pertenece una petición sin consultar una sesión. Estándar para la autenticación móvil. La firma prueba que no se alteró; no oculta lo que hay dentro.",[1827],"JSON Web Token",[1829,1831],{"kind":1449,"url":1830},"https:\u002F\u002Fjwt.io\u002F",{"kind":1466,"url":1832},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FJSON_Web_Token",[1762],"\u002Fglossary#jwt",{"slug":1836,"term":1837,"definition":1838,"category":1514,"aliases":1839,"links":1844,"related":1847,"readMore":-1,"target":1848,"hasArticle":1436},"kyc","KYC","Know Your Customer: las verificaciones de identidad que hace un producto financiero regulado antes de dejar mover dinero —captura de documentos, prueba de vida, listas de sanciones y control antiblanqueo—. Condiciona el onboarding más que cualquier decisión de diseño.",[1840,1841,1842,1843],"Know Your Customer","AML","KYC\u002FAML","conocimiento del cliente",[1845],{"kind":1466,"url":1846},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FKnow_your_customer",[1762,1763],"\u002Fglossary#kyc",{"slug":76,"term":74,"definition":1850,"category":1444,"aliases":1851,"links":1853,"related":1854,"readMore":1855,"target":1855,"hasArticle":1436},"Compartir lógica de negocio escrita en Kotlin entre Android, iOS y el servidor mientras cada plataforma conserva su UI nativa. La alternativa a Flutter cuando la interfaz tiene que ser nativa pero las reglas que hay detrás no.",[1852],"KMP",[],[],"\u002Ftechnologies\u002Fkmp",{"slug":1821,"term":1857,"definition":1858,"category":1514,"aliases":1859,"links":1863,"related":1866,"readMore":-1,"target":1867,"hasArticle":1436},"Limitación de tasa","Un tope de cuántas peticiones puede hacer un mismo cliente en una ventana de tiempo. Es lo que impide que un usuario entusiasta, un scraper o un bot se gaste en una tarde un mes de presupuesto de API, y tiene que vivir en tu lado de la integración.",[1860,1861,1862],"rate limiting","rate limit","throttling",[1864],{"kind":1466,"url":1865},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FRate_limiting",[1811],"\u002Fglossary#rate-limiting",{"slug":1686,"term":1869,"definition":1870,"category":1475,"aliases":1871,"links":1874,"related":1877,"readMore":-1,"target":1878,"hasArticle":1436},"MVP","La versión más pequeña de un producto que puede ponerse delante de usuarios reales y aun así responder la pregunta por la que lo construiste. Una decisión sobre alcance, no sobre calidad: un MVP también tiene que funcionar.",[1872,1873],"producto mínimo viable","minimum viable product",[1875],{"kind":1466,"url":1876},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMinimum_viable_product",[1712],"\u002Fglossary#mvp",{"slug":1712,"term":1880,"definition":1881,"category":1475,"aliases":1882,"links":1885,"related":1888,"readMore":1889,"target":1889,"hasArticle":635},"Marca blanca","Un mismo producto publicado bajo muchas marcas. Una plataforma móvil de marca blanca construye para cada cliente una app lista para la tienda con su nombre, su diseño y su contenido desde una única base de código compartida, en vez de forkear el proyecto por cliente.",[1712,1883,1884],"white label","app multiinquilino",[1886],{"kind":1466,"url":1887},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWhite-label_product",[1686],"\u002Fglossary\u002Fwhite-label",{"slug":1713,"term":1891,"definition":1892,"category":1458,"aliases":1893,"links":1897,"related":1900,"readMore":-1,"target":1901,"hasArticle":1436},"Multi-tenancy","Un solo despliegue que sirve a muchos clientes, cada uno viendo solo sus datos, su configuración y sus funciones activas porque el contexto de tenant se resuelve en cada petición. Es lo que hace que una flota de apps de marca sea un producto y no muchos forks.",[1894,1895,1896],"multi-tenant","multiinquilino","tenant",[1898],{"kind":1466,"url":1899},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMultitenancy",[1712,1643],"\u002Fglossary#multi-tenancy",{"slug":1903,"term":1904,"definition":1905,"category":1611,"aliases":1906,"links":1910,"related":1915,"readMore":-1,"target":1916,"hasArticle":1436},"oauth","OAuth","El estándar detrás de Iniciar sesión con Apple, con Google y demás: el usuario autoriza tu app en un proveedor en el que ya confía y tu app recibe un token en lugar de su contraseña. Nadie inventa una credencial nueva y tú nunca almacenas ninguna.",[1907,1908,1909],"OAuth 2.0","login social","Iniciar sesión con Apple",[1911,1913],{"kind":1449,"url":1912},"https:\u002F\u002Foauth.net\u002F2\u002F",{"kind":1466,"url":1914},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FOAuth",[1565],"\u002Fglossary#oauth",{"slug":1762,"term":1918,"definition":1919,"category":1514,"aliases":1920,"links":1923,"related":1928,"readMore":-1,"target":1929,"hasArticle":1436},"PCI-DSS","El estándar de seguridad del sector de tarjetas que obliga a quien almacena, procesa o transmite datos de tarjeta. La mayoría de las apps se mantienen fuera de su alcance a propósito, delegando la introducción de la tarjeta en un proveedor de pagos certificado.",[1921,1922],"PCI DSS","Payment Card Industry Data Security Standard",[1924,1926],{"kind":1449,"url":1925},"https:\u002F\u002Fwww.pcisecuritystandards.org\u002F",{"kind":1466,"url":1927},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPayment_Card_Industry_Data_Security_Standard",[1565],"\u002Fglossary#pci-dss",{"slug":1931,"term":1932,"definition":1933,"category":1444,"aliases":1934,"links":1938,"related":1941,"readMore":-1,"target":1942,"hasArticle":1436},"platform-channels","Platform channels","El puente que usa una app Flutter para llamar a código nativo de iOS y Android: Keychain y Keystore, biometría, hojas de pago, cualquier SDK sin paquete de Dart. Trabajo rutinario pero real, y lo primero donde encalla quien nunca salió de Dart.",[1935,1936,1937],"platform channel","method channel","canales de plataforma",[1939],{"kind":1493,"url":1940},"https:\u002F\u002Fdocs.flutter.dev\u002Fplatform-integration\u002Fplatform-channels",[76],"\u002Fglossary#platform-channels",{"slug":1698,"term":1944,"definition":1945,"category":1458,"aliases":1946,"links":1950,"related":1953,"readMore":-1,"target":1954,"hasArticle":1436},"Pub\u002FSub","Un patrón de mensajería donde un productor publica un evento y cualquier número de consumidores lo lee de forma independiente, con un broker en medio. El productor nunca los espera, y así la ruta de la petición sigue siendo rápida mientras el trabajo lento ocurre detrás.",[1947,1948,1949],"publicación\u002Fsuscripción","publish\u002Fsubscribe","Google Cloud Pub\u002FSub",[1951],{"kind":1466,"url":1952},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPublish%E2%80%93subscribe_pattern",[],"\u002Fglossary#pub-sub",{"slug":1537,"term":1956,"definition":1957,"category":1458,"aliases":1958,"links":1961,"related":1964,"readMore":-1,"target":1965,"hasArticle":1436},"REST","El estilo convencional de las APIs HTTP: una URL nombra un recurso y el verbo HTTP dice qué hacer con él. La forma por defecto en que una app habla con un backend, y lo que esperan encontrar la mayoría de integraciones de terceros.",[1959,1960],"API REST","Representational State Transfer",[1962],{"kind":1466,"url":1963},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FREST",[1697,1699],"\u002Fglossary#rest",{"slug":1763,"term":1967,"definition":1968,"category":1514,"aliases":1969,"links":1973,"related":1978,"readMore":-1,"target":1979,"hasArticle":1436},"RGPD","El reglamento de la UE sobre los datos personales de las personas en la UE: una base legal para recogerlos, consentimiento real para el rastreo y derechos de acceso y supresión. Sigue a tus usuarios, no a tus servidores, así que se aplica esté donde esté la empresa.",[1970,1971,1972],"GDPR","Reglamento General de Protección de Datos","protección de datos",[1974,1976],{"kind":1449,"url":1975},"https:\u002F\u002Fgdpr.eu\u002F",{"kind":1466,"url":1977},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FGeneral_Data_Protection_Regulation",[1762,1764,1753],"\u002Fglossary#gdpr",{"slug":1660,"term":1981,"definition":1982,"category":1458,"aliases":1983,"links":1989,"related":1992,"readMore":-1,"target":1993,"hasArticle":1436},"Registro de contenedores","Almacenamiento alojado para imágenes de contenedores, direccionadas por nombre y etiqueta: Docker Hub, GitHub Container Registry o el propio de un proveedor cloud. Publicar una build ahí convierte 'funciona en mi máquina' en una imagen que cualquiera puede descargar y ejecutar sin cambios.",[1984,1985,1986,1987,1988],"registro de imágenes","Docker registry","GHCR","ghcr.io","container registry",[1990],{"kind":1493,"url":1991},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fpackages\u002Fworking-with-a-github-packages-registry\u002Fworking-with-the-container-registry",[1646,1779],"\u002Fglossary#container-registry",{"slug":1536,"term":1995,"definition":1996,"category":1458,"aliases":1997,"links":2001,"related":2004,"readMore":-1,"target":2005,"hasArticle":1436},"Renderizado en servidor","Construir una página como HTML terminado en el servidor, de modo que la primera respuesta ya lleva el contenido, los encabezados, las metaetiquetas y los datos estructurados. Los rastreadores, las vistas previas de enlaces y los dispositivos lentos lo leen sin ejecutar JavaScript.",[1998,1999,2000],"SSR","server-side rendering","renderizado del lado del servidor",[2002],{"kind":1466,"url":2003},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FServer-side_scripting",[1525],"\u002Fglossary#server-side-rendering",{"slug":1764,"term":2007,"definition":2008,"category":1514,"aliases":2009,"links":2012,"related":2015,"readMore":-1,"target":2016,"hasArticle":1436},"SOC 2","Un informe de auditoría externa sobre cómo trata una organización los datos de clientes —seguridad, disponibilidad, confidencialidad— y no un certificado que se compra. Los clientes empresariales lo piden, y condiciona la arquitectura mucho antes que la propia auditoría.",[2010,2011],"SOC2","System and Organization Controls",[2013],{"kind":1466,"url":2014},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSystem_and_Organization_Controls",[1762,1763,1753],"\u002Fglossary#soc-2",{"slug":2018,"term":2019,"definition":2020,"category":1475,"aliases":2021,"links":2024,"related":2027,"readMore":-1,"target":2028,"hasArticle":1436},"saas","SaaS","Software vendido como suscripción continua a un producto alojado, en lugar de como una licencia única que el cliente instala y opera. El proveedor mantiene los servidores, publica actualizaciones sin parar y cobra por usuario o por uso.",[2022,2023],"Software as a Service","software como servicio",[2025],{"kind":1466,"url":2026},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSoftware_as_a_service",[1713,1712],"\u002Fglossary#saas",{"slug":1699,"term":2030,"definition":2031,"category":1611,"aliases":2032,"links":2035,"related":2038,"readMore":-1,"target":2039,"hasArticle":1436},"Server-Sent Events","Un flujo unidireccional del servidor al cliente sobre una conexión HTTP corriente. Más simple que un WebSocket y suficiente allí donde solo el servidor tiene algo que decir: un feed de progreso, o una respuesta de IA que llega token a token.",[2033,2034],"SSE","eventos enviados por el servidor",[2036],{"kind":1466,"url":2037},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FServer-sent_events",[1697,1537],"\u002Fglossary#server-sent-events",{"slug":230,"term":2041,"definition":2042,"category":1444,"aliases":2043,"links":2046,"related":2051,"readMore":-1,"target":2052,"hasArticle":1436},"Skia","La librería gráfica 2D de código abierto de Google que dibuja Chrome, Android y —hasta Impeller— cada fotograma de Flutter. Renderiza tanto a PDF como a pantalla, que es lo que hace la función de imprimir a PDF de Chrome.",[2044,2045],"Skia Graphics Engine","skia-safe",[2047,2049],{"kind":1449,"url":2048},"https:\u002F\u002Fskia.org\u002F",{"kind":1466,"url":2050},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSkia_Graphics_Engine",[1792],"\u002Fglossary#skia",{"slug":1564,"term":2054,"definition":2055,"category":1611,"aliases":2056,"links":2060,"related":2063,"readMore":-1,"target":2064,"hasArticle":1436},"TLS","La capa de cifrado bajo HTTPS. Demuestra que el servidor es quien dice su certificado, acuerda una clave nueva para la sesión y cifra todo lo demás, de modo que la red intermedia solo ve texto cifrado que no puede alterar sin que se note.",[2057,2058,2059],"SSL","HTTPS","Transport Layer Security",[2061],{"kind":1466,"url":2062},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FTransport_Layer_Security",[1553,1565],"\u002Fglossary#tls",{"slug":1484,"term":2066,"definition":2067,"category":1475,"aliases":2068,"links":2071,"related":2074,"readMore":-1,"target":2075,"hasArticle":1436},"Time to market","Cuánto se tarda en llevar un producto desde la decisión hasta usuarios reales. Casi todas las discusiones sobre stack y alcance son en realidad discusiones sobre este número, porque cada semana ahorrada es una semana de ingresos, feedback y posición competitiva.",[2069,2070],"TTM","tiempo de salida al mercado",[2072],{"kind":1466,"url":2073},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FTime_to_market",[1686,1483],"\u002Fglossary#time-to-market",{"slug":2077,"term":2078,"definition":2079,"category":1611,"aliases":2080,"links":2082,"related":2087,"readMore":-1,"target":2089,"hasArticle":1436},"webrtc","WebRTC","El estándar de navegador y móvil para enviar audio, vídeo y datos directamente entre dos dispositivos, con los servidores implicados solo en presentarlos entre sí. Es sobre lo que se construye una videollamada dentro de una app cuando no es un SDK alquilado.",[2081],"Web Real-Time Communication",[2083,2085],{"kind":1449,"url":2084},"https:\u002F\u002Fwebrtc.org\u002F",{"kind":1466,"url":2086},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWebRTC",[2088,1697],"xmpp","\u002Fglossary#webrtc",{"slug":1697,"term":2091,"definition":2092,"category":1611,"aliases":2093,"links":2094,"related":2097,"readMore":-1,"target":2098,"hasArticle":1436},"WebSocket","Un protocolo que mantiene una conexión abierta entre cliente y servidor para que cualquiera de los dos pueda enviar en cualquier momento, en vez de que el cliente pregunte una y otra vez. Sobre esto funcionan los precios en vivo, el chat y los indicadores de presencia.",[],[2095],{"kind":1466,"url":2096},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWebSocket",[1699,1537],"\u002Fglossary#websocket",{"slug":2088,"term":2100,"definition":2101,"category":1611,"aliases":2102,"links":2105,"related":2110,"readMore":-1,"target":2111,"hasArticle":1436},"XMPP","Un protocolo de mensajería abierto y federado, y la alternativa de siempre a escribir un backend de chat o alquilarlo. Se extiende a presencia, indicadores de escritura y transferencia de archivos, y es lo bastante antiguo como para que cada plataforma tenga una librería madura.",[2103,2104],"Jabber","Extensible Messaging and Presence Protocol",[2106,2108],{"kind":1449,"url":2107},"https:\u002F\u002Fxmpp.org\u002F",{"kind":1466,"url":2109},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FXMPP",[2077,1697],"\u002Fglossary#xmpp"]