Copycurl -X POST https://pdfgen.com/api/v1/generate \
-H "Authorization: Bearer pdfg_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"data": {
"supplier": {
"name": "Nimbus Technologies Pvt. Ltd.",
"address": "4th Floor, Prestige Tower, MG Road\nBengaluru, Karnataka 560001",
"gstin": "29ABCDE1234F1Z5",
"state": "Karnataka",
"stateCode": "29"
},
"buyer": {
"name": "Saffron Retail LLP",
"address": "22, 80 Feet Road, Koramangala\nBengaluru, Karnataka 560034",
"gstin": "29AAKFS1234K1Z2",
"state": "Karnataka",
"stateCode": "29"
},
"invoiceNumber": "NT/2026-27/0458",
"reverseCharge": "No",
"bank": {
"name": "HDFC Bank",
"accountNumber": "50200012345678",
"ifsc": "HDFC0001234",
"branch": "MG Road, Bengaluru"
},
"declaration": "We declare that this invoice shows the actual price of the goods and services described and that all particulars are true and correct.",
"invoiceDate": "2026-11-03",
"placeOfSupply": "Karnataka (29)",
"interState": false,
"currency": "INR",
"locale": "en-IN",
"items": [
{
"sl": 1,
"description": "Retail POS software, annual subscription",
"hsn": "997331",
"quantity": 1,
"rate": 120000,
"taxableValue": 120000,
"igstRate": 18,
"igst": 0,
"cgstRate": 9,
"cgst": 10800,
"sgstRate": 9,
"sgst": 10800,
"total": 141600
},
{
"sl": 2,
"description": "On-site setup and staff training (days)",
"hsn": "998313",
"quantity": 2,
"rate": 15000,
"taxableValue": 30000,
"igstRate": 18,
"igst": 0,
"cgstRate": 9,
"cgst": 2700,
"sgstRate": 9,
"sgst": 2700,
"total": 35400
}
],
"totals": {
"taxableValue": 150000,
"cgst": 13500,
"sgst": 13500,
"igst": 0,
"grandTotal": 177000
},
"amountInWords": "Indian Rupees One Lakh Seventy-Seven Thousand Only"
},
"format": "A4",
"engine": "handlebars",
"html": "<link href=\"https://fonts.googleapis.com/css2?family=Noto+Sans:wght@400;600;700;800&display=swap\" rel=\"stylesheet\">\n<div style=\"max-width:780px;margin:0 auto;padding:40px;font-family:' \ ' 'Noto Sans' \ ' ',-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:#111827;font-size:12.5px;\">\n <div style=\"text-align:center;margin-bottom:16px;\">\n <h1 style=\"font-size:22px;font-weight:800;letter-spacing:3px;margin:0;\">TAX INVOICE</h1>\n <p style=\"margin:2px 0 0;font-size:11px;color:#6b7280;\">Original for recipient</p>\n </div>\n <table style=\"width:100%;border-collapse:collapse;font-size:inherit;line-height:inherit;\">\n <tr>\n <td style=\"width:58%;vertical-align:top;padding:12px;border:1px solid #d1d5db;\">\n {{#if logo}}<img src=\"{{logo}}\" alt=\"\" style=\"display:block;max-width:200px;max-height:56px;margin:0 0 10px;\">{{/if}}\n <p style=\"margin:0;font-size:16px;font-weight:800;\">{{supplier.name}}</p>\n <p style=\"margin:2px 0 0;color:#4b5563;white-space:pre-line;\">{{supplier.address}}</p>\n <p style=\"margin:6px 0 0;\">GSTIN: <strong>{{supplier.gstin}}</strong></p>\n <p style=\"margin:2px 0 0;\">State: {{supplier.state}} (Code {{supplier.stateCode}})</p>\n </td>\n <td style=\"vertical-align:top;padding:12px;border:1px solid #d1d5db;line-height:1.8;\">\n Invoice no. <strong>{{invoiceNumber}}</strong><br>\n Invoice date <strong>{{formatDate invoiceDate locale}}</strong><br>\n Place of supply <strong>{{placeOfSupply}}</strong><br>\n Reverse charge <strong>{{reverseCharge}}</strong>\n </td>\n </tr>\n <tr>\n <td colspan=\"2\" style=\"padding:12px;border:1px solid #d1d5db;\">\n <p style=\"margin:0 0 4px;font-size:11px;color:#6b7280;font-weight:700;text-transform:uppercase;letter-spacing:1px;\">Bill to</p>\n <p style=\"margin:0;font-weight:700;\">{{buyer.name}}</p>\n <p style=\"margin:2px 0 0;color:#4b5563;white-space:pre-line;\">{{buyer.address}}</p>\n <p style=\"margin:4px 0 0;\">{{#if buyer.gstin}}GSTIN: <strong>{{buyer.gstin}}</strong> · {{/if}}State: {{buyer.state}} (Code {{buyer.stateCode}})</p>\n </td>\n </tr>\n </table>\n <table style=\"width:100%;border-collapse:collapse;margin-top:14px;font-size:11.5px;line-height:inherit;\">\n <thead>\n <tr style=\"background:#f3f4f6;\">\n <th style=\"padding:7px;border:1px solid #d1d5db;\">#</th>\n <th style=\"padding:7px;border:1px solid #d1d5db;text-align:left;\">Description</th>\n <th style=\"padding:7px;border:1px solid #d1d5db;\">HSN/SAC</th>\n <th style=\"padding:7px;border:1px solid #d1d5db;\">Qty</th>\n <th style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">Rate</th>\n <th style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">Taxable value</th>\n {{#if interState}}\n <th style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">IGST</th>\n {{else}}\n <th style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">CGST</th>\n <th style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">SGST</th>\n {{/if}}\n <th style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">Total</th>\n </tr>\n </thead>\n <tbody>\n {{#each items}}\n <tr>\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:center;\">{{sl}}</td>\n <td style=\"padding:7px;border:1px solid #d1d5db;\">{{description}}</td>\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:center;\">{{hsn}}</td>\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:center;\">{{quantity}}</td>\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">{{formatCurrency rate ../currency ../locale}}</td>\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">{{formatCurrency taxableValue ../currency ../locale}}</td>\n {{#if ../interState}}\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">{{igstRate}}%<br>{{formatCurrency igst ../currency ../locale}}</td>\n {{else}}\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">{{cgstRate}}%<br>{{formatCurrency cgst ../currency ../locale}}</td>\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">{{sgstRate}}%<br>{{formatCurrency sgst ../currency ../locale}}</td>\n {{/if}}\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:right;font-weight:700;\">{{formatCurrency total ../currency ../locale}}</td>\n </tr>\n {{/each}}\n </tbody>\n </table>\n <div style=\"display:flex;justify-content:space-between;gap:24px;margin-top:14px;\">\n <div style=\"flex:1;\">\n <p style=\"margin:0;font-size:11px;color:#6b7280;\">Amount chargeable (in words)</p>\n <p style=\"margin:2px 0 14px;font-weight:700;\">{{amountInWords}}</p>\n {{#if bank.name}}\n <p style=\"margin:0;font-size:11px;color:#6b7280;\">Bank details</p>\n <p style=\"margin:2px 0 0;line-height:1.6;\">{{bank.name}} · A/c {{bank.accountNumber}}<br>IFSC {{bank.ifsc}} · {{bank.branch}}</p>\n {{/if}}\n </div>\n <table style=\"min-width:250px;border-collapse:collapse;font-size:inherit;line-height:inherit;\">\n <tr><td style=\"padding:4px 0;color:#6b7280;\">Taxable value</td><td style=\"padding:4px 0;text-align:right;\">{{formatCurrency totals.taxableValue currency locale}}</td></tr>\n {{#if interState}}\n <tr><td style=\"padding:4px 0;color:#6b7280;\">IGST</td><td style=\"padding:4px 0;text-align:right;\">{{formatCurrency totals.igst currency locale}}</td></tr>\n {{else}}\n <tr><td style=\"padding:4px 0;color:#6b7280;\">CGST</td><td style=\"padding:4px 0;text-align:right;\">{{formatCurrency totals.cgst currency locale}}</td></tr>\n <tr><td style=\"padding:4px 0;color:#6b7280;\">SGST</td><td style=\"padding:4px 0;text-align:right;\">{{formatCurrency totals.sgst currency locale}}</td></tr>\n {{/if}}\n <tr style=\"border-top:2px solid #111827;\"><td style=\"padding:8px 0 0;font-weight:800;font-size:14px;\">Grand total</td><td style=\"padding:8px 0 0;text-align:right;font-weight:800;font-size:14px;\">{{formatCurrency totals.grandTotal currency locale}}</td></tr>\n </table>\n </div>\n <div style=\"display:flex;justify-content:space-between;align-items:flex-end;margin-top:32px;border-top:1px solid #e5e7eb;padding-top:12px;\">\n <p style=\"margin:0;max-width:400px;font-size:11px;color:#6b7280;\">{{declaration}}</p>\n <div style=\"text-align:right;font-size:12px;\">\n <p style=\"margin:0;\">For <strong>{{supplier.name}}</strong></p>\n <p style=\"margin:36px 0 0;color:#6b7280;\">Authorised signatory</p>\n </div>\n </div>\n</div>"
}' --output gst-invoice.pdf
Copyimport fs from "node:fs" ;
const template = "<link href=\"https://fonts.googleapis.com/css2?family=Noto+Sans:wght@400;600;700;800&display=swap\" rel=\"stylesheet\">\n<div style=\"max-width:780px;margin:0 auto;padding:40px;font-family:'Noto Sans',-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:#111827;font-size:12.5px;\">\n <div style=\"text-align:center;margin-bottom:16px;\">\n <h1 style=\"font-size:22px;font-weight:800;letter-spacing:3px;margin:0;\">TAX INVOICE</h1>\n <p style=\"margin:2px 0 0;font-size:11px;color:#6b7280;\">Original for recipient</p>\n </div>\n <table style=\"width:100%;border-collapse:collapse;font-size:inherit;line-height:inherit;\">\n <tr>\n <td style=\"width:58%;vertical-align:top;padding:12px;border:1px solid #d1d5db;\">\n {{#if logo}}<img src=\"{{logo}}\" alt=\"\" style=\"display:block;max-width:200px;max-height:56px;margin:0 0 10px;\">{{/if}}\n <p style=\"margin:0;font-size:16px;font-weight:800;\">{{supplier.name}}</p>\n <p style=\"margin:2px 0 0;color:#4b5563;white-space:pre-line;\">{{supplier.address}}</p>\n <p style=\"margin:6px 0 0;\">GSTIN: <strong>{{supplier.gstin}}</strong></p>\n <p style=\"margin:2px 0 0;\">State: {{supplier.state}} (Code {{supplier.stateCode}})</p>\n </td>\n <td style=\"vertical-align:top;padding:12px;border:1px solid #d1d5db;line-height:1.8;\">\n Invoice no. <strong>{{invoiceNumber}}</strong><br>\n Invoice date <strong>{{formatDate invoiceDate locale}}</strong><br>\n Place of supply <strong>{{placeOfSupply}}</strong><br>\n Reverse charge <strong>{{reverseCharge}}</strong>\n </td>\n </tr>\n <tr>\n <td colspan=\"2\" style=\"padding:12px;border:1px solid #d1d5db;\">\n <p style=\"margin:0 0 4px;font-size:11px;color:#6b7280;font-weight:700;text-transform:uppercase;letter-spacing:1px;\">Bill to</p>\n <p style=\"margin:0;font-weight:700;\">{{buyer.name}}</p>\n <p style=\"margin:2px 0 0;color:#4b5563;white-space:pre-line;\">{{buyer.address}}</p>\n <p style=\"margin:4px 0 0;\">{{#if buyer.gstin}}GSTIN: <strong>{{buyer.gstin}}</strong> · {{/if}}State: {{buyer.state}} (Code {{buyer.stateCode}})</p>\n </td>\n </tr>\n </table>\n <table style=\"width:100%;border-collapse:collapse;margin-top:14px;font-size:11.5px;line-height:inherit;\">\n <thead>\n <tr style=\"background:#f3f4f6;\">\n <th style=\"padding:7px;border:1px solid #d1d5db;\">#</th>\n <th style=\"padding:7px;border:1px solid #d1d5db;text-align:left;\">Description</th>\n <th style=\"padding:7px;border:1px solid #d1d5db;\">HSN/SAC</th>\n <th style=\"padding:7px;border:1px solid #d1d5db;\">Qty</th>\n <th style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">Rate</th>\n <th style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">Taxable value</th>\n {{#if interState}}\n <th style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">IGST</th>\n {{else}}\n <th style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">CGST</th>\n <th style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">SGST</th>\n {{/if}}\n <th style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">Total</th>\n </tr>\n </thead>\n <tbody>\n {{#each items}}\n <tr>\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:center;\">{{sl}}</td>\n <td style=\"padding:7px;border:1px solid #d1d5db;\">{{description}}</td>\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:center;\">{{hsn}}</td>\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:center;\">{{quantity}}</td>\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">{{formatCurrency rate ../currency ../locale}}</td>\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">{{formatCurrency taxableValue ../currency ../locale}}</td>\n {{#if ../interState}}\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">{{igstRate}}%<br>{{formatCurrency igst ../currency ../locale}}</td>\n {{else}}\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">{{cgstRate}}%<br>{{formatCurrency cgst ../currency ../locale}}</td>\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">{{sgstRate}}%<br>{{formatCurrency sgst ../currency ../locale}}</td>\n {{/if}}\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:right;font-weight:700;\">{{formatCurrency total ../currency ../locale}}</td>\n </tr>\n {{/each}}\n </tbody>\n </table>\n <div style=\"display:flex;justify-content:space-between;gap:24px;margin-top:14px;\">\n <div style=\"flex:1;\">\n <p style=\"margin:0;font-size:11px;color:#6b7280;\">Amount chargeable (in words)</p>\n <p style=\"margin:2px 0 14px;font-weight:700;\">{{amountInWords}}</p>\n {{#if bank.name}}\n <p style=\"margin:0;font-size:11px;color:#6b7280;\">Bank details</p>\n <p style=\"margin:2px 0 0;line-height:1.6;\">{{bank.name}} · A/c {{bank.accountNumber}}<br>IFSC {{bank.ifsc}} · {{bank.branch}}</p>\n {{/if}}\n </div>\n <table style=\"min-width:250px;border-collapse:collapse;font-size:inherit;line-height:inherit;\">\n <tr><td style=\"padding:4px 0;color:#6b7280;\">Taxable value</td><td style=\"padding:4px 0;text-align:right;\">{{formatCurrency totals.taxableValue currency locale}}</td></tr>\n {{#if interState}}\n <tr><td style=\"padding:4px 0;color:#6b7280;\">IGST</td><td style=\"padding:4px 0;text-align:right;\">{{formatCurrency totals.igst currency locale}}</td></tr>\n {{else}}\n <tr><td style=\"padding:4px 0;color:#6b7280;\">CGST</td><td style=\"padding:4px 0;text-align:right;\">{{formatCurrency totals.cgst currency locale}}</td></tr>\n <tr><td style=\"padding:4px 0;color:#6b7280;\">SGST</td><td style=\"padding:4px 0;text-align:right;\">{{formatCurrency totals.sgst currency locale}}</td></tr>\n {{/if}}\n <tr style=\"border-top:2px solid #111827;\"><td style=\"padding:8px 0 0;font-weight:800;font-size:14px;\">Grand total</td><td style=\"padding:8px 0 0;text-align:right;font-weight:800;font-size:14px;\">{{formatCurrency totals.grandTotal currency locale}}</td></tr>\n </table>\n </div>\n <div style=\"display:flex;justify-content:space-between;align-items:flex-end;margin-top:32px;border-top:1px solid #e5e7eb;padding-top:12px;\">\n <p style=\"margin:0;max-width:400px;font-size:11px;color:#6b7280;\">{{declaration}}</p>\n <div style=\"text-align:right;font-size:12px;\">\n <p style=\"margin:0;\">For <strong>{{supplier.name}}</strong></p>\n <p style=\"margin:36px 0 0;color:#6b7280;\">Authorised signatory</p>\n </div>\n </div>\n</div>" ;
const res = await fetch ( "https://pdfgen.com/api/v1/generate" , {
method : "POST" ,
headers : {
Authorization : "Bearer pdfg_live_xxx" ,
"Content-Type" : "application/json" ,
} ,
body : JSON . stringify ( {
html : template ,
engine : "handlebars" ,
format : "A4" ,
data : {
"supplier" : {
"name" : "Nimbus Technologies Pvt. Ltd." ,
"address" : "4th Floor, Prestige Tower, MG Road\nBengaluru, Karnataka 560001" ,
"gstin" : "29ABCDE1234F1Z5" ,
"state" : "Karnataka" ,
"stateCode" : "29"
} ,
"buyer" : {
"name" : "Saffron Retail LLP" ,
"address" : "22, 80 Feet Road, Koramangala\nBengaluru, Karnataka 560034" ,
"gstin" : "29AAKFS1234K1Z2" ,
"state" : "Karnataka" ,
"stateCode" : "29"
} ,
"invoiceNumber" : "NT/2026-27/0458" ,
"reverseCharge" : "No" ,
"bank" : {
"name" : "HDFC Bank" ,
"accountNumber" : "50200012345678" ,
"ifsc" : "HDFC0001234" ,
"branch" : "MG Road, Bengaluru"
} ,
"declaration" : "We declare that this invoice shows the actual price of the goods and services described and that all particulars are true and correct." ,
"invoiceDate" : "2026-11-03" ,
"placeOfSupply" : "Karnataka (29)" ,
"interState" : false ,
"currency" : "INR" ,
"locale" : "en-IN" ,
"items" : [
{
"sl" : 1 ,
"description" : "Retail POS software, annual subscription" ,
"hsn" : "997331" ,
"quantity" : 1 ,
"rate" : 120000 ,
"taxableValue" : 120000 ,
"igstRate" : 18 ,
"igst" : 0 ,
"cgstRate" : 9 ,
"cgst" : 10800 ,
"sgstRate" : 9 ,
"sgst" : 10800 ,
"total" : 141600
} ,
{
"sl" : 2 ,
"description" : "On-site setup and staff training (days)" ,
"hsn" : "998313" ,
"quantity" : 2 ,
"rate" : 15000 ,
"taxableValue" : 30000 ,
"igstRate" : 18 ,
"igst" : 0 ,
"cgstRate" : 9 ,
"cgst" : 2700 ,
"sgstRate" : 9 ,
"sgst" : 2700 ,
"total" : 35400
}
] ,
"totals" : {
"taxableValue" : 150000 ,
"cgst" : 13500 ,
"sgst" : 13500 ,
"igst" : 0 ,
"grandTotal" : 177000
} ,
"amountInWords" : "Indian Rupees One Lakh Seventy-Seven Thousand Only"
} ,
} ) ,
} ) ;
fs . writeFileSync ( "gst-invoice.pdf" , Buffer . from ( await res . arrayBuffer ( ) ) ) ;
Copyimport requests
template = "<link href=\"https://fonts.googleapis.com/css2?family=Noto+Sans:wght@400;600;700;800&display=swap\" rel=\"stylesheet\">\n<div style=\"max-width:780px;margin:0 auto;padding:40px;font-family:'Noto Sans',-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:#111827;font-size:12.5px;\">\n <div style=\"text-align:center;margin-bottom:16px;\">\n <h1 style=\"font-size:22px;font-weight:800;letter-spacing:3px;margin:0;\">TAX INVOICE</h1>\n <p style=\"margin:2px 0 0;font-size:11px;color:#6b7280;\">Original for recipient</p>\n </div>\n <table style=\"width:100%;border-collapse:collapse;font-size:inherit;line-height:inherit;\">\n <tr>\n <td style=\"width:58%;vertical-align:top;padding:12px;border:1px solid #d1d5db;\">\n {{#if logo}}<img src=\"{{logo}}\" alt=\"\" style=\"display:block;max-width:200px;max-height:56px;margin:0 0 10px;\">{{/if}}\n <p style=\"margin:0;font-size:16px;font-weight:800;\">{{supplier.name}}</p>\n <p style=\"margin:2px 0 0;color:#4b5563;white-space:pre-line;\">{{supplier.address}}</p>\n <p style=\"margin:6px 0 0;\">GSTIN: <strong>{{supplier.gstin}}</strong></p>\n <p style=\"margin:2px 0 0;\">State: {{supplier.state}} (Code {{supplier.stateCode}})</p>\n </td>\n <td style=\"vertical-align:top;padding:12px;border:1px solid #d1d5db;line-height:1.8;\">\n Invoice no. <strong>{{invoiceNumber}}</strong><br>\n Invoice date <strong>{{formatDate invoiceDate locale}}</strong><br>\n Place of supply <strong>{{placeOfSupply}}</strong><br>\n Reverse charge <strong>{{reverseCharge}}</strong>\n </td>\n </tr>\n <tr>\n <td colspan=\"2\" style=\"padding:12px;border:1px solid #d1d5db;\">\n <p style=\"margin:0 0 4px;font-size:11px;color:#6b7280;font-weight:700;text-transform:uppercase;letter-spacing:1px;\">Bill to</p>\n <p style=\"margin:0;font-weight:700;\">{{buyer.name}}</p>\n <p style=\"margin:2px 0 0;color:#4b5563;white-space:pre-line;\">{{buyer.address}}</p>\n <p style=\"margin:4px 0 0;\">{{#if buyer.gstin}}GSTIN: <strong>{{buyer.gstin}}</strong> · {{/if}}State: {{buyer.state}} (Code {{buyer.stateCode}})</p>\n </td>\n </tr>\n </table>\n <table style=\"width:100%;border-collapse:collapse;margin-top:14px;font-size:11.5px;line-height:inherit;\">\n <thead>\n <tr style=\"background:#f3f4f6;\">\n <th style=\"padding:7px;border:1px solid #d1d5db;\">#</th>\n <th style=\"padding:7px;border:1px solid #d1d5db;text-align:left;\">Description</th>\n <th style=\"padding:7px;border:1px solid #d1d5db;\">HSN/SAC</th>\n <th style=\"padding:7px;border:1px solid #d1d5db;\">Qty</th>\n <th style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">Rate</th>\n <th style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">Taxable value</th>\n {{#if interState}}\n <th style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">IGST</th>\n {{else}}\n <th style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">CGST</th>\n <th style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">SGST</th>\n {{/if}}\n <th style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">Total</th>\n </tr>\n </thead>\n <tbody>\n {{#each items}}\n <tr>\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:center;\">{{sl}}</td>\n <td style=\"padding:7px;border:1px solid #d1d5db;\">{{description}}</td>\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:center;\">{{hsn}}</td>\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:center;\">{{quantity}}</td>\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">{{formatCurrency rate ../currency ../locale}}</td>\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">{{formatCurrency taxableValue ../currency ../locale}}</td>\n {{#if ../interState}}\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">{{igstRate}}%<br>{{formatCurrency igst ../currency ../locale}}</td>\n {{else}}\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">{{cgstRate}}%<br>{{formatCurrency cgst ../currency ../locale}}</td>\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:right;\">{{sgstRate}}%<br>{{formatCurrency sgst ../currency ../locale}}</td>\n {{/if}}\n <td style=\"padding:7px;border:1px solid #d1d5db;text-align:right;font-weight:700;\">{{formatCurrency total ../currency ../locale}}</td>\n </tr>\n {{/each}}\n </tbody>\n </table>\n <div style=\"display:flex;justify-content:space-between;gap:24px;margin-top:14px;\">\n <div style=\"flex:1;\">\n <p style=\"margin:0;font-size:11px;color:#6b7280;\">Amount chargeable (in words)</p>\n <p style=\"margin:2px 0 14px;font-weight:700;\">{{amountInWords}}</p>\n {{#if bank.name}}\n <p style=\"margin:0;font-size:11px;color:#6b7280;\">Bank details</p>\n <p style=\"margin:2px 0 0;line-height:1.6;\">{{bank.name}} · A/c {{bank.accountNumber}}<br>IFSC {{bank.ifsc}} · {{bank.branch}}</p>\n {{/if}}\n </div>\n <table style=\"min-width:250px;border-collapse:collapse;font-size:inherit;line-height:inherit;\">\n <tr><td style=\"padding:4px 0;color:#6b7280;\">Taxable value</td><td style=\"padding:4px 0;text-align:right;\">{{formatCurrency totals.taxableValue currency locale}}</td></tr>\n {{#if interState}}\n <tr><td style=\"padding:4px 0;color:#6b7280;\">IGST</td><td style=\"padding:4px 0;text-align:right;\">{{formatCurrency totals.igst currency locale}}</td></tr>\n {{else}}\n <tr><td style=\"padding:4px 0;color:#6b7280;\">CGST</td><td style=\"padding:4px 0;text-align:right;\">{{formatCurrency totals.cgst currency locale}}</td></tr>\n <tr><td style=\"padding:4px 0;color:#6b7280;\">SGST</td><td style=\"padding:4px 0;text-align:right;\">{{formatCurrency totals.sgst currency locale}}</td></tr>\n {{/if}}\n <tr style=\"border-top:2px solid #111827;\"><td style=\"padding:8px 0 0;font-weight:800;font-size:14px;\">Grand total</td><td style=\"padding:8px 0 0;text-align:right;font-weight:800;font-size:14px;\">{{formatCurrency totals.grandTotal currency locale}}</td></tr>\n </table>\n </div>\n <div style=\"display:flex;justify-content:space-between;align-items:flex-end;margin-top:32px;border-top:1px solid #e5e7eb;padding-top:12px;\">\n <p style=\"margin:0;max-width:400px;font-size:11px;color:#6b7280;\">{{declaration}}</p>\n <div style=\"text-align:right;font-size:12px;\">\n <p style=\"margin:0;\">For <strong>{{supplier.name}}</strong></p>\n <p style=\"margin:36px 0 0;color:#6b7280;\">Authorised signatory</p>\n </div>\n </div>\n</div>"
res = requests . post (
"https://pdfgen.com/api/v1/generate" ,
headers = { "Authorization" : "Bearer pdfg_live_xxx" } ,
json = {
"html" : template ,
"engine" : "handlebars" ,
"format" : "A4" ,
"data" : {
"supplier" : {
"name" : "Nimbus Technologies Pvt. Ltd." ,
"address" : "4th Floor, Prestige Tower, MG Road\nBengaluru, Karnataka 560001" ,
"gstin" : "29ABCDE1234F1Z5" ,
"state" : "Karnataka" ,
"stateCode" : "29"
} ,
"buyer" : {
"name" : "Saffron Retail LLP" ,
"address" : "22, 80 Feet Road, Koramangala\nBengaluru, Karnataka 560034" ,
"gstin" : "29AAKFS1234K1Z2" ,
"state" : "Karnataka" ,
"stateCode" : "29"
} ,
"invoiceNumber" : "NT/2026-27/0458" ,
"reverseCharge" : "No" ,
"bank" : {
"name" : "HDFC Bank" ,
"accountNumber" : "50200012345678" ,
"ifsc" : "HDFC0001234" ,
"branch" : "MG Road, Bengaluru"
} ,
"declaration" : "We declare that this invoice shows the actual price of the goods and services described and that all particulars are true and correct." ,
"invoiceDate" : "2026-11-03" ,
"placeOfSupply" : "Karnataka (29)" ,
"interState" : False ,
"currency" : "INR" ,
"locale" : "en-IN" ,
"items" : [
{
"sl" : 1 ,
"description" : "Retail POS software, annual subscription" ,
"hsn" : "997331" ,
"quantity" : 1 ,
"rate" : 120000 ,
"taxableValue" : 120000 ,
"igstRate" : 18 ,
"igst" : 0 ,
"cgstRate" : 9 ,
"cgst" : 10800 ,
"sgstRate" : 9 ,
"sgst" : 10800 ,
"total" : 141600
} ,
{
"sl" : 2 ,
"description" : "On-site setup and staff training (days)" ,
"hsn" : "998313" ,
"quantity" : 2 ,
"rate" : 15000 ,
"taxableValue" : 30000 ,
"igstRate" : 18 ,
"igst" : 0 ,
"cgstRate" : 9 ,
"cgst" : 2700 ,
"sgstRate" : 9 ,
"sgst" : 2700 ,
"total" : 35400
}
] ,
"totals" : {
"taxableValue" : 150000 ,
"cgst" : 13500 ,
"sgst" : 13500 ,
"igst" : 0 ,
"grandTotal" : 177000
} ,
"amountInWords" : "Indian Rupees One Lakh Seventy-Seven Thousand Only"
} ,
} ,
)
with open ( "gst-invoice.pdf" , "wb" ) as f :
f . write ( res . content )