> /home/jd
ES / EN

CV como código: datos estructurados y PDF lineal con LuaLaTeX

Cómo comparto el contenido entre la web y dos PDF verificables, sin confundir controles técnicos con una garantía universal de compatibilidad ATS.

Mantener un CV web y otro archivo editable por separado termina creando divergencias. Una fecha se corrige en un lugar, un proyecto cambia en otro y ya no queda claro cuál representa el estado profesional vigente.

La primera versión de este portfolio resolvía ese problema imprimiendo /cv y /en/cv con un navegador headless. El texto se extraía correctamente, pero el PDF también heredaba iconos, badges y alineaciones pensadas para una pantalla. Eso era innecesario para un documento que puede terminar en un parser de reclutamiento.

El flujo actual separa dos responsabilidades:

  • la web conserva la presentación visual;
  • la descarga usa una estructura lineal y predecible.

Ambas salidas leen los mismos datos.

Una fuente de contenido, dos redacciones

src/data/cvProfile.js contiene la identidad y dos objetos editoriales explícitos: español e inglés. Cada uno define su resumen, experiencia, educación, proyectos, habilidades, idiomas y metadatos.

No existe traducción automática entre ellos. Compartir la estructura impide que la web y el PDF discrepen dentro de un idioma; la revisión humana sigue siendo responsable de que ambos idiomas expresen hechos equivalentes sin borrar sus matices.

Las rutas web pasan esos datos a un componente Astro. El generador de PDF los transforma temporalmente en LaTeX:

Text
cvProfile.js
├── CvPage.astro → /cv y /en/cv
└── generate-cv-pdf.js → LuaLaTeX → PDF ES y EN

La fuente .tex es derivada y descartable. No se mantiene una segunda versión manual del CV.

Por qué la descarga es lineal

Greenhouse documenta problemas de parsing asociados con gráficos, tablas complejas, encabezados, pies, cajas de texto y columnas. Lever propone comprobar primero que el texto del PDF pueda seleccionarse. SAP también aclara que la extracción no alcanza una precisión total.

No hay una plantilla capaz de garantizar el comportamiento de todos los ATS. Sí hay decisiones prudentes y comprobables. Por eso el PDF:

  • usa una sola columna;
  • no contiene tablas, imágenes, iconos, encabezados, pies ni cajas de texto;
  • presenta contacto, perfil, habilidades, experiencia, proyectos, educación e idiomas en una única secuencia;
  • emplea títulos de sección convencionales;
  • se compila como PDF 1.7 etiquetado mediante LuaLaTeX;
  • usa fuentes embebidas con mapeo Unicode.

La guía oficial del proyecto de etiquetado de LaTeX permite activar esa estructura antes de cargar la clase del documento.

Generación y validación

La ejecución sigue siendo deliberada:

Bash
npm run cv:gen

El comando genera y compila los dos idiomas en un directorio temporal. Antes de reemplazar las descargas públicas comprueba:

  1. tamaño A4, hasta dos páginas y menos de 2,5 MB;
  2. metadatos, etiquetas y ausencia de cifrado;
  3. fuentes embebidas, Unicode y ausencia de Type 3;
  4. texto extraíble sin caracteres de reemplazo;
  5. identidad, organizaciones, proyectos y formación esperados;
  6. orden de las secciones.

Si una compilación o una validación falla, el proceso termina con error y no publica un par incompleto. El mismo contrato puede repetirse con:

Bash
npm run cv:check

En la revisión final también comparo la extracción de Poppler, pypdf y pdfplumber y renderizo cada página como imagen para detectar cortes, solapamientos o glifos defectuosos.

Qué significa —y qué no significa— el resultado

Los PDF actuales son pequeños, seleccionables y lineales. Eso reduce problemas conocidos y hace que un fallo sea visible durante el mantenimiento.

No demuestra que una plataforma concreta vaya a interpretar cada campo del mismo modo, ni habilita la etiqueta comercial de “100 % compatible con ATS”. Una plataforma con requisitos propios todavía puede exigir otro formato, por ejemplo DOCX.

El valor del flujo está en otro lugar: una única fuente de hechos por idioma, una salida diseñada para lectura automática y controles que fallan cuando dejan de cumplirse. La exactitud profesional continúa dependiendo de una revisión consciente.