← All Documentation
Changelog
All notable changes to this project are documented here. The format follows Keep a Changelog and this project adheres to Semantic Versioning.
1.3.0 - 2026-05-19
Added
- AES-128 PDF Encryption using the PDF Standard Security Handler.
EncryptionOptionswithUserPassword,OwnerPassword, andPermissions.PdfPermissionsflags forPrint,CopyText,ModifyContents,ModifyAnnotations,FillForms,ExtractForAccessibility,AssembleDocument,PrintLowResolution,All, andNone.- Per-object AES-128 CBC encryption of content streams and image XObjects.
- Encrypted documents are emitted as PDF 1.6, the minimum version required for AES encryption.
- Encryption tests covering password combinations, permission flags, multi-page documents, metadata, null guards, and output-size sanity.
Fixed
- Encrypted PDFs now write the random
/IDarray to the trailer so viewers can reproduce the file encryption key. - Removed invalid
/Filter /Cryptentries from content streams and JPEG image dictionaries. - AES encryption now uses the correct padding behavior for decrypted content.
- Sample output folders are created automatically before sample PDFs are written.
- Encryption showcase badges use WinAnsi-safe ASCII symbols.
1.2.3
Added
- Vector Graphics / Canvas API via
container.Canvas(height, draw). VectorCanvasprimitives for lines, rectangles, rounded rectangles, circles, ellipses, arbitrary Bezier paths, polygons, and grids.PathDescriptorhelpers forMoveTo,LineTo,CurveTo,Close,Rect,Ellipse,Circle,Polyline,Polygon,Fill,Stroke, and even-odd fill.- Vector graphics sample demonstrating primitives, custom paths, charts, progress bars, callouts, and icon-grid patterns.
- Unicode and WinAnsiEncoding showcase sample covering Windows-1252 specials, Latin-1 characters, full byte-to-glyph reference grids, font comparison, and glyph metrics.
- Documentation guides for vector graphics and Unicode / character encoding.
Fixed
- Several language sample sentences now avoid characters outside WinAnsiEncoding so output PDFs do not show replacement
?glyphs. - Win-1252 showcase tables now use proportional column definitions to avoid page overflow.
1.2.2 - 2026-05-04
Added
- Table of Contents generation —
container.TableOfContents()creates a TOC page populated with headings collected from.H1()–.H6(), with hierarchical numbering (e.g. 1, 1.1, 1.1.1) and clickable internal links. - Internal links (GoTo) —
container.InternalLink(pageNumber, top?)creates intra-document navigation that preserves current zoom level and scrolls to the target heading. - Section headings —
.H1()through.H6()methods with sensible default styles (size + weight), each returningTextDescriptorfor further customisation.
Fixed
- Internal link zoom issue —
/FitHreplaced with/XYZso clicking TOC entries no longer resets zoom. - Page number display in TOC now excludes TOC page count (TOC treated as page zero), while links still point to correct physical pages.
HeadingRecorderpropagation throughDrawingContext.Atfixed so TOC entries are correctly collected.
1.2.1 - 2026-05-03
Documentation
- Corrected all
GeneratePdf()→PublishPdf()method references throughout README and all documentation files - Fixed
Color.Bluehex values: Darken2 (#1976D2), added missing Darken3 (#1565C0) and Darken4 (#0D47A1) - Added
PageBreak()toColumnDescriptorAPI table in layout guide - Documented
HeaderOnFirstPageOnly()page method for first-page-only headers - Clarified
RelativeItem()default weight = 1 in row-and-column layout guide - Added
FontFamily(string)toTextDescriptormethods table in text-and-spans guide
1.2.0 - 2025-07-14
Added
Underline()style method onTextDescriptorandSpanDescriptor. Draws an underline beneath the text. Can be combined withStrikethrough().LineHeight(double)style method onTextDescriptor. Sets a line-height multiplier (e.g.1.0= tight,1.4= default,2.0= double-spaced). Also accepted byDefaultTextStylefor page-wide control.TextStyle.LineHeightMultiplierproperty exposed for custom render logic.RoundedBorder(radius, lineWidth, hexColor)decorator — draws a rounded-corner stroke border around child content. Corner radius is automatically clamped to half the shorter dimension.RoundedBox(radius, fillHexColor, borderHexColor, lineWidth)decorator — fills the area withfillHexColorand draws a rounded-corner border in one call. Equivalent toBackground + RoundedBorderbut rendered as a single path.BorderTop(lineWidth, hexColor),BorderBottom,BorderLeft,BorderRightper-edge border decorators. Each side is independently configurable with its own width and colour. ThehexColorparameter defaults to"#000000".PageBreak()container extension — inserts an explicit page-break marker inside aColumn. Silently skipped when it falls at the very start of a page.Hyperlink(url)container extension — wraps child content in a clickable PDF URI annotation (/Annotswith/URIaction). Clicking the area in a conforming PDF viewer navigates to the given URL.HighPriorityFeatureTests.cs— 20 new tests covering all five features above (underline, hyperlink, per-edge borders, line height, and their combinations).RoundedBorderTests.cs— dedicated tests forRoundedBorderandRoundedBoxgeometry, clamping behaviour, and validation.PageBreakTests.cs— tests for explicit page-break positioning.HeaderFirstPageOnlyTests.cs— tests verifying that the header slot can be conditionally rendered only on the first page usingShowIf.
Fixed
- Breaking (behaviour):
TextDescriptor.Span().Bold()/.Italic()/.Strikethrough()etc. previously mutated the whole block'sSpanStyleinstead of the individual span's style. Now correctly isolated.
Changed
- Folder
Fluentrenamed toCore(TerraPDF.Corenamespace). - Folder
Infrastructurerenamed toInfra(TerraPDF.Infranamespace).
1.1.0 - 2025-06-01
Added
Margin,MarginVertical,MarginHorizontal,MarginTop,MarginBottom,MarginLeft,MarginRightdecorator methods with fullUnitoverloads. Margin is outer spacing — the margin region stays transparent, background and border start after the gap.SpanDescriptor— per-span fluent builder returned byTextDescriptor.Span(),CurrentPageNumber(), andTotalPages(). Style methods chained after.Span(...)now apply only to that span, not the wholeTextBlock.- Complete documentation suite under
docs/:getting-started.md,text-and-spans.md,layout.md,decorators.md,images.md,colors.md,page-sizes-and-units.md,components-and-templates.md,row-and-column-layout.md. CHANGELOG.md,CONTRIBUTING.md,SECURITY.md.- Input validation (using
ArgumentNullException.ThrowIfNull,ArgumentException.ThrowIfNullOrWhiteSpace,ArgumentOutOfRangeException.ThrowIfNegative/ThrowIfNegativeOrZero) on every public API entry point. - 62 new tests across
ValidationTestsandBehaviourTests(92 total).
Fixed
- Breaking (behaviour):
TextDescriptor.Span().Bold()/.Italic()/.Strikethrough()etc. previously mutated the whole block'sSpanStyleinstead of the individual span's style. Now correctly isolated.
Changed
- Folder
Fluentrenamed toCore(TerraPDF.Corenamespace). - Folder
Infrastructurerenamed toInfra(TerraPDF.Infranamespace).
1.0.0 - 2025-01-01
Added
- Initial release.
- PDF 1.7 generation with zero native dependencies.
- Text styling: bold, italic, bold-italic, strikethrough, underline, font size, colour.
- Multi-span text blocks with mixed styles.
Column(vertical stacking) andRow(horizontal layout) withRelativeItem,AutoItem, andConstantItemsizing.Tablewith relative and constant columns,HeaderRow(repeats on continuation pages), alternating-row support.Paddingwith all side variants andUnitoverloads.Background,Border,Alignment(horizontal + vertical),ShowIf.- Horizontal and vertical rule lines.
- PNG and JPEG image embedding.
IComponentreusable content blocks.IDocumentreusable document templates.- Headers, footers, page numbers (
CurrentPageNumber,TotalPages). - Multi-page documents with automatic table pagination.
- Full Material Design colour palette (
Color.*). - Standard page sizes including ISO A-series, Letter, Legal, Tabloid,
Executive, and
Landscape()helper. Unitsystem: Point, Millimetre, Centimetre, Inch.- Targets .NET 8 and .NET 9.
- CI workflow (GitHub Actions): build, test, coverage.
- Publish workflow (GitHub Actions): NuGet + symbols on release tag.