Home → How-To → Publish a MIL-STD-40051 PDF
Assemble a Publication Module from your work packages and publish to PDF. Cover page from project metadata, TOC, change bars against a baseline, and your choice of backend (WeasyPrint or XSL-FO).
The Builder shows every WP in the project plus the current PM structure. Drag WPs into chapters, drop chapters into the tree, reorder as needed. Sub-entries follow their parent when moved.
If the source TOC was preserved on IADS import, Update from TOC rebuilds the PM structure to match the archive's original layout. Useful for round-trip parity.
Two PDF backends ship in-box. Both consume the same PM + WPs; they differ in rendering fidelity and how much you can push the layout.
Two layers: engine binaries are registered once tenant-wide in Admin → Formatters & Tools; each project then picks its engine in Project Settings → PDF Engine. The XSL-FO fallback chain runs Antenna House → RenderX XEP → ironmarkpdf → Apache FOP — the highest-preference engine that's registered wins, with FOP as the guaranteed floor.
From Publication Builder, click Publish. Modal picks the output (PDF, IETP, etc.), an optional stylesheet override, and change-bar options. Click Publish; the job runs in-process or via Celery if configured.
Publish jobs write to outputs/publish/<job_id>/ and stream the PDF for download. Jobs stay in the list under Deliverables so you can re-download or promote to a Delivery revision.
Cover page populates from Project Settings: title, TM number, CAGE code, contract number, classification, program type, pub date. Toggles for showing CAGE / NSN live in project settings — hide or show per project.
TOC generation is driven by toc_depth (default 2 for chapter + section). WPs are gathered from the PM's dmref entries. Page numbers land through the publish pipeline (WeasyPrint uses generated content; XSL-FO uses fo:page-number-citation).
Change bars mark deltas between two versions of a WP. Enable in Project Settings; pick auto-baseline (last approved version) or a specific baseline version. The change-bar injector runs before the publish pipeline sees the XML, so both backends produce marked output.
break-before="odd-page"; ironmarkpdf does too. If a specific WP breaks incorrectly, check the WP's XSL template rather than the pipeline.