355 Generate Word Document

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.

Letter

Word vs. PDF

Word (.docx)The receiver can still edit it. Page numbers are fields - Word calculates them when it lays out the pages.
PDFFixed layout, prints the same everywhere, can be signed (365). Page numbers are drawn by our code.
UnitsWord 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.