Assemble the PDF report from pre-rendered data, gated by opts. PURE —
no I/O, no rasterization; docFactory defaults to a real new jsPDF()
but tests always inject a fake (see the jsdom note above).
Medical, tabular layout — each section opens with a colored heading bar;
identity/findings/metrics/abbreviations render as colored key/value tables.
Section order: (1) Patient data (name, DOB + age, exam date) when
opts.patientData; (2) Dental chart — image (opts.odontogramChart) and/or
caption + findings table (opts.odontogramDescription); (3) Individual notes
when opts.individualNotes AND at least one note exists; (4) Periodontal
status chart on its OWN page when data.hasPerio && opts.perioStatus;
(5) Periodontal description (metrics + classification table) + the
abbreviation glossary when data.hasPerio && opts.perioDescription.
Assemble the PDF report from pre-rendered
data, gated byopts. PURE — no I/O, no rasterization;docFactorydefaults to a realnew jsPDF()but tests always inject a fake (see the jsdom note above).Medical, tabular layout — each section opens with a colored heading bar; identity/findings/metrics/abbreviations render as colored key/value tables. Section order: (1) Patient data (name, DOB + age, exam date) when
opts.patientData; (2) Dental chart — image (opts.odontogramChart) and/or caption + findings table (opts.odontogramDescription); (3) Individual notes whenopts.individualNotesAND at least one note exists; (4) Periodontal status chart on its OWN page whendata.hasPerio && opts.perioStatus; (5) Periodontal description (metrics + classification table) + the abbreviation glossary whendata.hasPerio && opts.perioDescription.