Skip to content

serverless-pdf-generator is a lightweight package that simplifies the process of generating PDFs from web pages in a serverless environment like Vercel. It utilizes Puppeteer and Chromium to render pages and generate high-quality PDFs.

License

Notifications You must be signed in to change notification settings

maheshpaulj/serverless-pdf-generator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

5 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Serverless PDF Generator

serverless-pdf-generator is a lightweight package that simplifies the process of generating PDFs from web pages in a serverless environment like Vercel. It utilizes Puppeteer and Chromium to render pages and generate high-quality PDFs.

Features

  • πŸ“„ Convert any URL to a PDF easily.
  • πŸš€ Optimized for serverless environments (Vercel, AWS Lambda, etc).
  • ⚑ Supports Puppeteer and Chromium-min for minimal dependencies.
  • 🎯 Customizable PDF output (format, margins, background printing, etc.).

Installation

npm install @maheshpaul/serverless-pdf-generator

Usage

Next.js API Route Example

Create an API route at src/app/api/pdf/route.ts:

import { handlePDFRequest } from '@maheshpaul/serverless-pdf-generator';
import { NextRequest } from 'next/server';

export async function GET(request: NextRequest) {
    return handlePDFRequest(request, async () => {
        const url = new URL(request.url).searchParams.get('url');
        if (!url) throw new Error('Missing URL');
        return { url, filename: 'download.pdf' };
    }, {
        format: 'A4',
        printBackground: true,
        development: process.env.NODE_ENV === 'development'
    });
}

Next.js Client Component Example

Create a download button in a React client component:

'use client';

export default function DownloadPDF() {
  const handleDownload = async () => {
    try {
      const response = await fetch(`/api/pdf?url=${encodeURIComponent('https://google.com')}`);
      if (!response.ok) throw new Error('PDF generation failed');
      
      const blob = await response.blob();
      const url = URL.createObjectURL(blob);
      const a = document.createElement('a');
      a.href = url;
      a.download = 'google.pdf';
      document.body.appendChild(a);
      a.click();
      document.body.removeChild(a);
      URL.revokeObjectURL(url);
    } catch (error) {
      console.error('Download failed:', error);
      alert('Failed to download PDF');
    }
  };
  
  return (
    <button onClick={handleDownload} className="px-4 py-2 bg-blue-500 text-white rounded-md hover:bg-blue-600">
      Download PDF
    </button>
  );
}

React Server Component Example

If using a server-side approach in a React environment:

import React, { useState } from 'react';

const DownloadPDF = () => {
  const [loading, setLoading] = useState(false);

  const handleDownload = async () => {
    setLoading(true);
    try {
      const response = await fetch('/api/pdf?url=https://example.com');
      if (!response.ok) throw new Error('PDF generation failed');
      
      const blob = await response.blob();
      const url = URL.createObjectURL(blob);
      const a = document.createElement('a');
      a.href = url;
      a.download = 'example.pdf';
      document.body.appendChild(a);
      a.click();
      document.body.removeChild(a);
      URL.revokeObjectURL(url);
    } catch (error) {
      console.error(error);
      alert('Error downloading PDF');
    }
    setLoading(false);
  };

  return (
    <button onClick={handleDownload} disabled={loading} className="px-4 py-2 bg-green-500 text-white rounded-md hover:bg-green-600">
      {loading ? 'Generating...' : 'Download PDF'}
    </button>
  );
};

export default DownloadPDF;

API

generatePDF(options: PDFGeneratorOptions)

Generates a PDF from a given URL.

Parameters

interface PDFGeneratorOptions {
  url: string;
  format?: 'A4' | 'Letter' | 'Legal';
  margin?: {
    top?: string;
    right?: string;
    bottom?: string;
    left?: string;
  };
  printBackground?: boolean;
  development?: boolean;
}

Example

import { generatePDF } from '@maheshpaul/serverless-pdf-generator';

async function downloadPDF() {
  const pdfBuffer = await generatePDF({ url: 'https://example.com' });
  require('fs').writeFileSync('output.pdf', pdfBuffer);
}

handlePDFRequest(request: NextRequest, getData: () => Promise<{ url: string; filename?: string }>, options?: Omit<PDFGeneratorOptions, 'url'>)

Handles a Next.js API request for generating a PDF.

Example

export async function GET(request: NextRequest) {
    return handlePDFRequest(request, async () => {
        return { url: 'https://example.com', filename: 'example.pdf' };
    }, { format: 'A4' });
}

Deployment

This package is optimized for serverless environments like Vercel. If using locally, ensure you have set process.env.NODE_ENV === 'development' to automatically switch between local and serverless execution.

License

MIT License

Author

Created by Mahesh Paul. Contributions are welcome!

About

serverless-pdf-generator is a lightweight package that simplifies the process of generating PDFs from web pages in a serverless environment like Vercel. It utilizes Puppeteer and Chromium to render pages and generate high-quality PDFs.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published