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 puppeteerpara 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
printBackgrounden 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: avoidpara 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.


