Feature support matrix
This page is the single source of truth for per-format capabilities. It mirrors the repository’s ROADMAP.md and is updated whenever a renderer gains or changes a capability.
Composition features
Section titled “Composition features”Available in the document model and all renderers unless noted:
- Right-to-left and bidirectional text: the Unicode bidirectional algorithm resolves each paragraph, with the base direction settable via
ParagraphStyle.Direction(explicit LRE/RLE/LRO/RLO/PDF and isolate controls are ignored) - Paragraphs with styled text runs, hyperlinks, and block images, with measured word wrapping - whitespace, soft hyphens (
\u00AD), CJK boundaries with kinsoku, and opt-in pattern hyphenation viaHyphenation(language)(de, en, es, fr, it, nl, pt embedded) - and hard breaks via\n - Tables: fixed/relative columns, column and row spans, repeating headers and footers, rich cell content (mixed runs, links, images via the
Cell(p => …)overload), and nested tables in cells (Cell(inner => …), any depth) - Side-by-side rows with relative and fixed items
- Ordered and unordered lists with nesting, number formats (decimal, alpha, roman), start values, custom bullets, and configurable indent
- Images with sizing control (fixed width/height, contain-in-box,
ImageFit) and horizontal alignment (per-format restrictions below) - Horizontal lines and explicit page breaks
- Header and footer bands with text runs, rows, tables, images, and lines - plus a different first page (
FirstPageHeader/FirstPageFooter) - Page-number fields in headers/footers and body content (paragraphs, cells, lists, rows):
PageNumber(),TotalPages(),RenderDate(),PageXofY()(per-format behavior below) - Watermarks: rotated text or a centered image behind every page’s content (
Watermark(w => …); XLSX ignores them) - Footnotes: a superscript marker plus a note at the page foot, numbered continuously through the document (
Footnote("…"); endnotes where the format has no pages) - Page backgrounds: a solid color, a linear gradient, or an image painted edge-to-edge behind every page (
PageBackground(b => …), per section overridable) - Document metadata
- Custom font registration
Styling: TextStyle (size, weight on the CSS scale, italic, underline, strikethrough, super/subscript, letter spacing, color, alignment, family) with inheritance, ParagraphStyle (spacing before/after, line spacing, indentation incl. first line, background) with a document-wide default, CellStyle (padding, per-side borders with solid/dashed/dotted styles, background, alignments), PageBackground (solid color, linear gradient, or image, document-wide or per section), the Material color palette, page size presets with landscape, margins, and a configurable minimum table row height (MinRowHeight).
Per-format support
Section titled “Per-format support”| Feature | DOCX | XLSX | HTML | |
|---|---|---|---|---|
| Pagination with repeating table headers | ✅ footers too | header only | - | ✅ <thead> + <tfoot> repeat in print |
| Font embedding (subsetted, full Unicode) | ✅ | name only | name only | name only |
| Images (JPEG, PNG, GIF, BMP, TIFF, WebP, TGA, PBM, QOI - non-JPEG/PNG converted to PNG at compose time) | ✅ alpha via soft mask | ✅ inline drawings | ✅ anchored drawings (oneCellAnchor) |
✅ base64 data: URIs |
| SVG (via the optional Papyra.Svg package) | ✅ true vectors; unsupported features rasterized at 3× | ✅ native svgBlip + PNG fallback |
✅ native svgBlip + PNG fallback |
✅ original SVG as data: URI |
| Hyperlinks | ✅ | ✅ | ✅ | ✅ <a href>, script schemes neutralized |
| Metadata | ✅ XMP + Info | ✅ | ✅ | <title> + author/description meta |
| PDF/A-2b / 3b / 4 | ✅ veraPDF-verified | n/a | n/a | n/a |
| File attachments / Factur-X e-invoicing | ✅ with PDF/A-3 or PDF 2.0 (Factur-X: PDF/A-3 only) | - | - | - |
| Encryption (AES-256 passwords + permissions) | ✅ with Pdf20 |
- | - | - |
| Alpha colors | ✅ true transparency | blended to white | ✅ ARGB | ✅ native rgba() |
| Page breaks | ✅ | ✅ | ignored (no pages) | ✅ break-after: page in print |
JUSTIFY alignment |
✅ | ✅ | ✅ | ✅ |
| Page numbers / dynamic fields (bands + body) | ✅ bands per page, body via bounded two-pass | ✅ native PAGE/NUMPAGES fields anywhere |
bands → print header/footer (&P/&N); body page fields dropped, render date literal |
render date only - no page count in a reflowable document |
| Rich cell content (runs, links, images) | ✅ | ✅ w:hyperlink + inline drawings in w:tc |
one style per cell, first link wins, images anchored | ✅ full runs, links, images |
| Rich headers/footers + first page | ✅ per-page bands | ✅ native parts + w:titlePg |
grid rows / print header with differentFirst |
once per section flow, first-page variant wins |
| Paragraph layout (spacing, line spacing, indent, background) | ✅ literal geometry | ✅ native w:spacing/w:ind/w:shd |
fill + native indent only | ✅ native CSS |
| Extended text styles (strike, sub/super, letter spacing, weights) | ✅ weights via per-weight fonts | ✅ native rPr (bold flag for weights) | strike + sub/super whole-cell, no letter spacing | ✅ incl. true numeric font weights |
| Lists (nesting, formats, start, indent) | ✅ literal markers, splits between items | ✅ native multi-level numbering incl. bands | marker + content cells, one column per level | ✅ native <ul>/<ol>, per-sub-list formats |
| Per-side cell borders | ✅ per-edge strokes | ✅ native w:tcBorders per side |
per-side thin/medium/thick, merged ranges trimmed to perimeter | ✅ per-side, collapsed edges |
Dashed/dotted border and line styles (LineStyle) |
✅ dash-pattern strokes | ✅ native dashed/dotted border values |
dashed/mediumDashed/dotted (single style axis, lossy for width) |
✅ CSS border-style |
| Watermarks (text / image) | ✅ behind content, true opacity | ✅ VML shape in headers (washout for images) | ignored (no pages) | rotated overlay, once per section |
| Page backgrounds (color / gradient / image) | ✅ full bleed, native axial shading, PDF/A-clean | ✅ full-page VML rect in headers (not Word’s Page Color) | sheet fill; gradient flattened, image ignored | ✅ native CSS incl. print-color-adjust |
Partial-width aligned lines (Line(width, alignment)) |
✅ exact | ✅ indented paragraph border | bottom border across overlapped columns | ✅ <hr> with width + auto margins |
Keep-together / keep-with-next (KeepTogether(), KeepWithNext()) |
✅ exact placement | ✅ native keepNext/keepLines/cantSplit (whole-table keep approximated) |
ignored (no pages) | ✅ break-inside/break-after: avoid |
| Headings and table of contents | ✅ bookmark outline + real page numbers, clickable | ✅ w:outlineLvl + bookmarks + native TOC field |
ignored (no pages) | ✅ <h1>–<h6> + anchor nav (no page numbers) |
Footnotes (Footnote(…)) |
✅ at the foot of the marker’s page, continuous numbering | ✅ native w:footnote part (Word paginates, numbers and splits) |
trailing note rows (no pages) | ✅ endnotes per section with ↩ back-links |
| Sections (per-section page size, orientation, margins, bands) | ✅ per-page geometry, continuous numbering | ✅ native w:sectPr per section incl. w:orient |
one worksheet per section | one container + named @page each |
| Nested tables in cells | ✅ exact geometry, atomic host rows | ✅ native w:tbl in w:tc |
flattened into the worksheet grid | ✅ native <table> in <td> |
Hyphenation (Hyphenation(lang)) + CJK breaking |
✅ pattern breaks drawn exactly, kinsoku | w:autoHyphenation + w:lang (Word breaks) |
ignored (Excel reflows) | lang + hyphens: auto (browser breaks) |
| Shaping: kerning and ligatures | ✅ applied per line, emitted as glyph displacements | the reader shapes | the reader shapes | the browser shapes |
Right-to-left and bidirectional text (ParagraphStyle.Direction) |
✅ bidi resolved and reordered per line; Arabic needs a registered font | ✅ native w:bidi (Word resolves) |
✅ Excel reading order | ✅ dir attribute (browser resolves) |
Not supported yet (any format)
Section titled “Not supported yet (any format)”- Radial gradients (native page backgrounds take a linear ramp only; SVG backgrounds via Papyra.Svg can carry radial gradients)
What’s still open lives on the roadmap; the practical implications of shipped gaps are summarized in known limitations.
© 2026 Stefan Nikolei. Payments are processed by Paddle.com as merchant of record.