PitchHut logo
A minimalistic library for creating real PDFs effortlessly.
Pitch

tinypdf is a lightweight PDF creation library, boasting under 400 lines of code and zero dependencies. Ideal for generating invoices, reports, and more, it simplifies PDF creation by allowing the addition of text and images with ease. Experience a significant reduction in size without compromising functionality.

Description

tinypdf is a lightweight PDF creation library designed for ease of use and efficiency. With fewer than 400 lines of code and no dependencies, it allows users to generate genuine PDF documents with minimal overhead.

Key Features

  • Size Efficiency: At just 3.3 KB, tinypdf is substantially smaller than alternatives like jsPDF, which weighs in at 229 KB, making it a practical choice for projects where size matters.
  • Simplicity at its Core: The library is tailored for the most common use cases, enabling straightforward placement of text and images without the burden of supporting additional features such as custom fonts, forms, or encryption.

Common Use Cases

tinypdf is well-suited for generating:

  • Invoices
  • Receipts
  • Reports
  • Shipping labels
  • Tickets
  • Certificates
  • Contracts
  • Data exports

Basic Usage

Creating a PDF with tinypdf is straightforward. Here’s a quick example:

import { pdf } from 'tinypdf'
import { writeFileSync } from 'fs'

const doc = pdf()

doc.page((ctx) => {
  ctx.rect(50, 700, 200, 40, '#2563eb') // blue rectangle
  ctx.text('Hello PDF!', 60, 712, 24, { color: '#ffffff' })
  ctx.line(50, 680, 250, 680, '#000000', 1) // black line
})

writeFileSync('output.pdf', doc.build())

Adding Images

Images can also be included easily:

import { readFileSync } from 'fs'

doc.page((ctx) => {
  const logo = new Uint8Array(readFileSync('logo.jpg'))
  ctx.image(logo, 50, 700, 100, 50)
})

Measuring Text Width

To measure text width in points, utilize the following function:

import { measureText } from 'tinypdf'

measureText('Hello', 12) // => 27.34 (points)

Example: Generating an Invoice

A full example demonstrating how to create an invoice is provided within the library:

View Example
import { pdf } from 'tinypdf'
import { writeFileSync } from 'fs'

const doc = pdf()

doc.page(612, 792, (p) => {
  const margin = 40, pw = 532

  // Header
  p.rect(margin, 716, pw, 36, '#2563eb')
  p.text('INVOICE', 55, 726, 24, { color: '#fff' })
  p.text('#INV-2025-001', 472, 728, 12, { color: '#fff' })

  // Company & billing info
  p.text('Acme Corporation', margin, 670, 16)
  p.text('123 Business Street', margin, 652, 11, { color: '#666' })
  p.text('New York, NY 10001', margin, 638, 11, { color: '#666' })

  p.text('Bill To:', 340, 670, 12, { color: '#666' })
  p.text('John Smith', 340, 652, 14)
  p.text('456 Customer Ave', 340, 636, 11, { color: '#666' })
  p.text('Los Angeles, CA 90001', 340, 622, 11, { color: '#666' })

  // Table
  p.rect(margin, 560, pw, 25, '#f3f4f6')
  p.text('Description', 50, 568, 11)
  p.text('Qty', 310, 568, 11)
  p.text('Price', 380, 568, 11)
  p.text('Total', 480, 568, 11)

  const items = [
    ['Website Development', '1', '$5,000.00', '$5,000.00'],
    ['Hosting (Annual)', '1', '$200.00', '$200.00'],
    ['Maintenance Package', '12', '$150.00', '$1,800.00'],
  ]

  let y = 535
  for (const [desc, qty, price, total] of items) {
    p.text(desc, 50, y, 11)
    p.text(qty, 310, y, 11)
    p.text(price, 380, y, 11)
    p.text(total, 480, y, 11)
    p.line(margin, y - 15, margin + pw, y - 15, '#e5e7eb', 0.5)
    y -= 30
  }

  // Totals
  p.line(margin, y, margin + pw, y, '#000', 1)
  p.text('Subtotal:', 380, y - 25, 11)
  p.text('$7,000.00', 480, y - 25, 11)
  p.text('Tax (8%):', 380, y - 45, 11)
  p.text('$560.00', 480, y - 45, 11)
  p.rect(370, y - 75, 202, 25, '#2563eb')
  p.text('Total Due:', 380, y - 63, 12, { color: '#fff' })
  p.text('$7,560.00', 480, y - 63, 12, { color: '#fff' })

  // Footer
  p.text('Thank you for your business!', margin, 80, 12, { align: 'center', width: pw, color: '#666' })
  p.text('Payment due within 30 days', margin, 62, 10, { align: 'center', width: pw, color: '#999' })
})

writeFileSync('invoice.pdf', doc.build())

Conclusion

Overall, tinypdf is an efficient and powerful option for lightweight PDF creation, accommodating essential requirements while maintaining a minimal footprint. Ideal for generating text and image-based documents without unnecessary complexities.

0 comments

No comments yet.

Sign in to be the first to comment.