json-to-pdf-utility
v1.0.3
Published
Angular SDK for generating PDFs from JSON data
Readme
📄 JSON to PDF Utility
🚀 Transform JSON data into beautiful PDFs with C# Razor-like syntax in Angular!
Client-side PDF generation • No server required • Template-driven • Lightning fast
📚 Documentation • 🎯 Examples • ⚡ Live Demo • 🛠 API
✨ Why Choose JSON to PDF Utility?
🎯 Developer-Friendly
- Familiar Syntax: Use C# Razor-like templates (
@Model.Property) - Type-Safe: Full TypeScript support with IntelliSense
- Zero Config: Works out of the box with Angular 16+
- Lightweight: Only 100KB, no heavy dependencies
⚡ Production-Ready
- Client-Side: No server infrastructure needed
- Secure: All processing happens in the browser
- Fast: Generate PDFs in milliseconds
- Reliable: Battle-tested template engine
🎬 See It In Action
// Write templates like C# Razor
const template = `
<h1>Invoice #@Model.InvoiceNumber</h1>
<p>Customer: @Model.Customer.Name</p>
<table>
<thead><tr><th>Item</th><th>Price</th></tr></thead>
<tbody>
@foreach (var item in Model.Items) {
<tr>
<td>@item.Name</td>
<td>[email protected]</td>
</tr>
}
</tbody>
</table>
@if (Model.HasDiscount) {
<p class="discount">Discount Applied: @Model.Discount%</p>
}
<h3>Total: [email protected]</h3>
`;
// Generate PDF with one line
this.pdfService.generateAndDownload({
htmlTemplate: template,
jsonData: JSON.stringify(invoiceData),
fileName: 'invoice.pdf'
}).subscribe();Result: Professional PDF generated instantly! 🎉
🚀 Quick Start
1️⃣ Installation
npm install json-to-pdf-utility2️⃣ Module Setup
// app.module.ts
import { JsonToPdfModule } from 'json-to-pdf-utility';
@NgModule({
imports: [
JsonToPdfModule.forRoot({
pageFormat: 'A4',
orientation: 'portrait'
})
]
})
export class AppModule { }3️⃣ Component Usage
// your-component.ts
import { JsonToPdfService, PdfRequest } from 'json-to-pdf-utility';
@Component({...})
export class MyComponent {
constructor(private pdfService: JsonToPdfService) {}
generatePDF() {
const request: PdfRequest = {
htmlTemplate: '<h1>Hello @Model.Name!</h1>',
jsonData: JSON.stringify({ Name: 'World' }),
fileName: 'hello-world.pdf'
};
this.pdfService.generateAndDownload(request).subscribe({
next: (result) => console.log('PDF generated!', result),
error: (error) => console.error('Error:', error)
});
}
}4️⃣ That's it! 🎊
Your PDF is automatically generated and downloaded!
🎯 Template Examples
📋 Business Invoice
<!DOCTYPE html>
<html>
<head>
<title>Invoice</title>
<style>
.header { background: #2c3e50; color: white; padding: 20px; }
.total { font-size: 24px; font-weight: bold; color: #e74c3c; }
</style>
</head>
<body>
<div class="header">
<h1>INVOICE #@Model.InvoiceNumber</h1>
<p>Date: @Model.Date</p>
</div>
<div class="customer-info">
<h2>Bill To:</h2>
<p>@Model.Customer.Name</p>
@if (Model.Customer.Company) {
<p>@Model.Customer.Company</p>
}
<p>@Model.Customer.Address</p>
</div>
<table style="width: 100%; border-collapse: collapse;">
<thead>
<tr style="background: #f8f9fa;">
<th>Description</th>
<th>Qty</th>
<th>Rate</th>
<th>Amount</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.LineItems) {
<tr>
<td>@item.Description</td>
<td>@item.Quantity</td>
<td>[email protected]</td>
<td>[email protected]</td>
</tr>
}
</tbody>
</table>
<div style="text-align: right; margin-top: 30px;">
<p>Subtotal: [email protected]</p>
@if (Model.TaxRate > 0) {
<p>Tax (@Model.TaxRate%): [email protected]</p>
}
<p class="total">TOTAL: [email protected]</p>
</div>
</body>
</html>📊 Sales Report
<div class="report">
<h1>Sales Report - @Model.ReportDate</h1>
<div class="summary-cards">
<div class="card">
<h3>Total Revenue</h3>
<p class="big-number">[email protected]</p>
</div>
<div class="card">
<h3>Orders</h3>
<p class="big-number">@Model.TotalOrders</p>
</div>
</div>
@if (Model.TopProducts.length > 0) {
<h2>Top Selling Products</h2>
<table>
<thead>
<tr><th>Product</th><th>Sales</th><th>Revenue</th></tr>
</thead>
<tbody>
@foreach (var product in Model.TopProducts) {
<tr>
<td>@product.Name</td>
<td>@product.UnitsSold</td>
<td>[email protected]</td>
</tr>
}
</tbody>
</table>
} else {
<p>No sales data available for this period.</p>
}
</div>🎓 Certificate Template
<div class="certificate">
<div class="border">
<div class="content">
<h1>Certificate of Completion</h1>
<p class="subtitle">This is to certify that</p>
<h2 class="name">@Model.StudentName</h2>
<p class="subtitle">has successfully completed</p>
<h3 class="course">@Model.CourseName</h3>
<div class="details">
<p>Course Duration: @Model.Duration hours</p>
<p>Completion Date: @Model.CompletionDate</p>
@if (Model.Grade) {
<p>Grade: @Model.Grade</p>
}
</div>
<div class="signatures">
<div class="signature">
<p>@Model.Instructor.Name</p>
<p>Instructor</p>
</div>
<div class="signature">
<p>@Model.Institution.Name</p>
<p>Institution</p>
</div>
</div>
</div>
</div>
</div>🎨 Advanced Features
🔄 Conditional Logic
@if (Model.IsPremiumCustomer) {
<div class="premium-badge">★ Premium Customer</div>
} else {
<div class="standard-badge">Standard Customer</div>
}
@if (Model.PaymentStatus === "Paid") {
<span class="paid">✓ PAID</span>
} else {
<span class="unpaid">⚠ UNPAID</span>
}🔁 Dynamic Lists
<!-- Simple list -->
@foreach (var tag in Model.Tags) {
<span class="tag">@tag</span>
}
<!-- Complex nested data -->
@foreach (var order in Model.Orders) {
<div class="order">
<h3>Order #@order.Id - @order.Date</h3>
@foreach (var item in order.Items) {
<p>@item.Product: @item.Quantity x [email protected]</p>
}
</div>
}🎯 Nested Objects
<div class="company-info">
<h2>@Model.Company.Name</h2>
<p>@Model.Company.Address.Street</p>
<p>@Model.Company.Address.City, @Model.Company.Address.State</p>
<p>Phone: @Model.Company.Contact.Phone</p>
<p>Email: @Model.Company.Contact.Email</p>
</div>⚙️ API Reference
JsonToPdfService
generatePdf(request: PdfRequest): Observable<PdfResult>
Generates PDF and returns result object.
generateAndDownload(request: PdfRequest): Observable<PdfResult>
Generates PDF and automatically triggers download.
Interfaces
interface PdfRequest {
htmlTemplate: string; // HTML with Razor-like syntax
jsonData: string; // JSON data as string
fileName?: string; // Optional filename
}
interface PdfResult {
blob: Blob; // PDF as blob
fileName: string; // Used filename
}Module Configuration
JsonToPdfModule.forRoot({
pageFormat: 'A4' | 'A3' | 'A5' | 'Letter' | 'Legal',
orientation: 'portrait' | 'landscape',
margins: { top: '5mm', right: '5mm', bottom: '5mm', left: '5mm' },
printBackground: true,
debug: false
})🎪 Live Demo
Try it yourself! Here's a working Angular component:
@Component({
selector: 'app-demo',
template: `
<div class="demo">
<h2>🎯 Try JSON to PDF Utility</h2>
<div class="form">
<label>Your Name:</label>
<input [(ngModel)]="name" placeholder="Enter your name">
<label>Your Title:</label>
<input [(ngModel)]="title" placeholder="e.g., Senior Developer">
<button (click)="generateCertificate()"
[disabled]="!name || !title">
🎓 Generate Certificate
</button>
</div>
</div>
`
})
export class DemoComponent {
name = '';
title = '';
constructor(private pdfService: JsonToPdfService) {}
generateCertificate() {
const template = `
<div style="text-align: center; padding: 50px;">
<h1>🏆 Certificate of Awesomeness</h1>
<h2>@Model.Name</h2>
<p>Is hereby recognized as an amazing</p>
<h3>@Model.Title</h3>
<p>Date: @Model.Date</p>
</div>
`;
const data = {
Name: this.name,
Title: this.title,
Date: new Date().toDateString()
};
this.pdfService.generateAndDownload({
htmlTemplate: template,
jsonData: JSON.stringify(data),
fileName: `${this.name}-certificate.pdf`
}).subscribe();
}
}🤝 Community & Support
💬 Join Our Community
🐛 Report Bug • ✨ Request Feature • 📖 Documentation
🏆 Success Stories
"Reduced our PDF generation time from 2 seconds to 200ms! Amazing!"
- Sarah K., Lead Developer at TechCorp
"The Razor-like syntax made it so easy for our .NET team to adopt."
- Mike R., Full Stack Developer
"Finally, a PDF solution that doesn't require a server. Perfect for our client-side app!"
- Lisa Chen, Frontend Architect
🔮 Roadmap
- [x] ✅ Basic template processing
- [x] ✅ Conditional rendering
- [x] ✅ Loop support
- [ ] 🚧 Charts and graphs support
- [ ] 🚧 QR code generation
- [ ] 🚧 Barcode support
- [ ] 🔮 Multiple page layouts
- [ ] 🔮 Template marketplace
📦 Related Packages
@angular/core- Angular frameworkjspdf- PDF generation libraryhtml2canvas- HTML to canvas conversion
📄 License
MIT License - feel free to use in personal and commercial projects!
🚀 Ready to Get Started?
npm install json-to-pdf-utility📚 View Full Documentation • 🎯 See More Examples • ⭐ Star on GitHub
Made with ❤️ for the Angular community
If this package helped you, please consider giving it a ⭐ on GitHub!
