La conversion de HTML en PDF est une exigence courante dans les applications Web. Dans cet article de blog, nous explorerons comment créer une route API Next.js qui convertit le HTML en PDF à l'aide de Puppeteer, et nous veillerons à ce qu'elle fonctionne une fois déployée sur Vercel.
Bien que Puppeteer soit un outil puissant pour la conversion HTML en PDF, il présente des défis lors du déploiement dans des environnements sans serveur comme Vercel. Les principaux enjeux sont :
Nous utiliserons une combinaison de @sparticuz/chromium-min et puppeteer-core pour surmonter ces limitations. Voici comment nous allons l'aborder :
Tout d’abord, créez un nouveau projet Next.js ou utilisez-en un existant. Ensuite, installez les dépendances nécessaires :
npm install @sparticuz/chromium-min puppeteer-core
Pour garantir une compatibilité et des performances optimales, il est important d'utiliser les versions correctes des packages requis. Selon les derniers tests, les versions suivantes sont recommandées :
{ "dependencies": { "@sparticuz/chromium-min": "^129.0.0", "puppeteer-core": "^23.5.0" } }
Créez un nouveau fichier dans app/api/html-to-pdf/route.js (pour le routeur d'application Next.js 13) ou pages/api/html-to-pdf.js (pour le routeur Pages). Voici le code :
const chromium = require("@sparticuz/chromium-min"); const puppeteer = require("puppeteer-core"); async function getBrowser() { return puppeteer.launch({ args: [...chromium.args, "--hide-scrollbars", "--disable-web-security"], defaultViewport: chromium.defaultViewport, executablePath: await chromium.executablePath( `https://github.com/Sparticuz/chromium/releases/download/v129.0.0/chromium-v129.0.0-pack.tar` ), headless: chromium.headless, ignoreHTTPSErrors: true }); } export async function POST(request) { try { const { html } = await request.json(); const browser = await getBrowser(); const page = await browser.newPage(); await page.setContent(html, { waitUntil: "networkidle0" }); const pdfBuffer = await page.pdf({ format: "A4", printBackground: true, margin: { top: "1cm", right: "1cm", bottom: "1cm", left: "1cm" } }); await browser.close(); return new Response(pdfBuffer, { headers: { "Content-Type": "application/pdf", "Content-Disposition": 'attachment; filename="output.pdf"' } }); } catch (error) { console.error("Error generating PDF:", error); return new Response(JSON.stringify({ error: "Failed to generate PDF" }), { status: 500, headers: { "Content-Type": "application/json" } }); } }
Décomposons les éléments clés de ce code :
La fonction getBrowser configure Puppeteer avec le binaire Chromium minimal :
async function getBrowser() { return puppeteer.launch({ args: [...chromium.args, "--hide-scrollbars", "--disable-web-security"], defaultViewport: chromium.defaultViewport, executablePath: await chromium.executablePath( `https://github.com/Sparticuz/chromium/releases/download/v129.0.0/chromium-v129.0.0-pack.tar` ), headless: chromium.headless, ignoreHTTPSErrors: true }); }
Cette configuration utilise le package @sparticuz/chromium-min pour fournir un binaire Chromium minimal compatible avec les environnements sans serveur.
La logique principale de la génération de PDF se trouve dans la fonction POST :
Pour utiliser cette API, envoyez une requête POST avec le contenu HTML dans le corps de la requête :
const response = await fetch('/api/html-to-pdf', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ html: '<h1>Hello, World!</h1>' }), }); if (response.ok) { const blob = await response.blob(); // Handle the PDF blob (e.g., download or display) }
Lors du déploiement sur Vercel, gardez ces points à l'esprit :
Temps d'exécution : Vercel a un temps d'exécution maximum de 10 secondes pour les plans hobby et de 60 secondes pour les plans pro. Optimisez votre processus de génération HTML et PDF pour respecter ces limites.
Utilisation de la mémoire : Soyez attentif à l'utilisation de la mémoire. Le binaire Chromium minimal est utile, mais les PDF complexes peuvent toujours utiliser une quantité importante de mémoire.
Démarrages à froid : les fonctions sans serveur peuvent subir des démarrages à froid. La première invocation peut être plus lente car elle nécessite le téléchargement et la configuration du binaire Chromium.
Gestion des erreurs : implémentez une gestion robuste des erreurs pour gérer les délais d'attente ou les contraintes de ressources.
Mise en cache : envisagez de mettre en œuvre des stratégies de mise en cache pour les PDF fréquemment générés afin de réduire la charge sur vos fonctions sans serveur.
Cette approche vous permet de créer une puissante API de conversion HTML vers PDF à l'aide de Next.js et Puppeteer, compatible avec l'environnement sans serveur de Vercel. En tirant parti de @sparticuz/chromium-min et de puppeteer-core, nous surmontons les principaux défis liés à l'exécution de Puppeteer dans un contexte sans serveur.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!