Lädt...


🔧 Creating a Next.js API to Convert HTML to PDF with Puppeteer (Vercel-Compatible)


Nachrichtenbereich: 🔧 Programmierung
🔗 Quelle: dev.to

Converting HTML to PDF is a common requirement in web applications. In this blog post, we'll explore how to create a Next.js API route that converts HTML to PDF using Puppeteer, and we'll ensure it works when deployed to Vercel.

The Challenge

While Puppeteer is a powerful tool for HTML to PDF conversion, it presents challenges when deploying to serverless environments like Vercel. The main issues are:

  1. Puppeteer requires a Chromium binary, which exceeds Vercel's size limits.
  2. Serverless functions have limited execution time and resources.

The Solution

We'll use a combination of @sparticuz/chromium-min and puppeteer-core to overcome these limitations. Here's how we'll approach it:

  1. Use a minimal Chromium build designed for serverless environments.
  2. Configure Puppeteer to use this minimal Chromium version.
  3. Optimize the PDF generation process for serverless execution.

Step 1: Setting Up the Project

First, create a new Next.js project or use an existing one. Then, install the necessary dependencies:

npm install @sparticuz/chromium-min puppeteer-core

To ensure compatibility and optimal performance, it's important to use the correct versions of the required packages. As of the latest testing, the following versions are recommended:

{
  "dependencies": {
    "@sparticuz/chromium-min": "^129.0.0",
    "puppeteer-core": "^23.5.0"
  }
}

Step 2: Creating the API Route

Create a new file at app/api/html-to-pdf/route.js (for Next.js 13+ app router) or pages/api/html-to-pdf.js (for Pages router). Here's the 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" }
    });
  }
}

Step 3: Understanding the Code

Let's break down the key parts of this code:

Browser Configuration

The getBrowser function sets up Puppeteer with the minimal Chromium binary:

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
  });
}

This configuration uses the @sparticuz/chromium-min package to provide a minimal Chromium binary compatible with serverless environments.

PDF Generation

The main logic for PDF generation is in the POST function:

  1. Extract the HTML from the request body.
  2. Launch a browser instance using the getBrowser function.
  3. Create a new page and set its content to the provided HTML.
  4. Generate a PDF from the page content.
  5. Close the browser to free up resources.
  6. Return the PDF as a response with appropriate headers.

Step 4: Using the API

To use this API, send a POST request with the HTML content in the request body:

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)
}

Deployment Considerations

When deploying to Vercel, keep these points in mind:

  1. Execution Time: Vercel has a maximum execution time of 10 seconds for hobby plans and 60 seconds for pro plans. Optimize your HTML and PDF generation process to fit within these limits.

  2. Memory Usage: Be mindful of memory usage. The minimal Chromium binary helps, but complex PDFs might still use significant memory.

  3. Cold Starts: Serverless functions can experience cold starts. The first invocation might be slower as it needs to download and set up the Chromium binary.

  4. Error Handling: Implement robust error handling to manage timeouts or resource constraints.

  5. Caching: Consider implementing caching strategies for frequently generated PDFs to reduce load on your serverless functions.

Conclusion

This approach allows you to create a powerful HTML to PDF conversion API using Next.js and Puppeteer, compatible with Vercel's serverless environment. By leveraging @sparticuz/chromium-min and puppeteer-core, we overcome the main challenges of running Puppeteer in a serverless context.

...

🔧 Creating a Next.js API to Convert HTML to PDF with Puppeteer (Vercel-Compatible)


📈 61.07 Punkte
🔧 Programmierung

🔧 How to generate PDF's with Puppeteer on Vercel in 2024


📈 43.05 Punkte
🔧 Programmierung

🔧 How to Deploy Your Backend on Vercel Using `vercel.json`: A Step-by-Step Guide


📈 31.66 Punkte
🔧 Programmierung

🔧 How to Convert PDF to Word Using Java - Free PDF Converter API


📈 29.94 Punkte
🔧 Programmierung

🔧 Convert HTML to PDF in React with react-pdf


📈 29.02 Punkte
🔧 Programmierung

🔧 Fixing the Stripe API Key Error When Migrating Next.js from Vercel to Azure Static Web Apps


📈 26.28 Punkte
🔧 Programmierung

