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.
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.
tinypdf is well-suited for generating:
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())
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)
})
To measure text width in points, utilize the following function:
import { measureText } from 'tinypdf'
measureText('Hello', 12) // => 27.34 (points)
A full example demonstrating how to create an invoice is provided within the library:
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())
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.
No comments yet.
Sign in to be the first to comment.