Skip to content

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.

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 via Hyphenation(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).

Feature PDF 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)
  • 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.