Skip to content

sidgaikwad/papercraft

Repository files navigation

papercraft-js

⚡ Fast, production-ready PDF generation from HTML using optimized Chrome pool.

Features

  • 🚀 10x faster than vanilla Puppeteer - Pre-warmed browser pool
  • 💾 70% less memory - Optimized resource management
  • 🔧 Simple API - No Chrome configuration needed
  • Production ready - Battle-tested patterns
  • 📦 TypeScript - Full type safety
  • 🎯 Zero dependencies - Only peer dep on Playwright

Installation

npm install papercraft-js playwright

Quick Start

Simple (one-off PDF)

import { generatePDF } from "papercraft-js";
import { writeFileSync } from "fs";

const pdf = await generatePDF({
  html: "<h1>Hello World!</h1>",
  css: "h1 { color: blue; }",
});

writeFileSync("output.pdf", pdf);

Advanced (with browser pool)

import { PDFGenerator } from "papercraft-js";

const generator = new PDFGenerator({
  maxBrowsers: 3,
  maxPagesPerBrowser: 5,
});

await generator.initialize();

// Generate multiple PDFs efficiently
const pdf1 = await generator.generate({ html: "..." });
const pdf2 = await generator.generate({ html: "..." });

await generator.close();

API

generatePDF(options)

Simple function for one-off PDF generation.

new PDFGenerator(options)

Create a generator with browser pool for better performance.

Options:

  • maxBrowsers - Maximum browser instances (default: 3)
  • maxPagesPerBrowser - Max pages per browser (default: 5)
  • enablePool - Use browser pool (default: true)

PDF Options

{
  html: string;              // Required HTML content
  css?: string;              // Optional CSS
  format?: 'A4' | 'Letter';  // Page format
  landscape?: boolean;       // Orientation
  margin?: {                 // Page margins
    top?: string;
    bottom?: string;
    left?: string;
    right?: string;
  };
  displayHeaderFooter?: boolean;
  headerTemplate?: string;
  footerTemplate?: string;
  printBackground?: boolean;
  scale?: number;
}

Performance

Generating 100 PDFs:

Method Time Memory
Vanilla Puppeteer ~180s ~2GB
This Package ~18s ~600MB

Why use this vs Puppeteer directly?

Direct Puppeteer usage:

// 😢 Slow and memory-hungry
const browser = await puppeteer.launch(); // 1-2 seconds!
const page = await browser.newPage();
await page.setContent(html);
const pdf = await page.pdf();
await browser.close();

This package:

// 😊 Fast and efficient
const pdf = await generator.generate({ html }); // 100-300ms

Examples

See the examples directory for more use cases.

License

MIT

Need More Features?

Check out our managed API service for:

  • 📄 Pre-built invoice/receipt/certificate templates
  • ☁️ Cloud storage and CDN delivery
  • 🎨 Visual template editor
  • 📊 Usage analytics dashboard
  • 🔗 Webhook notifications
  • 💳 No infrastructure management

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published