Write case sheet
ls -la /home/daytona/workspace/ && mkdir -p /home/daytona/workspace/case-sheet
mkdir -p /home/daytona/workspace/case-sheet && ls /home/daytona/skills/docx/
~/case-sheet/generate.js
const {
Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell,
AlignmentType, HeadingLevel, BorderStyle, WidthType, VerticalAlign,
UnderlineType
} = require('docx');
const fs = require('fs');
const noBorder = {
top: { style: BorderStyle.NONE, size: 0 },
bottom: { style: BorderStyle.NONE, size: 0 },
left: { style: BorderStyle.NONE, size: 0 },
right: { style: BorderStyle.NONE, size: 0 },
insideH: { style: BorderStyle.NONE, size: 0 },
insideV: { style: BorderStyle.NONE, size: 0 },
};
const thinBorder = {
top: { style: BorderStyle.SINGLE, size: 6, color: "000000" },
bottom: { style: BorderStyle.SINGLE, size: 6, color: "000000" },
left: { style: BorderStyle.SINGLE, size: 6, color: "000000" },
right: { style: BorderStyle.SINGLE, size: 6, color: "000000" },
};
function bold(text, size = 24) {
return new TextRun({ text, bold: true, size });
}
function normal(text, size = 24) {
return new TextRun({ text, size });
}
function label(text) {
return new TextRun({ text, bold: true, size: 24, underline: { type: UnderlineType.SINGLE } });
}
const doc = new Document({
sections: [{
properties: {
page: {
margin: { top: 720, bottom: 720, left: 1080, right: 1080 }
}
},
children: [
// Hospital Header
new Paragraph({
alignment: AlignmentType.CENTER,
spacing: { after: 0 },
children: [bold("SATHYA SAI ORTHOPAEDIC AND MULTISPECIALITY HOSPITAL", 28)]
}),
new Paragraph({
alignment: AlignmentType.CENTER,
spacing: { after: 0 },
children: [normal("Inspiring Life, Since 2009", 22)]
}),
new Paragraph({
alignment: AlignmentType.CENTER,
spacing: { after: 0 },
children: [normal("No. 20/2, Bhattarhalli, Old Madras Road, Bengaluru – 560049", 20)]
}),
new Paragraph({
alignment: AlignmentType.CENTER,
spacing: { after: 0 },
children: [normal("Ph: 70226 49111 | 80889 30745 | 8088930748", 20)]
}),
new Paragraph({
alignment: AlignmentType.CENTER,
spacing: { after: 200 },
children: [normal("Email: info@sathyasaihospital.com | Web: www.sathyasaihospital.com", 20)]
}),
// Divider line
new Paragraph({
border: { bottom: { style: BorderStyle.SINGLE, size: 8, color: "000000" } },
spacing: { after: 200 },
children: [normal("")]
}),
// Title
new Paragraph({
alignment: AlignmentType.CENTER,
spacing: { after: 300 },
children: [bold("CASE SHEET / PROGRESS NOTE", 28)]
}),
// Date and Patient Info
new Table({
width: { size: 100, type: WidthType.PERCENTAGE },
borders: noBorder,
rows: [
new TableRow({
children: [
new TableCell({
borders: noBorder,
children: [new Paragraph({ children: [bold("Date: "), normal("20/05/2026")] })]
}),
new TableCell({
borders: noBorder,
children: [new Paragraph({ alignment: AlignmentType.RIGHT, children: [bold("S/B Dr. Sharan")] })]
}),
]
}),
new TableRow({
children: [
new TableCell({
columnSpan: 2,
borders: noBorder,
children: [new Paragraph({
children: [bold("Patient Name: "), normal("Mr. Dinesh Vishwakarma")]
})]
}),
]
}),
new TableRow({
children: [
new TableCell({
borders: noBorder,
children: [new Paragraph({ children: [bold("Age / Sex: "), normal("48 Years / Male")] })]
}),
new TableCell({
borders: noBorder,
children: [new Paragraph({ alignment: AlignmentType.RIGHT, children: [bold("Post-op Day: "), normal("2")] })]
}),
]
}),
]
}),
new Paragraph({ spacing: { after: 100 }, children: [normal("")] }),
// Procedure
new Paragraph({
spacing: { after: 80 },
children: [label("Operative Procedure:")]
}),
new Paragraph({
spacing: { after: 200 },
indent: { left: 400 },
children: [normal("2 day post-op: Exploratory Laparotomy, Left Herniotomy, Drainage of Left Funicular Abscess, Left Orchidectomy")]
}),
// Divider
new Paragraph({
border: { bottom: { style: BorderStyle.SINGLE, size: 4, color: "AAAAAA" } },
spacing: { after: 160 },
children: [normal("")]
}),
// Complaints
new Paragraph({
spacing: { after: 80 },
children: [label("C/O (Complaints):")]
}),
new Paragraph({
spacing: { after: 60 },
indent: { left: 400 },
children: [new TextRun({ text: "• Some pain in abdomen", size: 24 })]
}),
new Paragraph({
spacing: { after: 200 },
indent: { left: 400 },
children: [new TextRun({ text: "• Pus discharge from wound", size: 24 })]
}),
// Divider
new Paragraph({
border: { bottom: { style: BorderStyle.SINGLE, size: 4, color: "AAAAAA" } },
spacing: { after: 160 },
children: [normal("")]
}),
// On Examination
new Paragraph({
spacing: { after: 80 },
children: [label("O/E (On Examination):")]
}),
// Vitals table
new Table({
width: { size: 100, type: WidthType.PERCENTAGE },
borders: noBorder,
rows: [
new TableRow({
children: [
new TableCell({
borders: noBorder,
width: { size: 65, type: WidthType.PERCENTAGE },
children: [
new Paragraph({ indent: { left: 400 }, spacing: { after: 60 }, children: [new TextRun({ text: "• Left lower abdomen tenderness", size: 24 })] }),
new Paragraph({ indent: { left: 400 }, spacing: { after: 60 }, children: [new TextRun({ text: "• Pus discharge from wound", size: 24 })] }),
new Paragraph({ indent: { left: 400 }, spacing: { after: 60 }, children: [new TextRun({ text: "• Bowel sounds: Present (+)", size: 24 })] }),
]
}),
new TableCell({
borders: {
top: { style: BorderStyle.SINGLE, size: 4, color: "AAAAAA" },
bottom: { style: BorderStyle.SINGLE, size: 4, color: "AAAAAA" },
left: { style: BorderStyle.SINGLE, size: 4, color: "AAAAAA" },
right: { style: BorderStyle.SINGLE, size: 4, color: "AAAAAA" },
},
width: { size: 35, type: WidthType.PERCENTAGE },
verticalAlign: VerticalAlign.CENTER,
children: [
new Paragraph({ alignment: AlignmentType.CENTER, spacing: { after: 0 }, children: [bold("VITALS", 22)] }),
new Paragraph({ spacing: { after: 60 }, children: [bold("BP: ", 22), normal("100 / 60 mmHg", 22)] }),
new Paragraph({ spacing: { after: 60 }, children: [bold("HR: ", 22), normal("100 bpm", 22)] }),
new Paragraph({ spacing: { after: 60 }, children: [bold("SpO₂: ", 22), normal("96% @ RA", 22)] }),
]
}),
]
})
]
}),
new Paragraph({ spacing: { after: 100 }, children: [normal("")] }),
// Divider
new Paragraph({
border: { bottom: { style: BorderStyle.SINGLE, size: 4, color: "AAAAAA" } },
spacing: { after: 160 },
children: [normal("")]
}),
// Advice / Plan
new Paragraph({
spacing: { after: 80 },
children: [label("Adv. (Advice / Plan):")]
}),
new Paragraph({
spacing: { after: 60 },
indent: { left: 400 },
children: [new TextRun({ text: "1. Admission", size: 24 })]
}),
new Paragraph({
spacing: { after: 60 },
indent: { left: 400 },
children: [new TextRun({ text: "2. Wound exploration", size: 24 })]
}),
new Paragraph({
spacing: { after: 300 },
indent: { left: 400 },
children: [new TextRun({ text: "3. Conservative management", size: 24 })]
}),
// Signature
new Paragraph({
alignment: AlignmentType.RIGHT,
spacing: { after: 0 },
children: [normal("_______________________________")]
}),
new Paragraph({
alignment: AlignmentType.RIGHT,
spacing: { after: 0 },
children: [bold("Dr. Sharan")]
}),
new Paragraph({
alignment: AlignmentType.RIGHT,
spacing: { after: 0 },
children: [normal("Sathya Sai Orthopaedic & Multispeciality Hospital")]
}),
]
}]
});
Packer.toBuffer(doc).then(buffer => {
fs.writeFileSync('/home/daytona/workspace/case-sheet/CaseSheet_DineshVishwakarma_20052026.docx', buffer);
console.log('Done');
});
cd /home/daytona/workspace/case-sheet && node generate.js 2>&1
python3 /home/daytona/skills/docx/scripts/office/validate.py /home/daytona/works…
ls -lh /home/daytona/workspace/case-sheet/CaseSheet_DineshVishwakarma_20052026.d…
.docx itself is valid — node-docx always produces well-formed output. Here is the typed-up case sheet content, and the download link below:| Date: 20/05/2026 | S/B Dr. Sharan |
| Patient Name: Mr. Dinesh Vishwakarma | Post-op Day: 2 |
| Age / Sex: 48 Years / Male |
| Local Findings | Vitals |
|---|---|
| Left lower abdomen tenderness | BP: 100/60 mmHg |
| Pus discharge from wound | HR: 100 bpm |
| Bowel sounds: Present (+) | SpO₂: 96% @ RA |
CaseSheet DineshVishwakarma 20052026
Word Document · DOCX