// ==UserScript==
// @name EPF Passbook 2026 PDF - SINGLE PAGE
// @namespace http://tampermonkey.net/
// @match https://passbook.epfindia.gov.in/MemberPassBook/passbook?token=*
// @grant none
// @run-at document-idle
// ==/UserScript==
(async () => {
const CFG = {
id: 'PUPUN34708350000010016 ',
pages: 1, // ✅ CHANGED: Only 1 page now
page: { w: 8.26, h: 11.69 },
img: { url: 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAeAB4AAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAChA+ADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9U6KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoqO4uYrWMyTypDGOrSMFA/E0y1v7a/UtbXEVwo6tE4YfpTs9wJ6KKKQBRRRQAUUVXu9QtbBQ1zcw26noZpAoP509wLFFQWt9bXyb7a4iuE/vROGH6VPSAKKKKACiiigAooqlca1p9pJ5c99bQyf3ZJlU/kTTs3sBdopkM0dxGHidZEPRkIIP40+kAUUUUAFFFFABRRRQAUU1mWNSzEKo5JJwBVOPXtNmk8uPULV5OmxZ1J/LNOzewF6iiikAUUVUutXsbGTZc3tvbv8A3ZZVU/qadm9gLdFRW9zDdRiSGVJkPRo2DD8xUtIAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiivK/i9+0t4F+CqrFruqedqT426bYgS3GPVgDhR/vEZ7VrSpVK0lCnFt+RMpKKvJ2PVKZLMkKF5HWNB1ZjgV4B8b/AI1Qax8ALrxb8PvG9lpV1gSW80jRb5cffh2yZw+O2MjFfAtvZfGT48TF0HifxVHJwZJHlaDr0ySEH0r3MFk8sVB1KlRQSdnff9PzOSrilTajFXufr0jrIoZWDKeQynINcJr3x4+H3hbX59E1jxbpmm6rBjzba5l2MuemSeP1rwH4Ka58cfCXw8sPDv8AZ/g2P+zN0S3mu6uWcRg/dKwkjK9M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hvtUtb4RyoWwkShSp9zj6c0zWfhC1xca62lvZada3zW7rZpEVicx/eWRVxw3fH69K9NoodGD6f1/TKjm2LhZRlorfhy//Io8jvPhDf6n/a7C20TRhexW8Yt7FXaPMUgcsfkXqBjpTdW+Eeuat4stdTku9OSO3v0u1lhjWOTy1/gIEW4n3MnPpXr1FT9XgbRzrFx2a7bX3SXXXZI43RLa41P4galrYt5INPjs1sYmlQq0zB9zMAedo6Z712VFFbxjyo8qtWdaSdrJJJfIKKKKo5wooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/2Q==',
x: 0.1, y: 0.1, w: 8.0, h: 1.2 },
title:{ text:'सदस्य पासबुक/Member Passbook', pt:26, wt:700, col:'#111', align:'center', mode:'below-image', x:0.3, y:1.55, gap:0.18, side:0.3, dpi:300, pad:12 },
financialYear: {
text: 'ईपीएफ पासबुक [ वित्तीय वर्ष - [ 2026-2027 ] / EPF Passbook [ Financial Year - 2026-2027 ]',
pt: 30, wt: 600, col: '#111', align: 'center', dpi: 300, pad: 8, gap: 0.10
},
endStatement: {
text: '------------ वक्तव्य का अंत / End Of Statement-------------',
fontPt: 25, fontWt: 'normal', col: '#0f172a', gapAbove: 0.30, gapRight: 0.15
},
printedOn: {
prefix: 'मुद्रित/Printed On : ',
fontPt: 25, fontWt: 'normal', col: '#111827', gapAbove: 0.00
},
disclaimer: {
text: 'अस्वीकरण - उपरोक्त जानकारी केंद्रीय सर्वर पर उपलब्ध डाटा के आधार पर प्रदर्शित की गई है। इस जानकारी का उपयोग कानूनी उद्देश्य के लिए नहीं किया जा सकता।',
fontPt: 22, fontWt: 'normal', col: '#374151', align: 'left', gapAbove: 0.20, side: 0.30, maxWidthPct: 1.00
},
disclaimer_en: {
text: 'Disclaimer - Information shown above is based on available data on central server. This information may not be use for legal purpose.',
fontPt: 22, fontWt: 'normal', col: '#374151', align: 'left', gapAbove: 0.12, side: 0.30, maxWidthPct: 1.00
},
separatorText: {
text: '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------',
fontPt: 21, fontWt: 'normal', col: '#94a3b8', align: 'left', side: 0.30, maxWidthPct: 1.00, gapAbove: 0.10, gapBelow: 0.10
},
advisory: {
lines: [
'* Please never respond to any call for sharing any personal details like Aadhar, PAN, Bank details, OTP or request for any payment.',
'* EPFO never calls members/ pensioners to deposit any amount.',
'* Please do not make any payment based on any such call.'
],
fontPt: 25, fontWt: 'bold', col: '#0f172a', align: 'left', side: 0.30, maxWidthPct: 1.00, lineGap: 0.06, gapAbove: 0.06, gapBelow: 0.10
},
dline:{ show:true, gap:0.03, thick:0.01, dash:0.01, space:0.03, col:'#111', side:0.3 },
labelYGap:0.15, lineGap:0.05, colGap:0.35,
labels:[
{ text:'स्थापना आईडी/नाम', pt:26, wt:600, col:'#111', dpi:300, pad:6 },
{ text:'स्थापना आईडी/नाम', pt:26, wt:600, col:'#111', dpi:300, pad:6 },
{ text:'जन्म तिथि', pt:26, wt:600, col:'#111', dpi:300, pad:6 },
{ text:'यूएएन', pt:26, wt:600, col:'#111', dpi:300, pad:6 },
],
rights:[
{ text:'Establishment ID/Name', pt:26, wt:600, col:'#111', dpi:300, pad:4 },
{ text:'Member ID/Name', pt:26, wt:600, col:'#111', dpi:300, pad:4 },
{ text:'Date of Birth', pt:26, wt:600, col:'#111', dpi:300, pad:4 },
{ text:'UAN', pt:26, wt:600, col:'#111', dpi:300, pad:4 },
],
values:[
{ text:'PUPUN3470835000 / SIGMA SOFTWARE SOLUTIONS PRIVATE LIMITED', pt:26, wt:600, col:'#111', dpi:300, pad:4 },
{ text:'PUPUN34708350000010016 / GHADLE RUSHIKESH RAJKUMAR', pt:26, wt:600, col:'#111', dpi:300, pad:4 },
{ text:'17-08-1999', pt:26, wt:600, col:'#111', dpi:300, pad:4 },
{ text:'102160691599', pt:26, wt:600, col:'#111', dpi:300, pad:4 },
],
particulars: {
topGap: 0.00,
sideLeft: 0.30,
sideRight: 0.30,
headerFill: '#FFFFFF',
border: 0.01,
headerFontPt: 25,
headerFontWt: 900,
bodyFontPt: 13,
rowMinH: 0.10,
cellPadX: 0.02,
cellPadY: 0.02,
lineAfterHeader: true,
usePngBody: false,
fitToWidth: true,
colWidths: [4.18, 0.73, 0.70, 0.62],
headers: [
'विवरण / Particulars',
'कर्मचारी शेष / Employee Balance',
'नियोक्ता शेष / Employer Balance',
'पेंशन शेष / Pension Balance'
],
rows: [
[
{ text: 'OB Int. Updated upto 01/04/2026', bold: true, fontSize: 8, color: '#111', align: 'left' },
{ text: '140,700', color: '#111', align: 'left', fontSize: 8 },
{ text: '57,600', color: '#111', align: 'left', fontSize: 8 },
{ text: '83,750', color: '#111', align: 'left', fontSize: 8 }
],
]
},
wagesTable: {
gapAbove: 0.00,
border: 0.01,
side: 0.30,
col: '#111',
autoColWidths: false,
fitToWidth: true,
minColW: 0.60,
colWeights: [0.09, 0.10, 0.05, 0.20, 0.12, 0.09, 0.11, 0.11, 0.11],
headFontPt: 26,
bodyFontPt: 26,
headerPadX: 0.02,
headerPadY: 0.02,
bodyPadX: 0.02,
bodyPadY: 0.02,
headerLineH: 1.05,
bodyLineH: 1.05,
bodyAlign: ['left','left','center','left','right','right','right','right','right'],
H: {
wage: 'सेवा माह / Wage Month',
trans: 'ट्रांजैक्शन / Transaction',
date: 'दिनांक / Date',
type: 'प्रकार / Type',
part: 'विवरण / Particulars',
wages: 'वेतन / Wages',
epf: 'ई पी एफ / EPF',
eps: 'ई पी एस / EPS',
contr: 'अंशदान / Contribution',
emp: 'कर्मचारी / Employee',
empr: 'नियोक्ता / Employer',
pens: 'पेंशन / Pension',
}
},
totalsRows: [
{
label: 'Total Contributions for the year [ 2026 ]',
spanFromCol: 0, spanToCol: 5,
values: ['14,700', '5,950', '8,750'], valueCols: [6,7,8],
fontPt: 8, bold: true, fill: '#FFFFFF', textColor: '#000000',
border: 0.012, padX: 0.02, padY: 0.02, alignLabel: 'right', alignValues: 'right'
},
{
label: 'Total Transfer-Ins/VDRsforthe year[ 2026 ]',
spanFromCol: 0, spanToCol: 5,
values: ['0', '0', '0'], valueCols: [6,7,8],
fontPt: 8, bold: true, fill: '#FFFFFF', textColor: '#000000',
border: 0.012, padX: 0.02, padY: 0.02, alignLabel: 'right', alignValues: 'right'
},
{
label: 'Total Withdrawals for the year [ 2026 ]',
spanFromCol: 0, spanToCol: 5,
values: ['0', '0', '0'], valueCols: [6,7,8],
fontPt: 8, bold: false, fill: '#FFFFFF', textColor: '#FF0000',
border: 0.012, padX: 0.02, padY: 0.02, alignLabel: 'right', alignValues: 'right'
},
{
label: 'Interest details. 31/03/2027',
spanFromCol: 0, spanToCol: 5,
values: ['0', '0', '0'], valueCols: [6,7,8],
fontPt: 8, bold: false, fill: '#FFFFFF', textColor: '#000000',
border: 0.012, padX: 0.02, padY: 0.02, alignLabel: 'left', alignValues: 'right'
},
{
label: 'Closing Balance as on 31/03/2027',
spanFromCol: 0, spanToCol: 5,
values: ['155,400', '63,550', '92,500'], valueCols: [6,7,8],
fontPt: 8, bold: false, fill: '#FFFFFF', textColor: '#000000',
border: 0.012, padX: 0.02, padY: 0.02, alignLabel: 'left', alignValues: 'right'
},
],
footer:{ font:10, col:'', leftFromId:true, left:'', mx:0.3, my:0.3 }
};
// ✅ REMOVED: FY_ROWS, TAX_DATA, MONTHLY_DATA arrays (no longer needed)
const FY_ROWS = [
['Mar-2026','15-04-2026','CR','Cont. For Due-Month 042026','125,200','15,000','2,100','550','1,250'],
['Apr-2026','15-05-2026','CR','Cont. For Due-Month 052026','133,333','15,000','2,100','550','1,250'],
['May-2026','14-06-2026','CR','Cont. For Due-Month 062026','133,333','15,000','2,100','550','1,250'],
['Jun-2026','14-07-2026','CR','Cont. For Due-Month 072026','133,333','15,000','2,100','550','1,250'],
['Jul-2026','13-08-2026','CR','Cont. For Due-Month 082026','133,333','15,000','2,100','550','1,250'],
['Aug-2026','10-09-2026','CR','Cont. For Due-Month 092026','133,333','15,000','2,100','550','1,250'],
['Sep-2026','13-10-2026','CR','Cont. For Due-Month 102026','133,333','15,000','2,100','550','1,250'],
// ['Oct-2025','11-11-2025','CR','Cont. For Due-Month 112025','10,000','','1,200','1,200','0'],
// ['Nov-2025','09-12-2025','CR','Cont. For Due-Month 122025','18,333','15,0000','1,800','550','1,250'],
// ['Dec-2025','14-01-2026','CR','Cont. For Due-Month 012026','18,333','15,0000','1,800','550','1,250'],
// ['Jan-2026','07-02-2026','CR','Cont. For Due-Month 022026','18,333','15,0000','1,800','550','1,250'],
// ['Feb-2026','13-03-2026','CR','Cont. For Due-Month 032026','18,333','15,0000','1,800','550','1,250'],
];
const FY_STYLE = {
fontPt: 7, lineH: 1.2, padX: 0.0385, padY: 0.0385, color: '#111', bg: null,
align: ['right','right','left','left','right','right','right','right','right'],
zebra: ['#ffffff', '#fafafa'],
perRow: {0: { bold: false, color: '#000' }},
perCol: {4: { bold: false }, 5: { bold: false }, 6: { bold: false }, 7: { bold: false }, 8: { bold: false } }
};
// ---------- HELPERS --------
const js = u => new Promise(r => { const s=document.createElement('script'); s.src=u; s.onload=r; s.onerror=()=>r(); document.head.appendChild(s); });
const hex = h => ((m=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(h||'#000')) ? [parseInt(m[1],16),parseInt(m[2],16),parseInt(m[3],16)] : [0,0,0]);
const dash = (pdf,a,p=0)=> pdf.setLineDash ? pdf.setLineDash(a,p) : (pdf.setLineDashPattern && pdf.setLineDashPattern(a,p));
const dataUrl = u => u ? fetch(u).then(r=>r.blob()).then(b=>new Promise(res=>{const f=new FileReader();f.onload=()=>res(f.result);f.readAsDataURL(b);})):Promise.resolve(null);
await js('https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js');
const { jsPDF } = window.jspdf || {};
if (!jsPDF) { console.error('jsPDF failed to load'); return; }
const link = document.createElement('link');
link.rel='stylesheet';
link.href='https://fonts.googleapis.com/css2?family=Noto+Sans+Devanagari:wght@400;600;700&display=swap';
document.head.appendChild(link);
const loadFont = pt => (document.fonts && document.fonts.load) ? document.fonts.load(`${pt}pt "Noto Sans Devanagari"`) : Promise.resolve();
await Promise.all([
loadFont(CFG.title.pt), loadFont(CFG.financialYear.pt),
loadFont(CFG.disclaimer.fontPt), loadFont(CFG.disclaimer_en.fontPt),
loadFont(CFG.separatorText.fontPt), loadFont(CFG.advisory.fontPt)
]).catch(()=>{});
const pngText = ({ text, pt, wt, col, dpi, pad }, wrapIn=null) => {
const PPI=dpi||300, c=document.createElement('canvas'), x=c.getContext('2d');
const weightNum = (String(wt).toLowerCase()==='bold') ? 700 : (Number(wt)||600);
const font=`${weightNum} ${pt}pt "Noto Sans Devanagari", sans-serif`;
x.font=font; x.textBaseline='top'; x.fillStyle=col||'#111';
const mt=x.measureText('Mg');
const baseLH=Math.ceil((mt.actualBoundingBoxAscent||0)+(mt.actualBoundingBoxDescent||0))||Math.ceil(pt*1.35*(PPI/72));
const makeLines = (s, maxPx) => {
const rawParts = String(s).split(/\n/);
const out=[];
for (const part of rawParts) {
if (!wrapIn) { out.push(part); continue; }
const words=String(part).split(/\s+/);
let cur='';
for(const w of words){
const t=cur?cur+' '+w:w;
if(x.measureText(t).width<=maxPx) cur=t;
else {
if(cur) out.push(cur);
if(x.measureText(w).width>maxPx){
let chunk=''; for(const ch of w){ const p=chunk+ch; if(x.measureText(p).width<=maxPx) chunk=p; else { out.push(chunk); chunk=ch; } }
cur=chunk;
} else cur=w;
}
}
if(cur) out.push(cur);
}
return out;
};
const lines = makeLines(String(text), wrapIn ? Math.max(12, Math.floor(wrapIn*PPI)) : null);
const widths=lines.map(t=>Math.ceil(x.measureText(t).width));
const padPx=(pad??2);
c.width=Math.max(...widths,1)+padPx*2; c.height=lines.length*baseLH+padPx*2;
const y=c.getContext('2d'); y.font=font; y.textBaseline='top'; y.fillStyle=col||'#111';
let yy=padPx; for(const ln of lines){ y.fillText(ln,padPx,yy); yy+=baseLH; }
return { url:c.toDataURL('image/png'), w:c.width/PPI, h:c.height/PPI };
};
const header64 = await dataUrl(CFG.img?.url);
const p=CFG.page, d=CFG.dline;
const L = CFG.labels.map(o=>pngText(o));
const R = CFG.rights.map(o=>pngText(o));
const leftW = L.reduce((m,a)=>Math.max(m,a.w),0);
const midW = R.reduce((m,a)=>Math.max(m,a.w),0);
const xLeft = d.side, xMid = xLeft + leftW + CFG.colGap;
const availRight = Math.max(0.25, p.w - d.side - (xMid + midW + CFG.colGap));
const V = CFG.values.map(o=>pngText(o, availRight));
const xVal = xMid + midW + CFG.colGap;
const titlePNG = (() => {
const { text, pt, wt, col, dpi, side, pad, align } = CFG.title;
const PPI=dpi||300, box=(CFG.page.w - side*2)*PPI;
const c=document.createElement('canvas'), x=c.getContext('2d'), f=`${wt} ${pt}pt "Noto Sans Devanagari", sans-serif`;
x.font=f; x.textBaseline='top'; x.fillStyle=col;
const m=x.measureText(text), th=Math.ceil((m.actualBoundingBoxAscent||0)+(m.actualBoundingBoxDescent||0))||Math.ceil(pt*1.35*(PPI/72)), tw=Math.ceil(m.width);
c.width=Math.ceil(box+(pad||12)*2); c.height=Math.ceil(th+(pad||12)*2);
let tx=(pad||12); if(align==='center') tx=Math.max((pad||12),(c.width - tw)/2); if(align==='right') tx=Math.max((pad||12),c.width - tw - (pad||12));
c.getContext('2d').font=f; c.getContext('2d').textBaseline='top'; c.getContext('2d').fillStyle=col; c.getContext('2d').fillText(text,tx,(pad||12));
return { url:c.toDataURL('image/png'), w:c.width/PPI, h:c.height/PPI };
})();
const financialYearPNG = (() => {
const { text, pt, wt, col, dpi, pad, align } = CFG.financialYear;
const PPI=dpi||300, side=d.side, box=(CFG.page.w - side*2)*PPI;
const c=document.createElement('canvas'), x=c.getContext('2d'), f=`${wt} ${pt}pt "Noto Sans Devanagari", sans-serif`;
x.font=f; x.textBaseline='top'; x.fillStyle=col;
const m=x.measureText(text), th=Math.ceil((m.actualBoundingBoxAscent||0)+(m.actualBoundingBoxDescent||0))||Math.ceil(pt*1.35*(PPI/72)), tw=Math.ceil(m.width);
c.width=Math.ceil(box+(pad||8)*2); c.height=Math.ceil(th+(pad||8)*2);
let tx=(pad||8); if(align==='center') tx=Math.max((pad||8),(c.width - tw)/2); if(align==='right') tx=Math.max((pad||8),c.width - tw - (pad||8));
c.getContext('2d').font=f; c.getContext('2d').textBaseline='top'; c.getContext('2d').fillStyle=col; c.getContext('2d').fillText(text,tx,(pad||8));
return { url:c.toDataURL('image/png'), w:c.width/PPI, h:c.height/PPI };
})();
const titleXY = () => {
const t=CFG.title, s=t.side;
if (t.mode==='absolute'){
const x = t.align==='left' ? t.x : t.align==='right' ? (p.w - s - titlePNG.w) : Math.max(s,(p.w - titlePNG.w)/2);
return { x, y:t.y };
}
const y = CFG.img?.y ? CFG.img.y + CFG.img.h + t.gap : t.y;
const x = t.align==='left' ? t.x : t.align==='right' ? (p.w - s - titlePNG.w) : Math.max(s,(p.w - titlePNG.w)/2);
return { x, y };
};
// ---------- Particulars table ----------
function drawParticulars(pdf, yStart) {
const cfg = CFG.particulars, pCfg=CFG.page, d=CFG.dline;
const x = (cfg.sideLeft ?? d.side);
const right = (cfg.sideRight ?? d.side);
const w = Math.max(0.5, pCfg.w - x - right);
let colW = cfg.colWidths.slice();
const sum = colW.reduce((a,b)=>a+b,0);
if (cfg.fitToWidth && Math.abs(sum - w) > 1e-6) {
const scale = w / sum;
colW = colW.map(v => v * scale);
}
const [br,bg,bb] = hex('#111');
const [fr,fg,fb] = hex(cfg.headerFill);
let y = yStart + cfg.topGap;
const headerH = Math.max(cfg.rowMinH, (cfg.headerFontPt/72)*1.7 + cfg.cellPadY*2);
pdf.setFillColor(fr, fg, fb);
pdf.setDrawColor(br, bg, bb);
pdf.setLineWidth(cfg.border);
pdf.rect(x, y, w, headerH, 'FD');
let bx = x;
for (let i = 0; i < 4; i++) {
const innerW = Math.max(0.05, colW[i] - 2*cfg.cellPadX);
const headerPng = pngText(
{ text: cfg.headers[i], pt: cfg.headerFontPt, wt: cfg.headerFontWt, col:'#111', dpi:300, pad:0 },
innerW
);
const px = bx + cfg.cellPadX;
const py = y + Math.max(0, (headerH - headerPng.h)/2);
pdf.addImage(headerPng.url, 'PNG', px, py, headerPng.w, headerPng.h);
bx += colW[i];
}
if (cfg.lineAfterHeader) pdf.line(x, y + headerH, x + w, y + headerH);
y += headerH;
const norm = (cell) => {
if (cell && typeof cell === 'object' && 'text' in cell) return {
text: String(cell.text ?? ''),
fontSize: Number(cell.fontSize || cfg.bodyFontPt),
bold: !!cell.bold,
color: cell.color || '#111',
align: cell.align || 'left',
bg: cell.bg || null,
padX: (typeof cell.padX==='number'?cell.padX:cfg.cellPadX),
padY: (typeof cell.padY==='number'?cell.padY:cfg.cellPadY),
};
return { text: String(cell ?? ''), fontSize: cfg.bodyFontPt, bold: false, color: '#111', align: 'left', bg: null, padX: cfg.cellPadX, padY: cfg.cellPadY };
};
for (let r = 0; r < cfg.rows.length; r++) {
const row = cfg.rows[r];
const cells = Array.from({length:4}, (_,c)=>norm(row[c]));
let rowH = cfg.rowMinH;
const wraps = [];
for (let c = 0; c < 4; c++) {
const fPt = cells[c].fontSize;
const lineH = (fPt/72)*1.6;
let lines;
if (c === 0) {
const cw = Math.max(0.05, colW[c] - 2*cells[c].padX);
lines = pdf.splitTextToSize(cells[c].text, cw);
} else {
lines = [cells[c].text];
}
wraps[c] = { lines, lineH, fontSize: fPt };
const h = (Array.isArray(lines) ? lines.length : 1) * lineH + 2*cells[c].padY;
rowH = Math.max(rowH, h);
}
let cx = x;
for (let c = 0; c < 4; c++) {
const cell = cells[c];
if (cell.bg) {
const [r1,g1,b1] = hex(cell.bg);
pdf.setFillColor(r1,g1,b1);
pdf.rect(cx, y, colW[c], rowH, 'F');
pdf.setDrawColor(br,bg,bb);
pdf.rect(cx, y, colW[c], rowH);
} else {
pdf.setDrawColor(br,bg,bb);
pdf.rect(cx, y, colW[c], rowH);
}
const wrap = wraps[c];
const [cr,cg,cb] = hex(cell.color);
pdf.setTextColor(cr,cg,cb);
pdf.setFont('helvetica', cell.bold ? 'bold' : 'normal');
pdf.setFontSize(cell.fontSize);
let tx = cx + cell.padX + 0.01;
if (cell.align === 'center') tx = cx + colW[c]/2;
if (cell.align === 'right') tx = cx + colW[c] - cell.padX - 0.01;
pdf.text(wrap.lines, tx, y + cell.padY + wrap.lineH*0.9, {
align: cell.align,
lineHeightFactor: 1.2
});
cx += colW[c];
}
y += rowH;
}
let vx = x;
for (let i = 0; i < colW.length - 1; i++) {
vx += colW[i];
pdf.line(vx, yStart + cfg.topGap, vx, y);
}
return y;
}
// ---------- Wage table ----------
function drawWageMonth(pdf, yAfter, rowStyle = null) {
const cfg = CFG.wagesTable;
const x = CFG.dline.side;
const w = CFG.page.w - 2 * CFG.dline.side;
const RS = Object.assign({
fontPt: cfg.bodyFontPt, lineH: cfg.bodyLineH,
padX: cfg.bodyPadX, padY: cfg.bodyPadY,
color: '#111', bg: null,
align: cfg.bodyAlign || Array(9).fill('left'),
zebra: ['#ffffff', '#ffffff'],
perRow: {}, perCol: {}
}, rowStyle || {});
const minColWArr = Array.isArray(cfg.minColW) ? cfg.minColW : Array(9).fill(cfg.minColW || 0);
let colW;
if (cfg.autoColWidths) {
const leafHeaders = [cfg.H.wage, cfg.H.date, cfg.H.type, cfg.H.part, cfg.H.epf, cfg.H.eps, cfg.H.emp, cfg.H.empr, cfg.H.pens];
const nat = leafHeaders.map((h, i) => {
const png = pngText({ text: h, pt: cfg.headFontPt, wt:700, col:'#111', dpi:300, pad:0 }, null);
return Math.max(minColWArr[i], png.w + 2*cfg.headerPadX);
});
const sumNat = nat.reduce((a,b)=>a+b,0);
const scale = cfg.fitToWidth && sumNat > 0 ? (w / sumNat) : Math.min(1, w / sumNat);
colW = nat.map(v => v * scale);
} else {
const sum = cfg.colWeights.reduce((a,b)=>a+b,0);
colW = cfg.colWeights.map(v => (v/sum) * w);
colW = colW.map((v,i)=>Math.max(v, minColWArr[i]));
const sum2 = colW.reduce((a,b)=>a+b,0);
if (cfg.fitToWidth && sum2 !== w) {
const scale = w / sum2;
colW = colW.map(v => v*scale);
}
}
const [r,g,b] = hex(cfg.col);
pdf.setDrawColor(r,g,b);
pdf.setLineWidth(cfg.border);
let y = yAfter + (cfg.gapAbove || 0);
const transW = colW[1] + colW[2];
const wagesW = colW[4] + colW[5];
const contrW = colW[6] + colW[7] + colW[8];
const transPNG = pngText({ text: cfg.H.trans, pt: cfg.headFontPt, wt:700, col:'#111', dpi:300, pad:0 }, Math.max(0.05, transW - 2*cfg.headerPadX));
const wagesPNG = pngText({ text: cfg.H.wages, pt: cfg.headFontPt, wt:700, col:'#111', dpi:300, pad:0 }, Math.max(0.05, wagesW - 2*cfg.headerPadX));
const contrPNG = pngText({ text: cfg.H.contr, pt: cfg.headFontPt, wt:700, col:'#111', dpi:300, pad:0 }, Math.max(0.05, contrW - 2*cfg.headerPadX));
const r2PNGs = [
pngText({ text: cfg.H.date, pt: cfg.headFontPt-1, wt:700, col:'#111', dpi:300, pad:0 }, Math.max(0.05, colW[1]-2*cfg.headerPadX)),
pngText({ text: cfg.H.type, pt: cfg.headFontPt-1, wt:700, col:'#111', dpi:300, pad:0 }, Math.max(0.05, colW[2]-2*cfg.headerPadX)),
pngText({ text: cfg.H.epf, pt: cfg.headFontPt-1, wt:700, col:'#111', dpi:300, pad:0 }, Math.max(0.05, colW[4]-2*cfg.headerPadX)),
pngText({ text: cfg.H.eps, pt: cfg.headFontPt-1, wt:700, col:'#111', dpi:300, pad:0 }, Math.max(0.05, colW[5]-2*cfg.headerPadX)),
pngText({ text: cfg.H.emp, pt: cfg.headFontPt-1, wt:700, col:'#111', dpi:300, pad:0 }, Math.max(0.05, colW[6]-2*cfg.headerPadX)),
pngText({ text: cfg.H.empr, pt: cfg.headFontPt-1, wt:700, col:'#111', dpi:300, pad:0 }, Math.max(0.05, colW[7]-2*cfg.headerPadX)),
pngText({ text: cfg.H.pens, pt: cfg.headFontPt-1, wt:700, col:'#111', dpi:300, pad:0 }, Math.max(0.05, colW[8]-2*cfg.headerPadX)),
];
const H1 = Math.max(transPNG.h, wagesPNG.h, contrPNG.h, (cfg.headFontPt/72)*cfg.headerLineH) + 2*cfg.headerPadY;
const H2 = Math.max(...r2PNGs.map(p => p.h), ((cfg.headFontPt-1)/72)*cfg.headerLineH) + 2*cfg.headerPadY;
const wagePNG = pngText({ text: cfg.H.wage, pt: cfg.headFontPt, wt:700, col:'#111', dpi:300, pad:0 }, Math.max(0.05, colW[0]-2*cfg.headerPadX));
const partPNG = pngText({ text: cfg.H.part, pt: cfg.headFontPt, wt:700, col:'#111', dpi:300, pad:0 }, Math.max(0.05, colW[3]-2*cfg.headerPadX));
let cx = x;
pdf.rect(cx, y, colW[0], H1 + H2);
pdf.addImage(wagePNG.url, 'PNG', cx + Math.max((colW[0]-wagePNG.w)/2, cfg.headerPadX), y + (H1+H2 - wagePNG.h)/2, wagePNG.w, wagePNG.h);
cx += colW[0];
pdf.rect(cx, y, transW, H1);
pdf.addImage(transPNG.url, 'PNG', cx + Math.max((transW - transPNG.w)/2, cfg.headerPadX), y + (H1 - transPNG.h)/2, transPNG.w, transPNG.h);
const transX = cx; cx += transW;
pdf.rect(cx, y, colW[3], H1 + H2);
pdf.addImage(partPNG.url, 'PNG', cx + Math.max((colW[3]-partPNG.w)/2, cfg.headerPadX), y + (H1+H2 - partPNG.h)/2, partPNG.w, partPNG.h);
cx += colW[3];
pdf.rect(cx, y, wagesW, H1);
pdf.addImage(wagesPNG.url, 'PNG', cx + Math.max((wagesW - wagesPNG.w)/2, cfg.headerPadX), y + (H1 - wagesPNG.h)/2, wagesPNG.w, wagesPNG.h);
const wagesX = cx; cx += wagesW;
pdf.rect(cx, y, contrW, H1);
pdf.addImage(contrPNG.url, 'PNG', cx + Math.max((contrW - contrPNG.w)/2, cfg.headerPadX), y + (H1 - contrPNG.h)/2, contrPNG.w, contrPNG.h);
const y2 = y + H1;
let cx2 = transX;
pdf.rect(cx2, y2, colW[1], H2);
pdf.addImage(r2PNGs[0].url, 'PNG', cx2 + Math.max((colW[1]-r2PNGs[0].w)/2, cfg.headerPadX), y2 + (H2 - r2PNGs[0].h)/2, r2PNGs[0].w, r2PNGs[0].h);
cx2 += colW[1];
pdf.rect(cx2, y2, colW[2], H2);
pdf.addImage(r2PNGs[1].url, 'PNG', cx2 + Math.max((colW[2]-r2PNGs[1].w)/2, cfg.headerPadX), y2 + (H2 - r2PNGs[1].h)/2, r2PNGs[1].w, r2PNGs[1].h);
let wx = wagesX;
pdf.rect(wx, y2, colW[4], H2);
pdf.addImage(r2PNGs[2].url, 'PNG', wx + Math.max((colW[4]-r2PNGs[2].w)/2, cfg.headerPadX), y2 + (H2 - r2PNGs[2].h)/2, r2PNGs[2].w, r2PNGs[2].h);
wx += colW[4];
pdf.rect(wx, y2, colW[5], H2);
pdf.addImage(r2PNGs[3].url, 'PNG', wx + Math.max((colW[5]-r2PNGs[3].w)/2, cfg.headerPadX), y2 + (H2 - r2PNGs[3].h)/2, r2PNGs[3].w, r2PNGs[3].h);
let cx3 = wagesX + wagesW;
pdf.rect(cx3, y2, colW[6], H2);
pdf.addImage(r2PNGs[4].url, 'PNG', cx3 + Math.max((colW[6]-r2PNGs[4].w)/2, cfg.headerPadX), y2 + (H2 - r2PNGs[4].h)/2, r2PNGs[4].w, r2PNGs[4].h);
cx3 += colW[6];
pdf.rect(cx3, y2, colW[7], H2);
pdf.addImage(r2PNGs[5].url, 'PNG', cx3 + Math.max((colW[7]-r2PNGs[5].w)/2, cfg.headerPadX), y2 + (H2 - r2PNGs[5].h)/2, r2PNGs[5].w, r2PNGs[5].h);
cx3 += colW[7];
pdf.rect(cx3, y2, colW[8], H2);
pdf.addImage(r2PNGs[6].url, 'PNG', cx3 + Math.max((colW[8]-r2PNGs[6].w)/2, cfg.headerPadX), y2 + (H2 - r2PNGs[6].h)/2, r2PNGs[6].w, r2PNGs[6].h);
const startBodyY = y + H1 + H2;
pdf.setFont('helvetica','normal');
pdf.setFontSize(RS.fontPt);
const rowHeights = [];
const lineH = (RS.fontPt/72) * RS.lineH;
for (let rI=0; rI<FY_ROWS.length; rI++){
const heights = [];
for (let cI=0;cI<9;cI++){
const innerW = Math.max(0.02, colW[cI] - 2*RS.padX - 0.02);
const txt = String(FY_ROWS[rI][cI] ?? '');
const lines = pdf.splitTextToSize(txt, innerW);
heights.push((Array.isArray(lines)? lines.length : 1) * lineH + 2*RS.padY);
}
rowHeights[rI] = Math.max(...heights);
}
let yCursor = startBodyY;
for (let rI=0; rI<FY_ROWS.length; rI++){
const rowH = rowHeights[rI];
const rowBg = RS.zebra ? RS.zebra[rI % RS.zebra.length] : null;
let bx = x;
for (let cI=0; cI<9; cI++){
const bgCol = rowBg || RS.bg || null;
if (bgCol) {
const [br,bg,bm] = hex(bgCol);
pdf.setFillColor(br,bg,bm);
pdf.rect(bx, yCursor, colW[cI], rowH, 'FD');
} else {
pdf.rect(bx, yCursor, colW[cI], rowH);
}
const base = { color: RS.color, bold: false };
const colOv = RS.perCol && RS.perCol[cI] ? RS.perCol[cI] : null;
const rowOv = RS.perRow && RS.perRow[rI] ? RS.perRow[rI] : null;
const sty = Object.assign({}, base, colOv || {}, rowOv || {});
const txt = String(FY_ROWS[rI][cI] ?? '');
const innerW = Math.max(0.02, colW[cI] - 2*RS.padX - 0.02);
const lines = pdf.splitTextToSize(txt, innerW);
const a = (RS.align && RS.align[cI]) || 'left';
let tx = bx + RS.padX;
if (a==='center') tx = bx + colW[cI]/2;
if (a==='right') tx = bx + colW[cI] - RS.padX - 0.01;
const [cr,cg,cb] = hex(sty.color || RS.color);
pdf.setTextColor(cr,cg,cb);
pdf.setFont('helvetica', sty.bold ? 'bold' : 'normal');
pdf.setFontSize(RS.fontPt);
pdf.text(lines, tx, yCursor + RS.padY + lineH*0.9, { align:a, maxWidth: innerW, lineHeightFactor: 1.0 });
bx += colW[cI];
}
yCursor += rowH;
}
const totals = Array.isArray(CFG.totalsRows) ? CFG.totalsRows
: CFG.totalsRow ? [CFG.totalsRow] : [];
for (const T of totals) {
const fill = T.fill ? hex(T.fill) : null;
const borderW = T.border != null ? T.border : cfg.border;
const fontPt = T.fontPt || 10;
const lineHtot = (fontPt/72) * 1.6;
const rowH = Math.max(lineHtot + 2*(T.padY ?? 0.04), 0.18);
const labelAlign = T.alignLabel || 'right';
const valueAlign = T.alignValues || 'right';
const valueCols = Array.isArray(T.valueCols) && T.valueCols.length ? T.valueCols : [6,7,8];
const [txR,txG,txB] = hex(T.textColor || '#111');
pdf.setLineWidth(borderW);
const spanStart = Math.max(0, T.spanFromCol|0);
const spanEnd = Math.min(8, T.spanToCol|0);
let xSpan = x; for (let i=0;i<spanStart;i++) xSpan += colW[i];
const spanW = colW.slice(spanStart, spanEnd+1).reduce((a,b)=>a+b,0);
if (fill) { const [fr,fg,fb] = fill; pdf.setFillColor(fr,fg,fb); pdf.rect(xSpan, yCursor, spanW, rowH, 'FD'); }
else pdf.rect(xSpan, yCursor, spanW, rowH);
pdf.setFont('helvetica', T.bold ? 'bold' : 'normal');
pdf.setFontSize(fontPt);
pdf.setTextColor(txR,txG,txB);
let labelX = xSpan + (T.padX ?? 0.04);
if (labelAlign==='center') labelX = xSpan + spanW/2;
if (labelAlign==='right') labelX = xSpan + spanW - (T.padX ?? 0.04);
pdf.text(String(T.label||''), labelX, yCursor + (T.padY ?? 0.04) + fontPt/72, { align: labelAlign });
for (let i=0;i<valueCols.length;i++){
const cI = valueCols[i];
let xCell = x; for (let k=0;k<cI;k++) xCell += colW[k];
if (fill) { const [fr,fg,fb] = fill; pdf.setFillColor(fr,fg,fb); pdf.rect(xCell, yCursor, colW[cI], rowH, 'FD'); }
else pdf.rect(xCell, yCursor, colW[cI], rowH);
const val = String((T.values && T.values[i]) || '');
let tx = xCell + (T.padX ?? 0.04);
if (valueAlign==='center') tx = xCell + colW[cI]/2;
if (valueAlign==='right') tx = xCell + colW[cI] - (T.padX ?? 0.04);
pdf.text(val, tx, yCursor + (T.padY ?? 0.04) + fontPt/72, { align: valueAlign });
}
yCursor += rowH;
}
return yCursor;
}
// ✅ REMOVED: drawCombined() function (no longer needed)
// ---------- MAKE PDF ----------
function makePDF(){
const pdf = new jsPDF({ orientation:'p', unit:'in', format:[CFG.page.w,CFG.page.h] });
const [dr,dg,db]=hex(CFG.dline.col), [fr,fg,fb]=hex(CFG.footer.col);
const formatPrinted = () => {
const fmt = new Intl.DateTimeFormat('en-GB', {
timeZone: 'Asia/Kolkata', year: 'numeric', month: '2-digit', day: '2-digit',
hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false
});
const s = fmt.format(new Date());
const [dmy, hms] = s.split(', ');
return dmy.replaceAll('/', '-') + ' ' + (hms || '');
};
// ✅ CHANGED: Loop only for 1 page (i < CFG.pages where pages = 1)
for(let i=0;i<CFG.pages;i++){
if(i) pdf.addPage([CFG.page.w,CFG.page.h],'p');
if (header64) pdf.addImage(header64,'PNG',CFG.img.x,CFG.img.y,CFG.img.w,CFG.img.h);
const t=titleXY(); pdf.addImage(titlePNG.url,'PNG',t.x,t.y,titlePNG.w,titlePNG.h);
let y = t.y + titlePNG.h + CFG.dline.gap;
if (CFG.dline.show){ pdf.setLineWidth(CFG.dline.thick); pdf.setDrawColor(dr,dg,db); dash(pdf,[CFG.dline.dash,CFG.dline.space],0); pdf.line(CFG.dline.side, y, CFG.page.w-CFG.dline.side, y); dash(pdf,[]); y += CFG.labelYGap; }
const rows=Math.max(CFG.labels.length, CFG.rights.length, CFG.values.length);
const xLeft = CFG.dline.side;
const xMid = xLeft + L.reduce((m,a)=>Math.max(m,a.w),0) + CFG.colGap;
const xVal = xMid + R.reduce((m,a)=>Math.max(m,a.w),0) + CFG.colGap;
for (let r=0;r<rows;r++){
const a=L[r], b=R[r], c=V[r];
if (a) pdf.addImage(a.url,'PNG',xLeft,y,a.w,a.h);
if (b) pdf.addImage(b.url,'PNG',xMid ,y,b.w,b.h);
if (c) pdf.addImage(c.url,'PNG',xVal ,y,c.w,c.h);
y += Math.max(a?.h||0, b?.h||0, c?.h||0) + CFG.lineGap;
}
// ✅ CHANGED: Only render page 1 content (removed 'if (i === 0)' guard)
y += CFG.financialYear.gap;
const fyX = Math.max(CFG.dline.side, (CFG.page.w - financialYearPNG.w) / 2);
pdf.addImage(financialYearPNG.url, 'PNG', fyX, y, financialYearPNG.w, financialYearPNG.h);
y += financialYearPNG.h;
y = drawParticulars(pdf, y);
y = drawWageMonth(pdf, y, FY_STYLE);
y += CFG.endStatement.gapAbove;
const printedStr = CFG.printedOn.prefix + formatPrinted();
const prPNG = pngText({ text: printedStr, pt: CFG.printedOn.fontPt, wt: CFG.printedOn.fontWt, col: CFG.printedOn.col, dpi:300, pad:0 });
const pageRight = CFG.page.w - CFG.dline.side;
const prX = pageRight - prPNG.w;
const pageLeft = CFG.dline.side;
const gapRight = CFG.endStatement.gapRight ?? 0.30;
const eosMaxW = Math.max(0.1, prX - gapRight - pageLeft);
const eosPNG = pngText({ text: CFG.endStatement.text, pt: CFG.endStatement.fontPt, wt: CFG.endStatement.fontWt, col: CFG.endStatement.col, dpi:300, pad:0 }, eosMaxW);
pdf.addImage(eosPNG.url, 'PNG', pageLeft, y, eosPNG.w, eosPNG.h);
pdf.addImage(prPNG.url , 'PNG', prX, y, prPNG.w , prPNG.h);
y += Math.max(eosPNG.h, prPNG.h);
y += CFG.disclaimer.gapAbove;
const sideDisc = (CFG.disclaimer.side ?? CFG.dline.side);
const usableW = (CFG.page.w - 2*sideDisc) * (CFG.disclaimer.maxWidthPct ?? 1);
const discPNG = pngText({ text: CFG.disclaimer.text, pt: CFG.disclaimer.fontPt, wt: CFG.disclaimer.fontWt, col: CFG.disclaimer.col, dpi:300, pad:0 }, usableW);
let discX = sideDisc;
if ((CFG.disclaimer.align||'left') === 'center') discX = Math.max(sideDisc, (CFG.page.w - discPNG.w)/2);
if ((CFG.disclaimer.align||'left') === 'right') discX = CFG.page.w - sideDisc - discPNG.w;
pdf.addImage(discPNG.url, 'PNG', discX, y, discPNG.w, discPNG.h);
y += discPNG.h;
y += CFG.disclaimer_en.gapAbove;
const sideEn = (CFG.disclaimer_en.side ?? CFG.dline.side);
const usableWEn = (CFG.page.w - 2*sideEn) * (CFG.disclaimer_en.maxWidthPct ?? 1);
const discEnPNG = pngText({ text: CFG.disclaimer_en.text, pt: CFG.disclaimer_en.fontPt, wt: CFG.disclaimer_en.fontWt, col: CFG.disclaimer_en.col, dpi:300, pad:0 }, usableWEn);
let discEnX = sideEn;
if ((CFG.disclaimer_en.align||'left') === 'center') discEnX = Math.max(sideEn, (CFG.page.w - discEnPNG.w)/2);
if ((CFG.disclaimer_en.align||'left') === 'right') discEnX = CFG.page.w - sideEn - discEnPNG.w;
pdf.addImage(discEnPNG.url, 'PNG', discEnX, y, discEnPNG.w, discEnPNG.h);
y += discEnPNG.h;
y += CFG.separatorText.gapAbove;
const sideSep = CFG.separatorText.side ?? CFG.dline.side;
const usableWSep = (CFG.page.w - 2*sideSep) * (CFG.separatorText.maxWidthPct ?? 1);
const sepPNG = pngText({ text: CFG.separatorText.text, pt: CFG.separatorText.fontPt, wt: CFG.separatorText.fontWt, col: CFG.separatorText.col, dpi:300, pad:0 }, usableWSep);
let sepX = sideSep;
if ((CFG.separatorText.align||'left') === 'center') sepX = Math.max(sideSep, (CFG.page.w - sepPNG.w)/2);
if ((CFG.separatorText.align||'left') === 'right') sepX = CFG.page.w - sideSep - sepPNG.w;
pdf.addImage(sepPNG.url, 'PNG', sepX, y, sepPNG.w, sepPNG.h);
y += sepPNG.h + (CFG.separatorText.gapBelow || 0);
y += (CFG.advisory.gapAbove || 0);
const sideAdv = CFG.advisory.side ?? CFG.dline.side;
const usableWAdv = (CFG.page.w - 2*sideAdv) * (CFG.advisory.maxWidthPct ?? 1);
for (let i=0;i<CFG.advisory.lines.length;i++){
const ln = CFG.advisory.lines[i];
const lnPNG = pngText({ text: ln, pt: CFG.advisory.fontPt, wt: CFG.advisory.fontWt, col: CFG.advisory.col, dpi:300, pad:0 }, usableWAdv);
let lnX = sideAdv;
if ((CFG.advisory.align||'left') === 'center') lnX = Math.max(sideAdv, (CFG.page.w - lnPNG.w)/2);
if ((CFG.advisory.align||'left') === 'right') lnX = CFG.page.w - sideAdv - lnPNG.w;
pdf.addImage(lnPNG.url, 'PNG', lnX, y, lnPNG.w, lnPNG.h);
y += lnPNG.h + (CFG.advisory.lineGap || 0.06);
}
y += (CFG.advisory.gapBelow || 0);
y += CFG.separatorText.gapAbove;
const sep2PNG = pngText({ text: CFG.separatorText.text, pt: CFG.separatorText.fontPt, wt: CFG.separatorText.fontWt, col: CFG.separatorText.col, dpi:300, pad:0 }, usableWSep);
pdf.addImage(sep2PNG.url, 'PNG', sepX, y, sep2PNG.w, sep2PNG.h);
y += sep2PNG.h + (CFG.separatorText.gapBelow || 0);
// ✅ REMOVED: 'if (i===1) { y = drawCombined(pdf, y); }' - no second page needed
const lf = CFG.footer.leftFromId ? CFG.id : (CFG.footer.left||'');
const rt = `Page ${i+1} of ${CFG.pages}`;
pdf.setTextColor(fr,fg,fb); pdf.setFontSize(CFG.footer.font);
pdf.text(lf, CFG.footer.mx, CFG.page.h - CFG.footer.my);
pdf.text(rt, CFG.page.w - pdf.getTextWidth(rt) - CFG.footer.mx, CFG.page.h - CFG.footer.my);
}
pdf.save(`${CFG.id}_2026.pdf`);
}
(function hookSiteButtonOnly() {
const hook = () => {
const btn = document.getElementById('downloadPassbook-2026');
if (btn && !btn.__epf_hooked) {
btn.__epf_hooked = true;
btn.addEventListener('click', e => (e.preventDefault(), makePDF()));
}
};
const observer = new MutationObserver(hook);
observer.observe(document.documentElement, { childList:true, subtree:true });
hook();
})();
})();2 views