NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
NuGet · #1247 most downloaded on NuGet
QuestPDF is a modern PDF generation library for C# and .NET. Create invoices, reports, and data exports — a code-first alternative to HTML-to-PDF conversion. Merge and edit documents, generate PDF/A and accessible PDF/UA files, embed ZUGFeRD and Factur-X invoice XML. Source-available with a free Community license.
Last release 14 days ago
25 Sep 2026
Ships fairly regularly
a new release about every 2 weeks
Rarely documented
notes for 12 of the last 60 stable releases
8 versions withdrawn
withdrawn after publishing
127 years old
205 releases · first in 1900
Fixed an issue where garbage collection could corrupt PDF tag attributes during concurrent PDF generation.
DocumentOperation API where DocumentAttachmentRelationship.Supplement was incorrectly mapped to /Alternative.Settings.ThrowOnMissingFontFamilies, Settings.ThrowOnMissingTextGlyphs, and Settings.UseSystemFonts.QuestPDF 2026.9.0 improves font management to make document rendering predictable across development machines, CI, containers, and cloud environments.
QuestPDF 2026.9.0 improves font management to make document rendering predictable across development machines, CI, containers, and cloud environments. System fonts are now excluded by default, and font availability and glyph coverage are validated during document generation, so missing-font problems surface before a PDF reaches its recipient.
The release also simplifies font registration: FontManager gains methods for loading fonts from files, streams, binary data, embedded resources, and directories, reading family names and attributes directly from the font files. Family matching is now case-insensitive, and GetRegisteredFonts() and GetSystemFonts() list the available typefaces. SVG rendering gains support for registered fonts and font-family fallback lists, falls back to Lato instead of dropping text when no font matches, and fixes several text positioning issues. Layout errors now include the likely location of the problem by default.
BREAKING CHANGES
Renamed APIs remain available under their previous names with obsolete warnings.
Full release notes, upgrade guide, and code samples: https://github.com/QuestPDF/QuestPDF/releases/tag/2026.9.0
One column per quarter.
QuestPDF 2026.9.0 improves font management to make document rendering more predictable across development machines, CI, containers, and cloud environments.
Fonts installed on the operating system vary between machines. A document that looks correct during development may use different fallback fonts, display placeholder glyphs, or lose text after deployment. To help catch these problems before a PDF reaches its recipient, QuestPDF now excludes system fonts by default and validates font availability and glyph coverage during document generation.
Deploy the required font files with your application and reference them by the family names stored in those files. Fonts in the application directory are registered automatically; you can also register them explicitly through FontManager. Use FontManager.GetRegisteredFonts() to inspect the available family names.
Please compare previous settings with the new defaults:
// previous behavior:
QuestPDF.Settings.UseSystemFonts = true;
QuestPDF.Settings.ThrowOnMissingFontFamilies = false;
QuestPDF.Settings.ThrowOnMissingTextGlyphs = false;
QuestPDF.Settings.EnableDetailedLayoutErrors = false;
// current behavior:
QuestPDF.Settings.UseSystemFonts = false;
QuestPDF.Settings.ThrowOnMissingFontFamilies = true;
QuestPDF.Settings.ThrowOnMissingTextGlyphs = true;
QuestPDF.Settings.EnableDetailedLayoutErrors = true;Also review the deployment and API changes below. Renamed APIs remain available under their previous names, marked as obsolete with compiler warnings.
QuestPDF includes the bundled Lato font, which covers Latin, Greek, and Cyrillic scripts. For other scripts, such as Chinese, Japanese, Korean, Arabic, Hebrew, Thai, or emoji, we recommend additionally deploying the free, open-source Google Noto font family, registering it with FontManager, and configuring it as a font fallback in the default text style of the document.
// at application startup
FontManager.RegisterFontsFromDirectory("Fonts/Noto");
// in the document
Document.Create(document =>
{
document.Page(page =>
{
page.DefaultTextStyle(style => style.FontFamily("Lato", "Noto Sans", "Noto Sans CJK SC", "Noto Emoji"));
});
});System fonts are no longer used by default. Settings.UseEnvironmentFonts has been renamed to Settings.UseSystemFonts and is now disabled by default. QuestPDF uses its bundled Lato fonts, fonts discovered through Settings.FontDiscoveryPath, and fonts registered through FontManager.
Unavailable font families now stop document generation. The new Settings.ThrowOnMissingFontFamilies flag is enabled by default. When document text references an unavailable font family, QuestPDF throws a DocumentDrawingException listing the missing families, registered fonts, and suggested solutions.
Missing text glyphs now stop document generation. Settings.CheckIfAllTextGlyphsAreAvailable has been renamed to Settings.ThrowOnMissingTextGlyphs and is now enabled by default, rather than only when a debugger is attached. If no available font can render a glyph, generation stops with an exception identifying the missing glyphs and the fonts involved.
The bundled Lato fonts are now distributed as a single compressed archive. The LatoFont folder has been replaced with QuestPDF.Fonts.Lato.br on .NET 5 and newer, and QuestPDF.Fonts.Lato.gz on .NET Standard 2.0 / .NET Framework. This reduces the library’s disk footprint by approximately 40%. Standard build and publish operations require no changes. Deployment scripts that explicitly copy the LatoFont folder must copy the archive instead.
Simplified font registration with FontManager.RegisterFontFromFile, RegisterFontFromBinaryData, RegisterFontFromStream, RegisterFontFromEmbeddedResource, and RegisterFontsFromDirectory. Font family names and attributes are read directly from the font files.
Font family matching is now case-insensitive: FontFamily("lato") and FontFamily("LATO") both select Lato. This applies to registered fonts, system fonts, and SVG text.
Added FontManager.GetRegisteredFonts() and FontManager.GetSystemFonts(). Both return FontInfo records describing the available typefaces, including family name, PostScript name, weight, and flags indicating whether a font is italic or variable. Use these methods to identify the family names accepted by TextStyle.FontFamily.
Fonts are now loaded when the first document is generated, rather than during type initialization. Configure font-related settings at application startup, before generating any documents.
Automatic font discovery now skips font files that cannot be loaded.
SVG text can now use fonts registered through FontManager. System fonts are available only when Settings.UseSystemFonts is enabled.
Improved font-family parsing to support quoted and unquoted names and comma-separated fallback lists, such as font-family="'Open Sans', Lato". The first available family is selected. Previously, only the first entry was considered, and it required an exact match.
SVG text now falls back to Lato when none of the requested font families is available or no font-family is specified. This prevents text from disappearing because a font family is unavailable or unspecified.
Added support for the dominant-baseline attribute on text elements.
Fixed handling of the vertical offset specified by dy on tspan elements.
Fixed glyph positioning for text aligned using the text-anchor attribute.
Added basic support for the em and ex length units.
Changed the default font size for text without a font-size attribute from 24px to 16px, matching web browsers.
Fixed a layout failure when rendering SVG images with percentage dimensions and no viewBox.
Deprecated FontManager.RegisterFontWithCustomName. Use the font registration methods listed above and reference fonts by the family names stored in their files. Family names are matched case-insensitively.
Deprecated QuestPDF.Helpers.Fonts. Its constants reference fonts that may not be available in the target environment. Pass the family name of a deployed or registered font as a string instead.
Renamed SemanticHeader1–SemanticHeader6 to SemanticHeading1–SemanticHeading6, matching PDF/UA terminology.
Renamed Settings.EnableDebugging to Settings.EnableDetailedLayoutErrors and enabled it by default, rather than only when a debugger is attached. This setting has no performance cost for successfully rendered documents. When a layout error occurs, the DocumentLayoutException includes the likely location of the problem and relevant layout measurements. Consider disabling this setting if logged exception messages must not contain fragments of document content.
Image and font files loaded from disk are no longer memory-mapped. These files are no longer kept locked while the application runs, simplifying updates and deployments.
Removed startup Trace warnings about font and debugging configuration.
Fixed incorrect rendering of soft hyphens.
Companion App: Increased the HTTP request timeout from 5 to 10 seconds to improve reliability with large documents.
Breaking change: XPS generation has been removed. The format was supported only on Windows, had several rendering issues that could not be reliably re…
This release is dedicated to performance, parallelism, and use of available resources. Documents render faster, allocate a fraction of the memory they used to, and scale across all available CPU cores. No code changes are required — existing documents benefit simply by upgrading the package.
The numbers below were measured on a MacBook Pro M5 (18-core CPU), using the invoice document from the Getting Started tutorial, across various levels of parallelism, over a sample of 5,000 documents.
Other improvements:
Breaking change: XPS generation has been removed. The format was supported only on Windows, had several rendering issues that could not be reliably resolved, and had negligible adoption. The GenerateXps and GenerateXpsAndShow methods are still present, but calling them now results in a compilation error, and code compiled against an earlier version throws an exception at runtime. Please use PDF generation instead.
Breaking change: The Rotate API now rotates elements around their center instead of the top-left corner. Center-origin rotation is the expected behavi…
Fixed a rare Windows x64 concurrency issue where generated PDF documents appeared correct in viewers, but selected and copied text was corrupted.
/ActualText tag. This improves text selection, copying, extraction, and screen-reader accessibility. Ligatures remain disabled by default.AllowModification permission in DocumentOperations when encrypting PDF documents with 128-bit or 256-bit keys.DocumentOperations API.PDF generation is now significantly faster. The Skia native dependency has been recompiled with speed-oriented optimizations (favoring performance ove
PDF generation is now significantly faster. The Skia native dependency has been recompiled with speed-oriented optimizations (favoring performance over binary size) and with SIMD instructions enabled.
The impact depends on document content and platform. For example, generating image-heavy documents that require image rescaling can be several times faster on Windows x64.
Note: this change slightly increases the size of the native dependency.
We have also built a solid foundation for measuring library performance going forward. A new GitHub Actions workflow benchmarks QuestPDF across all supported operating systems, processor architectures, and .NET releases.
This infrastructure helps us ensure that performance remains stable and consistent across all platforms, and allows us to detect regressions early — before they ever reach a release.
Updated licensing terms and conditions to version 3.0, including the removal of the developer seat limit for all paid licenses (details: https://www.q
Updated the Skia native dependency to M150.
Substantially revised the QuestPDF legal documents to better support enterprise procurement and compliance requirements and to define usage terms more
TranslateX / TranslateY methods to OffsetX / OffsetY to improve discoverability.href attribute instead of xlink:href.#RGBA and #RRGGBBAA color formats.transparent named color.Fixed a bug where Table elements with RowSpan could render incorrectly or break when spanning across pages.
Fixed a bug where using Page.MinSize() or Page.MaxSize() could produce unexpected results
Fixed visual regression when rendering complex borders
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →