Latenode

Conversión de HTML a PDF con Puppeteer: configuración de estilos y paginación

Aprenda a convertir HTML a PDF de forma eficiente con Puppeteer, con especial atención a la configuración de estilos, la paginación y la optimización del rendimiento.

6 min de lectura
Documento HTML convertido en PDF con estilos de impresión y saltos de página

Convertir HTML en PDF es esencial para crear documentos estandarizados como informes, facturas y materiales para clientes. Puppeteer, una herramienta de automatización de navegadores, le ayuda a gestionar estilos, diseños y saltos de página para obtener resultados profesionales en PDF. A continuación, se muestra un resumen rápido de lo que puede hacer con Puppeteer:

  • Generar PDF: Utilice Puppeteer para convertir HTML en PDF pulidos mientras ejecuta JavaScript y aplica CSS personalizado.
  • Controlar estilos: Defina tamaños de página, márgenes, fuentes, encabezados, pies de página y más con CSS específico para impresión.
  • Gestionar saltos de página: Utilice reglas CSS para evitar dividir tablas, encabezados o imágenes entre páginas.
  • Optimizar el rendimiento: Mejore la calidad y reduzca el tamaño de archivo mediante escalado, optimización de imágenes y una gestión eficiente de recursos.

Inicio rápido: Instale Puppeteer con npm install puppeteer, cargue su HTML (como cadena, archivo local o URL) y configure los ajustes del PDF, como dimensiones, márgenes y renderizado de fondos. Utilice reglas CSS @media print para tener un mayor control sobre los estilos de impresión.

Funciones principales:

  • Personalización de páginas mediante reglas @page.
  • Plantillas de encabezado y pie de página para diseños profesionales.
  • Gestión de contenido multipágina para evitar divisiones incómodas en tablas o texto.

Con Puppeteer, puede automatizar y personalizar la generación de PDF para obtener resultados uniformes y de alta calidad.

🌐 Convierta HTML a PDF con Puppeteer en Node.js 🚀 Guía completa paso a paso ...

Introducción a Puppeteer

Aprenda a configurar y utilizar Puppeteer para generar PDF. Siga estos pasos para empezar.

Configuración

Antes de comenzar, asegúrese de tener instalada en su sistema la versión 14.0.0 o superior de Node.js. A continuación, se explica cómo configurar todo:

  • Instale Node.js: Descárguelo desde nodejs.org y complete la instalación.
  • Cree una carpeta de proyecto: Cree una nueva carpeta para su proyecto.
  • Inicialice el proyecto: Abra una terminal en la carpeta del proyecto y ejecute npm init -y.
  • Instale Puppeteer: Utilice el comando npm install puppeteer para añadir Puppeteer a su proyecto.

Primer script de generación de PDF

Este es un script básico para convertir HTML en PDF con Puppeteer:

const puppeteer = require('puppeteer');

async function generatePDF() {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  // Set page content
  await page.setContent(`
    <html>
      <body>
        <h1>Sample PDF Document</h1>
        <p>Generated with Puppeteer</p>
      </body>
    </html>
  `);

  // Generate PDF
  await page.pdf({
    path: 'output.pdf',
    format: 'Letter',
    margin: {
      top: '1in',
      right: '1in',
      bottom: '1in',
      left: '1in'
    }
  });

  await browser.close();
}

generatePDF();

Guarde este script como generate-pdf.js. Ejecútelo escribiendo node generate-pdf.js en su terminal. El script creará un PDF con dimensiones US Letter (8,5×11 pulgadas) y márgenes de 1 pulgada.

Opciones de origen del HTML

Puppeteer ofrece varias formas de cargar contenido HTML para generar PDF:

  • Carga directa de contenido: Utilice una cadena que contenga el HTML.

    await page.setContent(htmlString);
    
  • Acceso a archivos locales: Cargue un archivo HTML desde su sistema local.

    await page.goto(`file:${path.join(__dirname, 'template.html')}`);
    
  • Carga desde URL remota: Obtenga HTML desde un sitio web activo.

    await page.goto('https://yourwebsite.com/page-to-convert');
    

Al trabajar con recursos externos, como imágenes o estilos, asegúrese de que estén integrados, utilicen URL absolutas o estén almacenados localmente.

Consejos para mejorar el rendimiento

Para garantizar una generación de PDF fluida, tenga en cuenta estas recomendaciones:

  • Utilice page.waitForNetworkIdle() para esperar a que finalicen todas las solicitudes de red.
  • Establezca tiempos de espera adecuados para cargar recursos.
  • Gestione explícitamente la carga de fuentes para evitar problemas de renderizado.

Cuando su HTML esté listo, podrá personalizar los estilos y ajustes del PDF.

Ajustes de estilo del PDF

Reglas CSS específicas para impresión

Para adaptar su contenido a la salida en PDF, utilice reglas @media print. Este es un ejemplo:

@media print {
  /* Hide navigation menus and non-essential elements */
  nav, button, .no-print {
    display: none;
  }

  /* Adjust text for better readability in PDFs */
  body {
    font-size: 12pt;
    line-height: 1.5;
  }

  /* Ensure accurate background rendering */
  * {
    -webkit-print-color-adjust: exact;
  }
}

Si desea conservar los estilos basados en pantalla en lugar de aplicar estilos específicos para impresión, incluya esta línea antes de generar el PDF:

await page.emulateMediaType('screen');

Una vez aplicados los estilos de impresión, puede continuar con los ajustes de diseño.

Ajustes de diseño de página

Defina las dimensiones del PDF mediante opciones de Puppeteer o reglas CSS @page. Para Puppeteer, puede utilizar la siguiente configuración:

await page.pdf({
  format: 'Letter',
  margin: {
    top: '0.75in',
    right: '0.5in',
    bottom: '0.75in',
    left: '0.5in'
  },
  landscape: false,
  preferCSSPageSize: true
});

Para tamaños de página más personalizados, utilice reglas CSS @page:

@page {
  size: 8.5in 11in;
  margin: 0.75in 0.5in;
}

Tras configurar el diseño, puede ajustar los elementos de diseño para conseguir un aspecto más cuidado.

Elementos de texto y diseño

Para que el contenido sea visualmente claro y profesional, utilice estas reglas CSS:

body {
  font-family: 'Arial', sans-serif;
  color: #333333;
}

h1, h2, h3 {
  page-break-after: avoid;
  color: #000000;
}

table {
  width: 100%;
  border-collapse: collapse;
  page-break-inside: avoid;
}

img {
  max-width: 100%;
  height: auto;
  page-break-inside: avoid;
}

Para obtener colores de fondo uniformes, especialmente en secciones críticas, añada esta regla:

.color-critical {
  -webkit-print-color-adjust: exact;
}

Estos ajustes garantizan que su PDF sea fácil de leer y visualmente atractivo.

sbb-itb-23997f1

Control de saltos de página

Propiedades CSS para saltos de página

Gestionar los saltos de página de forma eficaz garantiza que el contenido fluya correctamente entre las páginas. Utilice estas propiedades CSS para controlar dónde se divide el contenido:

/* Start new page before chapters */
.chapter {
  page-break-before: always;
}

/* Keep headings together with their content */
h2, h3 {
  page-break-after: avoid;
}

/* Avoid splitting tables or figures */
table, figure {
  page-break-inside: avoid;
}

Estas reglas ayudan a mantener el documento organizado y fácil de leer. Cuando haya configurado los saltos de página, céntrese en establecer encabezados y pies de página coherentes con estos ajustes.

Configuración de encabezado y pie de página

Configure encabezados y pies de página en Puppeteer para dar a su PDF un aspecto profesional:

await page.pdf({
  displayHeaderFooter: true,
  headerTemplate: `
    <div style="font-size: 10px; padding: 0 0.5in; width: 100%;">
      <span class="title"></span>
      <span class="date" style="float: right;"></span>
    </div>
  `,
  footerTemplate: `
    <div style="font-size: 10px; text-align: center; width: 100%;">
      Page <span class="pageNumber"></span> of <span class="totalPages"></span>
    </div>
  `,
  margin: {
    top: '1in',
    bottom: '1in'
  }
});

Asegúrese de ajustar los márgenes para que el encabezado y el pie de página se adapten correctamente sin superponerse al contenido.

Gestión de contenido multipágina

Con los saltos de página y los encabezados/pies de página configurados, céntrese en gestionar el contenido entre varias páginas. Un control adecuado del diseño garantiza que su documento siga siendo claro y profesional:

/* Keep captions with their images */
figure {
  display: table;
  page-break-inside: avoid;
}

figcaption {
  display: table-caption;
  caption-side: bottom;
}

/* Avoid splitting list items or table rows */
li, .table-row {
  page-break-inside: avoid;
}

/* Allow large tables to break across pages */
.table-wrapper {
  page-break-inside: auto;
}

Para tablas grandes que se extienden a varias páginas, envuélvalas en un contenedor que permita saltos sin dividir las filas. Esto garantiza que los datos sigan siendo fáciles de seguir, incluso en conjuntos de datos extensos.

Consejo: Active la opción printBackground en Puppeteer para renderizar todos los elementos visuales, incluidos los colores de fondo y las imágenes:

await page.pdf({
  printBackground: true,
  preferCSSPageSize: true
});

Calidad y rendimiento del PDF

Mejorar la calidad y el rendimiento del PDF requiere prestar atención al escalado, la gestión de imágenes y los recursos. Estos pasos garantizan que el documento final tenga un aspecto cuidado y funcione de forma eficiente.

Métodos de escalado de contenido

Escalar correctamente el contenido garantiza que siga siendo legible y mantenga un diseño uniforme. Puppeteer ofrece controles de escalado detallados para renderizar PDF:

await page.pdf({
  scale: 0.8,
  preferCSSPageSize: true,
  format: 'Letter'
});

Aquí, los valores inferiores a 1 reducen el contenido, mientras que los valores superiores a 1 lo amplían. Combinar el escalado con preferCSSPageSize garantiza que el PDF respete las dimensiones definidas en CSS:

@page {
  size: 8.5in 11in;
  margin: 0.5in;
}

Gestión de la calidad de las imágenes

Elegir el formato de imagen adecuado es fundamental. PNG funciona bien para elementos visuales detallados, como gráficos y logotipos, pero puede aumentar el tamaño del archivo. JPEG es una mejor opción para fotografías, mientras que WebP suele convertirse, lo que puede aumentar aún más el tamaño del archivo.

Para mejorar la nitidez de las imágenes, aumente el factor de escala del dispositivo:

await page.setViewport({
  width: 1200,
  height: 800,
  deviceScaleFactor: 2
});

Problemas comunes y soluciones

Abordar desafíos habituales, como la gestión de recursos, el tamaño de archivo y los errores, puede mejorar significativamente el rendimiento.

  • Gestión de recursos
    Utilice una única instancia de navegador y página para gestionar varias solicitudes de PDF, reduciendo la sobrecarga:

    const browser = await puppeteer.launch({
      args: ['--no-sandbox', '--disable-setuid-sandbox']
    });
    
    const page = await browser.newPage();
    for (const request of requests) {
      await generatePDF(page, request);
    }
    
  • Optimización del tamaño de archivo
    Reduzca el tamaño de archivo eliminando elementos innecesarios y optimizando las imágenes:

    await page.evaluate(() => {
      document.querySelectorAll('.no-print').forEach(el => el.remove());
    
      document.querySelectorAll('img').forEach(img => {
        img.loading = 'lazy';
        img.decoding = 'async';
      });
    });
    
  • Gestión de errores
    Implemente estrategias para gestionar errores como tiempos de espera y reintentos:

    const generatePDF = async (page, options) => {
      try {
        await page.goto(options.url, {
          waitUntil: 'networkidle0',
          timeout: 30000
        });
        return await page.pdf(options);
      } catch (error) {
        console.error('PDF generation failed:', error);
        throw error;
      }
    };
    

Conclusión

Utilizar Puppeteer para convertir HTML a PDF proporciona herramientas eficaces para crear documentos de calidad profesional.

Pasos clave que debe seguir

  • Aplique ajustes de medios de impresión con page.emulateMediaType('print').
  • Utilice reglas CSS como page-break-inside: avoid para garantizar que elementos como las filas de tabla permanezcan intactos.

Estas técnicas se basan en los métodos de estilo y diseño anteriores, y constituyen una base sólida para una automatización más avanzada.

Opciones de automatización avanzada

Puede llevar la generación de PDF más lejos con estas funciones de automatización adicionales:

  • Configuración del entorno
    Configure directorios de caché y ajustes del navegador para garantizar resultados uniformes en diferentes plataformas.
  • Ajustes de rendimiento
    Ajuste los tiempos de espera y añada mecanismos de reintento para mejorar la fiabilidad durante el proceso de generación.

Al implementar estos métodos en producción, incluya gestión de errores y registros para mantener resultados de PDF uniformes y fiables.

FAQ

Frequently Asked Questions

Puppeteer es una biblioteca de automatización de navegadores para Node.js que renderiza HTML con CSS y JavaScript, y luego exporta PDF pulidos con control sobre el tamaño de página, los márgenes, los encabezados, los pies de página y los estilos específicos de impresión.

¿Te resultó útil? Compártelo →

Escrito por

Vasiliy Datsenko

Jefe de Soporte al Cliente

Vasiliy Datsenko es Jefe de Soporte al Cliente en Latenode y un escritor de automatización centrado en productos. Su trabajo conecta las conversaciones con los clientes, la investigación sobre automatización de flujos de trabajo, los casos de uso de IA y la educación práctica sobre productos para equipos que intentan automatizar procesos comerciales reales.

Perfil del autor →

Verificado por

Oleg Zankov

CEO Latenode, No-code Expert

Con una ética arraigada en la innovación, la resolución de problemas y la experiencia de usuario, me enfoco en capacitar a los equipos para crear integraciones personalizadas y automatizar flujos de trabajo con facilidad y eficiencia. Trayendo una gran experiencia en desarrollo empresarial, emprendimiento tecnológico y desarrollo de software, reconocí la necesidad de una solución de integración más accesible, escalable y adaptable. Así nació Latenode.com. Con nuestra plataforma, las empresas pueden aprovechar el poder de la tecnología sin necesidad de conocimientos extensos de codificación. Apasionado por fomentar un futuro donde la tecnología nos sirva, y no al revés, mi misión es simplificar procesos complejos. Creo en democratizar la tecnología y equipar a los equipos con las herramientas para innovar, crecer y tener éxito en un mundo cada vez más digital.

Perfil del autor →

Seguir leyendo