Copycurl -X POST https://pdfgen.com/api/v1/generate \
-H "Authorization: Bearer pdfg_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"data": {
"school": {
"name": "Riverside International School",
"address": "Sector 21, Dwarka, New Delhi 110077"
},
"term": "Term 1 · Academic year 2026–27",
"student": {
"name": "Aarav Singh",
"className": "Grade 8 – B",
"rollNumber": "14"
},
"attendance": "96% (92 of 96 days)",
"subjects": [
{
"name": "English",
"max": 100,
"marks": 88,
"grade": "A2",
"remarks": "Expressive, confident writer"
},
{
"name": "Mathematics",
"max": 100,
"marks": 94,
"grade": "A1",
"remarks": "Excellent problem solving"
},
{
"name": "Science",
"max": 100,
"marks": 85,
"grade": "A2",
"remarks": "Strong in practical work"
},
{
"name": "Social Studies",
"max": 100,
"marks": 79,
"grade": "B1",
"remarks": "Should revise map work"
},
{
"name": "Hindi",
"max": 100,
"marks": 82,
"grade": "A2",
"remarks": "Good reading fluency"
},
{
"name": "Computer Science",
"max": 50,
"marks": 47,
"grade": "A1",
"remarks": "Very good at coding tasks"
}
],
"total": 475,
"maxTotal": 550,
"percentage": "86.4",
"overallGrade": "A2",
"teacherRemarks": "Aarav is attentive and curious in class and takes part eagerly in discussions. He should keep up his steady effort in Social Studies to match his excellent results in Mathematics and Computer Science."
},
"format": "A4",
"engine": "handlebars",
"html": "<div style=\"max-width:760px;margin:0 auto;padding:44px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:#111827;font-size:13px;\">\n <div style=\"text-align:center;border-bottom:3px double #1e3a8a;padding-bottom:14px;margin-bottom:20px;\">\n <h1 style=\"font-size:24px;font-weight:800;margin:0;color:#1e3a8a;\">{{school.name}}</h1>\n <p style=\"margin:4px 0 0;font-size:12px;color:#6b7280;\">{{school.address}}</p>\n <p style=\"margin:12px 0 0;font-size:14px;font-weight:800;letter-spacing:3px;\">PROGRESS REPORT</p>\n <p style=\"margin:2px 0 0;font-size:12px;color:#6b7280;\">{{term}}</p>\n </div>\n <table style=\"width:100%;border-collapse:collapse;margin-bottom:18px;font-size:inherit;line-height:inherit;\">\n <tr>\n <td style=\"padding:8px 10px;border:1px solid #e5e7eb;\"><span style=\"color:#9ca3af;\">Student</span><br><strong>{{student.name}}</strong></td>\n <td style=\"padding:8px 10px;border:1px solid #e5e7eb;\"><span style=\"color:#9ca3af;\">Class</span><br><strong>{{student.className}}</strong></td>\n <td style=\"padding:8px 10px;border:1px solid #e5e7eb;\"><span style=\"color:#9ca3af;\">Roll no.</span><br><strong>{{student.rollNumber}}</strong></td>\n <td style=\"padding:8px 10px;border:1px solid #e5e7eb;\"><span style=\"color:#9ca3af;\">Attendance</span><br><strong>{{attendance}}</strong></td>\n </tr>\n </table>\n <table style=\"width:100%;border-collapse:collapse;font-size:inherit;line-height:inherit;\">\n <thead>\n <tr style=\"background:#1e3a8a;color:#fff;text-align:left;\">\n <th style=\"padding:9px 10px;\">Subject</th>\n <th style=\"padding:9px 10px;text-align:center;\">Max</th>\n <th style=\"padding:9px 10px;text-align:center;\">Marks</th>\n <th style=\"padding:9px 10px;text-align:center;\">Grade</th>\n <th style=\"padding:9px 10px;\">Remarks</th>\n </tr>\n </thead>\n <tbody>\n {{#each subjects}}\n <tr>\n <td style=\"padding:9px 10px;border-bottom:1px solid #e5e7eb;font-weight:600;\">{{name}}</td>\n <td style=\"padding:9px 10px;border-bottom:1px solid #e5e7eb;text-align:center;color:#6b7280;\">{{max}}</td>\n <td style=\"padding:9px 10px;border-bottom:1px solid #e5e7eb;text-align:center;font-weight:700;\">{{marks}}</td>\n <td style=\"padding:9px 10px;border-bottom:1px solid #e5e7eb;text-align:center;\"><span style=\"background:#eff6ff;color:#1e40af;border-radius:4px;padding:2px 8px;font-weight:700;\">{{grade}}</span></td>\n <td style=\"padding:9px 10px;border-bottom:1px solid #e5e7eb;color:#6b7280;\">{{remarks}}</td>\n </tr>\n {{/each}}\n </tbody>\n </table>\n <div style=\"display:flex;gap:10px;margin:18px 0;\">\n <div style=\"flex:1;background:#f9fafb;border-radius:8px;padding:12px;text-align:center;\"><p style=\"margin:0;font-size:11px;color:#6b7280;\">Total</p><p style=\"margin:4px 0 0;font-size:17px;font-weight:800;\">{{total}} / {{maxTotal}}</p></div>\n <div style=\"flex:1;background:#f9fafb;border-radius:8px;padding:12px;text-align:center;\"><p style=\"margin:0;font-size:11px;color:#6b7280;\">Percentage</p><p style=\"margin:4px 0 0;font-size:17px;font-weight:800;\">{{percentage}}%</p></div>\n <div style=\"flex:1;background:#1e3a8a;color:#fff;border-radius:8px;padding:12px;text-align:center;\"><p style=\"margin:0;font-size:11px;opacity:.85;\">Overall grade</p><p style=\"margin:4px 0 0;font-size:17px;font-weight:800;\">{{overallGrade}}</p></div>\n </div>\n <p style=\"font-size:11px;text-transform:uppercase;letter-spacing:1.5px;color:#9ca3af;font-weight:700;margin:0 0 8px;\">Class teacher' \ ' 's remarks</p>\n <p style=\"margin:0;line-height:1.65;color:#374151;\">{{teacherRemarks}}</p>\n <div style=\"display:flex;gap:28px;margin-top:56px;font-size:12px;color:#6b7280;text-align:center;\">\n <span style=\"flex:1;border-top:1px solid #9ca3af;padding-top:4px;\">Class teacher</span>\n <span style=\"flex:1;border-top:1px solid #9ca3af;padding-top:4px;\">Principal</span>\n <span style=\"flex:1;border-top:1px solid #9ca3af;padding-top:4px;\">Parent / guardian</span>\n </div>\n</div>"
}' --output report-card.pdf
Copyimport fs from "node:fs" ;
const template = "<div style=\"max-width:760px;margin:0 auto;padding:44px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:#111827;font-size:13px;\">\n <div style=\"text-align:center;border-bottom:3px double #1e3a8a;padding-bottom:14px;margin-bottom:20px;\">\n <h1 style=\"font-size:24px;font-weight:800;margin:0;color:#1e3a8a;\">{{school.name}}</h1>\n <p style=\"margin:4px 0 0;font-size:12px;color:#6b7280;\">{{school.address}}</p>\n <p style=\"margin:12px 0 0;font-size:14px;font-weight:800;letter-spacing:3px;\">PROGRESS REPORT</p>\n <p style=\"margin:2px 0 0;font-size:12px;color:#6b7280;\">{{term}}</p>\n </div>\n <table style=\"width:100%;border-collapse:collapse;margin-bottom:18px;font-size:inherit;line-height:inherit;\">\n <tr>\n <td style=\"padding:8px 10px;border:1px solid #e5e7eb;\"><span style=\"color:#9ca3af;\">Student</span><br><strong>{{student.name}}</strong></td>\n <td style=\"padding:8px 10px;border:1px solid #e5e7eb;\"><span style=\"color:#9ca3af;\">Class</span><br><strong>{{student.className}}</strong></td>\n <td style=\"padding:8px 10px;border:1px solid #e5e7eb;\"><span style=\"color:#9ca3af;\">Roll no.</span><br><strong>{{student.rollNumber}}</strong></td>\n <td style=\"padding:8px 10px;border:1px solid #e5e7eb;\"><span style=\"color:#9ca3af;\">Attendance</span><br><strong>{{attendance}}</strong></td>\n </tr>\n </table>\n <table style=\"width:100%;border-collapse:collapse;font-size:inherit;line-height:inherit;\">\n <thead>\n <tr style=\"background:#1e3a8a;color:#fff;text-align:left;\">\n <th style=\"padding:9px 10px;\">Subject</th>\n <th style=\"padding:9px 10px;text-align:center;\">Max</th>\n <th style=\"padding:9px 10px;text-align:center;\">Marks</th>\n <th style=\"padding:9px 10px;text-align:center;\">Grade</th>\n <th style=\"padding:9px 10px;\">Remarks</th>\n </tr>\n </thead>\n <tbody>\n {{#each subjects}}\n <tr>\n <td style=\"padding:9px 10px;border-bottom:1px solid #e5e7eb;font-weight:600;\">{{name}}</td>\n <td style=\"padding:9px 10px;border-bottom:1px solid #e5e7eb;text-align:center;color:#6b7280;\">{{max}}</td>\n <td style=\"padding:9px 10px;border-bottom:1px solid #e5e7eb;text-align:center;font-weight:700;\">{{marks}}</td>\n <td style=\"padding:9px 10px;border-bottom:1px solid #e5e7eb;text-align:center;\"><span style=\"background:#eff6ff;color:#1e40af;border-radius:4px;padding:2px 8px;font-weight:700;\">{{grade}}</span></td>\n <td style=\"padding:9px 10px;border-bottom:1px solid #e5e7eb;color:#6b7280;\">{{remarks}}</td>\n </tr>\n {{/each}}\n </tbody>\n </table>\n <div style=\"display:flex;gap:10px;margin:18px 0;\">\n <div style=\"flex:1;background:#f9fafb;border-radius:8px;padding:12px;text-align:center;\"><p style=\"margin:0;font-size:11px;color:#6b7280;\">Total</p><p style=\"margin:4px 0 0;font-size:17px;font-weight:800;\">{{total}} / {{maxTotal}}</p></div>\n <div style=\"flex:1;background:#f9fafb;border-radius:8px;padding:12px;text-align:center;\"><p style=\"margin:0;font-size:11px;color:#6b7280;\">Percentage</p><p style=\"margin:4px 0 0;font-size:17px;font-weight:800;\">{{percentage}}%</p></div>\n <div style=\"flex:1;background:#1e3a8a;color:#fff;border-radius:8px;padding:12px;text-align:center;\"><p style=\"margin:0;font-size:11px;opacity:.85;\">Overall grade</p><p style=\"margin:4px 0 0;font-size:17px;font-weight:800;\">{{overallGrade}}</p></div>\n </div>\n <p style=\"font-size:11px;text-transform:uppercase;letter-spacing:1.5px;color:#9ca3af;font-weight:700;margin:0 0 8px;\">Class teacher's remarks</p>\n <p style=\"margin:0;line-height:1.65;color:#374151;\">{{teacherRemarks}}</p>\n <div style=\"display:flex;gap:28px;margin-top:56px;font-size:12px;color:#6b7280;text-align:center;\">\n <span style=\"flex:1;border-top:1px solid #9ca3af;padding-top:4px;\">Class teacher</span>\n <span style=\"flex:1;border-top:1px solid #9ca3af;padding-top:4px;\">Principal</span>\n <span style=\"flex:1;border-top:1px solid #9ca3af;padding-top:4px;\">Parent / guardian</span>\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 : {
"school" : {
"name" : "Riverside International School" ,
"address" : "Sector 21, Dwarka, New Delhi 110077"
} ,
"term" : "Term 1 · Academic year 2026–27" ,
"student" : {
"name" : "Aarav Singh" ,
"className" : "Grade 8 – B" ,
"rollNumber" : "14"
} ,
"attendance" : "96% (92 of 96 days)" ,
"subjects" : [
{
"name" : "English" ,
"max" : 100 ,
"marks" : 88 ,
"grade" : "A2" ,
"remarks" : "Expressive, confident writer"
} ,
{
"name" : "Mathematics" ,
"max" : 100 ,
"marks" : 94 ,
"grade" : "A1" ,
"remarks" : "Excellent problem solving"
} ,
{
"name" : "Science" ,
"max" : 100 ,
"marks" : 85 ,
"grade" : "A2" ,
"remarks" : "Strong in practical work"
} ,
{
"name" : "Social Studies" ,
"max" : 100 ,
"marks" : 79 ,
"grade" : "B1" ,
"remarks" : "Should revise map work"
} ,
{
"name" : "Hindi" ,
"max" : 100 ,
"marks" : 82 ,
"grade" : "A2" ,
"remarks" : "Good reading fluency"
} ,
{
"name" : "Computer Science" ,
"max" : 50 ,
"marks" : 47 ,
"grade" : "A1" ,
"remarks" : "Very good at coding tasks"
}
] ,
"total" : 475 ,
"maxTotal" : 550 ,
"percentage" : "86.4" ,
"overallGrade" : "A2" ,
"teacherRemarks" : "Aarav is attentive and curious in class and takes part eagerly in discussions. He should keep up his steady effort in Social Studies to match his excellent results in Mathematics and Computer Science."
} ,
} ) ,
} ) ;
fs . writeFileSync ( "report-card.pdf" , Buffer . from ( await res . arrayBuffer ( ) ) ) ;
Copyimport requests
template = "<div style=\"max-width:760px;margin:0 auto;padding:44px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:#111827;font-size:13px;\">\n <div style=\"text-align:center;border-bottom:3px double #1e3a8a;padding-bottom:14px;margin-bottom:20px;\">\n <h1 style=\"font-size:24px;font-weight:800;margin:0;color:#1e3a8a;\">{{school.name}}</h1>\n <p style=\"margin:4px 0 0;font-size:12px;color:#6b7280;\">{{school.address}}</p>\n <p style=\"margin:12px 0 0;font-size:14px;font-weight:800;letter-spacing:3px;\">PROGRESS REPORT</p>\n <p style=\"margin:2px 0 0;font-size:12px;color:#6b7280;\">{{term}}</p>\n </div>\n <table style=\"width:100%;border-collapse:collapse;margin-bottom:18px;font-size:inherit;line-height:inherit;\">\n <tr>\n <td style=\"padding:8px 10px;border:1px solid #e5e7eb;\"><span style=\"color:#9ca3af;\">Student</span><br><strong>{{student.name}}</strong></td>\n <td style=\"padding:8px 10px;border:1px solid #e5e7eb;\"><span style=\"color:#9ca3af;\">Class</span><br><strong>{{student.className}}</strong></td>\n <td style=\"padding:8px 10px;border:1px solid #e5e7eb;\"><span style=\"color:#9ca3af;\">Roll no.</span><br><strong>{{student.rollNumber}}</strong></td>\n <td style=\"padding:8px 10px;border:1px solid #e5e7eb;\"><span style=\"color:#9ca3af;\">Attendance</span><br><strong>{{attendance}}</strong></td>\n </tr>\n </table>\n <table style=\"width:100%;border-collapse:collapse;font-size:inherit;line-height:inherit;\">\n <thead>\n <tr style=\"background:#1e3a8a;color:#fff;text-align:left;\">\n <th style=\"padding:9px 10px;\">Subject</th>\n <th style=\"padding:9px 10px;text-align:center;\">Max</th>\n <th style=\"padding:9px 10px;text-align:center;\">Marks</th>\n <th style=\"padding:9px 10px;text-align:center;\">Grade</th>\n <th style=\"padding:9px 10px;\">Remarks</th>\n </tr>\n </thead>\n <tbody>\n {{#each subjects}}\n <tr>\n <td style=\"padding:9px 10px;border-bottom:1px solid #e5e7eb;font-weight:600;\">{{name}}</td>\n <td style=\"padding:9px 10px;border-bottom:1px solid #e5e7eb;text-align:center;color:#6b7280;\">{{max}}</td>\n <td style=\"padding:9px 10px;border-bottom:1px solid #e5e7eb;text-align:center;font-weight:700;\">{{marks}}</td>\n <td style=\"padding:9px 10px;border-bottom:1px solid #e5e7eb;text-align:center;\"><span style=\"background:#eff6ff;color:#1e40af;border-radius:4px;padding:2px 8px;font-weight:700;\">{{grade}}</span></td>\n <td style=\"padding:9px 10px;border-bottom:1px solid #e5e7eb;color:#6b7280;\">{{remarks}}</td>\n </tr>\n {{/each}}\n </tbody>\n </table>\n <div style=\"display:flex;gap:10px;margin:18px 0;\">\n <div style=\"flex:1;background:#f9fafb;border-radius:8px;padding:12px;text-align:center;\"><p style=\"margin:0;font-size:11px;color:#6b7280;\">Total</p><p style=\"margin:4px 0 0;font-size:17px;font-weight:800;\">{{total}} / {{maxTotal}}</p></div>\n <div style=\"flex:1;background:#f9fafb;border-radius:8px;padding:12px;text-align:center;\"><p style=\"margin:0;font-size:11px;color:#6b7280;\">Percentage</p><p style=\"margin:4px 0 0;font-size:17px;font-weight:800;\">{{percentage}}%</p></div>\n <div style=\"flex:1;background:#1e3a8a;color:#fff;border-radius:8px;padding:12px;text-align:center;\"><p style=\"margin:0;font-size:11px;opacity:.85;\">Overall grade</p><p style=\"margin:4px 0 0;font-size:17px;font-weight:800;\">{{overallGrade}}</p></div>\n </div>\n <p style=\"font-size:11px;text-transform:uppercase;letter-spacing:1.5px;color:#9ca3af;font-weight:700;margin:0 0 8px;\">Class teacher's remarks</p>\n <p style=\"margin:0;line-height:1.65;color:#374151;\">{{teacherRemarks}}</p>\n <div style=\"display:flex;gap:28px;margin-top:56px;font-size:12px;color:#6b7280;text-align:center;\">\n <span style=\"flex:1;border-top:1px solid #9ca3af;padding-top:4px;\">Class teacher</span>\n <span style=\"flex:1;border-top:1px solid #9ca3af;padding-top:4px;\">Principal</span>\n <span style=\"flex:1;border-top:1px solid #9ca3af;padding-top:4px;\">Parent / guardian</span>\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" : {
"school" : {
"name" : "Riverside International School" ,
"address" : "Sector 21, Dwarka, New Delhi 110077"
} ,
"term" : "Term 1 · Academic year 2026–27" ,
"student" : {
"name" : "Aarav Singh" ,
"className" : "Grade 8 – B" ,
"rollNumber" : "14"
} ,
"attendance" : "96% (92 of 96 days)" ,
"subjects" : [
{
"name" : "English" ,
"max" : 100 ,
"marks" : 88 ,
"grade" : "A2" ,
"remarks" : "Expressive, confident writer"
} ,
{
"name" : "Mathematics" ,
"max" : 100 ,
"marks" : 94 ,
"grade" : "A1" ,
"remarks" : "Excellent problem solving"
} ,
{
"name" : "Science" ,
"max" : 100 ,
"marks" : 85 ,
"grade" : "A2" ,
"remarks" : "Strong in practical work"
} ,
{
"name" : "Social Studies" ,
"max" : 100 ,
"marks" : 79 ,
"grade" : "B1" ,
"remarks" : "Should revise map work"
} ,
{
"name" : "Hindi" ,
"max" : 100 ,
"marks" : 82 ,
"grade" : "A2" ,
"remarks" : "Good reading fluency"
} ,
{
"name" : "Computer Science" ,
"max" : 50 ,
"marks" : 47 ,
"grade" : "A1" ,
"remarks" : "Very good at coding tasks"
}
] ,
"total" : 475 ,
"maxTotal" : 550 ,
"percentage" : "86.4" ,
"overallGrade" : "A2" ,
"teacherRemarks" : "Aarav is attentive and curious in class and takes part eagerly in discussions. He should keep up his steady effort in Social Studies to match his excellent results in Mathematics and Computer Science."
} ,
} ,
)
with open ( "report-card.pdf" , "wb" ) as f :
f . write ( res . content )