🔧 How to Capture Web Page Screenshots with Next.js and Puppeteer


📈 25.67 Punkte
🔧 Programmierung

🔧 Integrating Lighthouse Reporting in Next.js with Puppeteer and Render


📈 25.67 Punkte
🔧 Programmierung

🔧 A step-by-step guide to setting up a Puppeteer screenshot API on Ubuntu


📈 25.45 Punkte
🔧 Programmierung

🔧 A step-by-step guide to setting up a Puppeteer screenshot API on Ubuntu


📈 25.45 Punkte
🔧 Programmierung

🍏 PDF Converter 6.5.5 - Convert PDF to MS Office formats.


📈 24.83 Punkte
🍏 iOS / Mac OS

🪟 How to Edit PDF and Convert PDF in Windows 11/10?


📈 24.83 Punkte
🪟 Windows Tipps

🍏 Batch TIFF & PDF Converter 4.4.6.3.789 - Merge, resize, extract, and convert PDF and TIFF documents.


📈 24.83 Punkte
🍏 iOS / Mac OS

🪟 Conversion to PDF Failed: How to Convert PDF to Word Document (FULL GUIDE)


📈 24.83 Punkte
🪟 Windows Tipps

📰 Conversion to PDF Failed: How to Convert PDF to Word Document (FULL GUIDE)


📈 24.83 Punkte
🖥️ Betriebssysteme

🐧 How To Convert And Edit A PDF With PDF WIZ And Why You Would Need To


📈 24.83 Punkte
🐧 Linux Tipps

🔧 Web Scraping Made Easy: Parse Any HTML Page with Puppeteer


📈 24.53 Punkte
🔧 Programmierung

📰 Creating a frontend for your ML application with Vercel V0


📈 23.98 Punkte
🔧 AI Nachrichten

🔧 Vercel’s generative AI tool for creating UI components is now generally available


📈 23.98 Punkte
🔧 Programmierung

🐧 I created a tool to convert the HTML based wayland-book to PDF


📈 22.14 Punkte
🐧 Linux Tipps

🕵️ Medium CVE-2019-15138: Html-pdf project Html-pdf


📈 22.14 Punkte
🕵️ Sicherheitslücken

🕵️ Creating and Analyzing a Malicious PDF File with PDF-Parser Tool


📈 21.91 Punkte
🕵️ Hacking

🕵️ CVE-2024-39693 | vercel next.js up to 13.5.0 resource consumption (GHSA-fq54-2j52-jc42)


📈 21.17 Punkte
🕵️ Sicherheitslücken

🔧 Create a website with the next JS and deploy it with Vercel.


📈 21.17 Punkte
🔧 Programmierung

🔧 Next.js Deployment: Vercel's Charm vs. GCP's Muscle


📈 21.17 Punkte
🔧 Programmierung

🔧 Fixing Apex Domain Issues for Next.js Sites Hosted on Vercel


📈 21.17 Punkte
🔧 Programmierung

🕵️ CVE-2024-47831 | vercel next.js up to 14.2.6 recursion (GHSA-g77x-44xx-532m)


📈 21.17 Punkte
🕵️ Sicherheitslücken

🔧 Next.js e Vercel: Otimizando Aplicações para Produção


📈 21.17 Punkte
🔧 Programmierung

🎥 Build and Deploy a RAG Chatbot with JavaScript, LangChain.js, Next.js, Vercel, OpenAI


📈 21.17 Punkte
🎥 Video | Youtube

🔧 Next.js Failed to compile Deploying to Vercel


📈 21.17 Punkte
🔧 Programmierung

🔧 Render, Heroku, or Vercel: Which One Should You Choose for Your Next Project? 🚀


📈 21.17 Punkte
🔧 Programmierung

🔧 Self-hosted Next.js - When Vercel is Not an Option


📈 21.17 Punkte
🔧 Programmierung

🔧 Render, Heroku, or Vercel: Which One Should You Choose for Your Next Project? 🚀


📈 21.17 Punkte
🔧 Programmierung

🎥 Serverless Node.js Tutorial – Neon Serverless Postgres, AWS Lambda, Next.js, Vercel


📈 21.17 Punkte
🎥 Video | Youtube

matomo