Generate Word Document
Business letters as .docx with Apache POI XWPF: paper size and orientation, header with company details,
footer with real PAGE / NUMPAGES fields, a styled line-item table and an optional Word watermark - all taken from
a page setup preset.
Word vs. PDF
| Word (.docx) | The receiver can still edit it. Page numbers are fields - Word calculates them when it lays out the pages. |
| Fixed layout, prints the same everywhere, can be signed (365). Page numbers are drawn by our code. | |
| Units | Word measures pages in twips: 1 inch = 1440 twips, so A4 = 11906 x 16838. |
How it works
XWPFDocument doc = new XWPFDocument();
CTSectPr sect = doc.getDocument().getBody().addNewSectPr();
CTPageSz size = sect.addNewPgSz(); // 370 paper size, 369 orientation
size.setW(BigInteger.valueOf(16838)); size.setH(BigInteger.valueOf(11906));
size.setOrient(STPageOrientation.LANDSCAPE);
XWPFFooter footer = doc.createFooter(HeaderFooterType.DEFAULT);
XWPFParagraph p = footer.createParagraph();
p.createRun().setText("Page ");
p.getCTP().addNewFldSimple().setInstr("PAGE"); // 367 page number field
p.createRun().setText(" of ");
p.getCTP().addNewFldSimple().setInstr("NUMPAGES");
new XWPFHeaderFooterPolicy(doc).createWatermark("DRAFT"); // 366 in Word
XWPFTable t = doc.createTable(1, 5);
t.getRow(0).setRepeatHeader(true); // header row on every page
t.getRow(0).getCell(0).setColor("2563EB");
Files: service/WordDocumentService.java.