What JetsonPDF actually supports, grouped by area. Everything below ships in the current source.
Pick your level. JetsonPDF ships three layered authoring APIs:
Writer — PdfDocument + PdfPage.DrawText/DrawImage/DrawPath. Direct control of every byte. Good for templated forms, fixed layouts, programmatic content.
Fluent — Document.Create(d => d.Page(...)). QuestPDF-style layout DSL: rows, columns, tables, headers/footers, page numbers. Good for invoices, dashboards, anything paginating.
Flow — FlowDocument with mutable Section/Paragraph/Table tree. Word-like retained-mode DOM with named styles, footnotes, hyphenation, TOC. Good for reports, books, long-form prose.
Writer
A drawing-model API. Build a PdfDocument, append PdfPages, paint onto each page, save the bytes.
Document model — PdfDocument.AddPage(PageSize), doc.Save(path | Stream), info dictionary, viewer prefs, page layout / mode, open action, named destinations, outlines, page labels.
Fonts — the standard 14 (FontFamily.Helvetica et al.); EmbeddedFontFace.FromFile for TrueType / OpenType with TTF subsetting and CFF1 subset on write; PdfType3Font for procedural glyphs with auto /ToUnicode.
Vector graphics — DrawRectangle, DrawLine, DrawPath with full path operators, line cap/join, dash patterns, even-odd fill, transforms, clipping.
Colour spaces — DeviceGray / RGB / CMYK, plus CalGray, CalRGB, Lab, Separation, DeviceN, NChannel, ICC profiles. Real CIE math, not pass-through stubs.
Per-page — ReadPdfPage with content items (text, vector paths, images, inline images, form-XObject invocations) and annotations.
Filters — FlateDecode (with PNG predictors 10-15), DCTDecode, LZWDecode, ASCII85Decode, ASCIIHexDecode, RunLengthDecode, CCITTFaxDecode (G3 1D, G3 2D mixed mode, G4), JBIG2Decode (MQ arithmetic, all four templates with AT pixels and TPGD; symbol dicts; text regions; halftones; refinement; Huffman; MMR), JPXDecode (passthrough with JP2 ihdr).
Fonts — standard 14, embedded TrueType, Type 0 / CID, Type 1 (with /Differences via Adobe Glyph List), Type 3 (now prefers /ToUnicode over AGL).
Colour spaces — everything the writer can produce, parsed back: device, calibrated, indexed, separation, DeviceN, NChannel, Lab, ICC, pattern.
Shadings — Type 1, 2, 3 (axial, radial, function-based) and mesh decoding for types 4-7 to triangle soup / patch lists.
Structure tree — ReadStructureTree, ReadStructureElement, ReadStructureAttributes, OBJR child refs.
Layers, signatures, conformance — ReadOptionalContent, ReadSignature, ReadDocumentSecurityStore, ReadVri, ReadOutputIntent, plus PDF/A and PDF/UA flag detection from XMP.
Fluent layout API
The JetsonPDF.Fluent namespace exposes a QuestPDF-style fluent DSL on top of the Writer. Write Document.Create(...), compose Pages out of Header/Footer/Background/Foreground/Content slots, and let the engine paginate.
Slot model — p.Header(), p.Footer(), p.Background(), p.Foreground(), p.Content(). Header / footer / background / foreground render on every paginated page; content overflows.
Two-pass renderer — total page count is resolved after layout, so {TotalPages} and IDynamicComponent.Compose see the final number without a second layout pass.
Navigation — .Section("anchor") registers a named destination; .SectionLink("anchor") emits an internal link; .Link("https://...") emits a URI link.
Form widgets — .AsTextField(name), .AsCheckBox, .AsComboBox(name, options), .AsListBox, .AsPushButton(name, caption). Acrobat draws the chrome at the arranged bounds.
The JetsonPDF.Flow namespace is a Word-like retained-mode DOM. Build a FlowDocument tree of Section → Paragraph / Table / BlockImage / PageBreak, mutate it freely, then call Save. The renderer paginates over the Fluent engine.
Sections — FlowDocument.AddSection with per-section PageSize, PageMargins, StartsOnNewPage, ColumnCount / ColumnGap, FootnoteAreaHeight, and Header / Footer / Body blocks.
Paragraphs — built-in ParagraphStyle.Heading1..3 / Quote / Caption, plus user-defined NamedStyle with a BasedOn chain. Alignment, line spacing, indents, SpaceBefore/SpaceAfter, KeepWithNext, KeepLinesTogether, PageBreakBefore.
Inline runs — p => p.AddText("...").Bold().Italic().Underline().Strikethrough(); hyperlinks via .Link(url); track changes via .AsInsertion(author) / .AsDeletion(author); review markers via .Comment(author, text).
Lists — ListMarker with bullets / numbers / lower-roman / upper-roman / letter at level; hanging indent.
Tables — Table with relative Columns weights, Header/Body rows, RepeatHeader, CellBorderWidth, CellPadding; cells take a string or a Paragraph.
Drop caps + floating images — DropCap { LineSpan = 3 } at the start of a paragraph; FloatImage = new AnchoredImage(image, w, h) { Side = AnchorSide.Right } for wrapped images.
Declare it, then verify it. JetsonPDF separates "the file says it's PDF/A" from "the file is actually PDF/A," and gives you tooling for both.
PDF 2.0 baseline — PDF 2.0 header, UseObjectStreams flag, xref streams, modern security handlers.
Tagged PDF — doc.MarkAsTagged, nested page.BeginTag("H1") / BeginTag("P"), role map & class map, /Lang at document and element level, /Alt, /E, /ID, /ActualText (writer + reader marked-content stack).
Conformance flags — PdfConformance.PdfA1B / PdfA2B / PdfA3B / PdfUA1 / PdfUA2 emit the right XMP packet, /OutputIntents, and catalog entries (DisplayDocTitle, /Lang).
Validator — PdfConformanceValidator.Validate(doc) returns IReadOnlyList<PdfConformanceIssue>; doc.Validate() shorthand. 7 PDF/A-1b rules + 5 PDF/UA-1 rules, plus the PDF/A-2/3 + PDF/UA-2 variants with prefixed codes (PDFA2x, PDFA3x, PDFUA2x).
Strict mode — doc.ThrowOnConformanceError = true aborts Save with a PdfConformanceException if any error issue is found.
Linearization — PdfLinearizer emits ISO Annex F with linearization dict, two xref tables, and bit-packed Page Offset + Shared Object hint tables.
PKCS#7 signatures — PdfSigner.Sign(byte[], PdfSignatureOptions) for invisible detached signatures with the standard sub-filter adbe.pkcs7.detached; multiple signatures via incremental update.
DocTimeStamp — PdfTimestamper.AddDocumentTimestamp with caller-supplied or default PdfTimestampClient (RFC 3161 over HTTP) emits /Type /DocTimeStamp /SubFilter /ETSI.RFC3161.
DocMDP & FieldMDP — certify documents with permission level (NoChanges / FormFilling / FormFillingAndAnnotations); restrict per-field modifications via PdfFieldMdpRestriction.
DSS / VRI catalog — PdfDss.AddSecurityStore writes the catalog /DSS with cert / CRL / OCSP streams plus per-signature VRI entries — the missing piece for PAdES B-LTA.
WPF integration
The JetsonPDF.Wpf assembly turns JetsonPDF into a first-class WPF citizen.
PDF → XAML — PdfToXamlConverter.Convert(readDoc) emits a StackPanel of Canvas pages with absolute-positioned TextBlock, Image, Path, and Glyphs elements. Drop the result straight into a ContentControl.
XAML → PDF — XamlToPdfConverter.Convert(xaml) (or a Stream overload) parses the XAML, lets WPF Measure/Arrange it, then walks the visual tree to emit a PDF. STA thread required.
No filesystem dependency — the viewer adapter never touches disk; images come in as base64 via the {jetsonpdf:Base64Image} markup extension.
Multi-page authoring — <jetsonpdf:Document> with <jetsonpdf:Document.Pages> and per-page size overrides; {jetsonpdf:PageNumber} and {jetsonpdf:PageCount} markup extensions resolve per page.
AcroForm widgets in XAML — jetsonpdf:Form.FieldName="email" on a TextBox / CheckBox / ComboBox / ListBox / Button turns it into a real PDF widget at the arranged bounds. Form.MaxLength, IsMultiline, IsPassword, Action attrs for tuning.
PaginatedTable — multi-page table with auto-overflow, repeating headers, and jetsonpdf:Pagination.HideOnOverflow for content that should appear only on the lead page.
Round-trip — the PdfAuthoringEditor sample edits XAML on the left and shows a live PDF round-trip preview on the right.