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.
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.
No comments yet.
Sign in to be the first to comment.